我正在使用gcc从多个c文件生成程序集文件。当我尝试使用gas来汇编生成的汇编文件时,它会发出此错误,因为它会找到多个文件中定义的符号。
错误:符号'.L ???'已定义
查看文档,.L前缀文件应该是本地符号名称,那么当它在不同文件中找到相同的符号名称时,为什么气体会抱怨呢?
答案 0 :(得分:1)
我不知道在编译这些文件时你使用的是什么程序,但是当我试图不正确地编译输出列表时,我遇到了类似的问题。
我们假设您有两个文件,main.c
和foo.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代码中使用的字符串常量也为每个文件单独编号(LC0
和LC1
都存在于两个文件中,但它们不具有相同的内容)。
现在,如果您尝试将这些列表一起编译......
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