【问题标题】:Symbol name conflicts when using gas使用气体时符号名称冲突
【发布时间】:2014-07-11 12:21:57
【问题描述】:

我正在使用 gcc 从多个 c 文件生成汇编文件。当我尝试使用gas来组装生成的程序集文件时,它会吐出这个错误,因为它找到了多个文件中定义的符号。

错误:符号 '.L???'已经定义了

查看文档,.L 前缀文件应该是本地符号名称,那么为什么当气体在不同文件中找到相同的符号名称时会抱怨?

【问题讨论】:

  • 您能展示一下 C 和/或生成的汇编代码吗?具体来说,给您带来麻烦的部分?

标签: c gcc assembly gnu-assembler


【解决方案1】:

我不知道您在编译这些文件时使用了什么程序,但是当我尝试不正确地编译输出列表时遇到了类似的问题。

假设您有两个文件,main.cfoo.c

/* main.c */
#include <stdio.h>
int main() {
    printf("Hello");
    if(5==7);
    else printf("Yes");
}

/* foo.c */
#include <stdio.h>
int foo() {
    printf("Single!");
    if(7==5);
    else printf("Yes");
}

如果您为每个文件单独生成汇编列表,您可以看到...

    .file   "main.c"
    .def    ___main;    .scl    2;  .type   32; .endef
    .section .rdata,"dr"
LC0:
    .ascii "Hello\0"
LC1:
    .ascii "Yes\0"
    .text
    .globl  _main
    .def    _main;  .scl    2;  .type   32; .endef
_main:
....

    .file   "foo.c"
    .section .rdata,"dr"
LC0:
    .ascii "Single!\0"
LC1:
    .ascii "Yes\0"
    .text
    .globl  _foo
    .def    _foo;   .scl    2;  .type   32; .endef
_foo:
....

...C 代码中使用的字符串常量也为每个文件单独编号(LC0LC1 存在于两个文件中,但它们的内容不同)。

现在,如果您尝试将这些清单编译在一起...

as main.s foo.s

你得到你的错误......

foo.s:3: Error: Symbol `LC0` is already defined
foo.s:5: Error: Symbol `LC1` is already defined

解决方案不仅是为每个文件单独生成列表,而且将每个列表编译成单独的目标文件,然后链接它们。

as main.s -o main.o
as foo.s -o foo.o
gcc main.o foo.o

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2018-02-04
    • 2017-10-31
    • 2023-02-10
    • 2018-11-21
    • 2017-09-02
    • 1970-01-01
    相关资源
    最近更新 更多