2014-07-11 22 views
0

我使用gcc從多個c文件生成裝配文件。當我嘗試使用gas來組裝生成的程序集文件時,它會發現這個錯誤,因爲它找到了在多個文件中定義的符號。使用氣體時符號名稱衝突

Error: symbol '.L???' is already defined

望着文檔,.L前綴的文件應該是局部符號的名稱,以便當它發現在不同的文件相同的符號名稱爲什麼氣不抱怨呢?

+1

您能顯示C和/或生成的彙編代碼嗎?具體來說,部件給你帶來麻煩? –

回答

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