使用气体时符号名称冲突

时间:2014-07-11 12:21:57

标签: c gcc assembly gas

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

  

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

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

1 个答案:

答案 0 :(得分: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