2014-04-14 40 views
0

我有一個問題,編譯後我不想使用ld鏈接,但是當我做我得到一個錯誤讓我看看我做什麼:鏈接與ld/gcc不會產生相同的結果(錯誤/成功)

make i386 
gcc -g -c -I. -I/usr/include -o p_test.o.i386 pkcs11test.c 
ld -o p_test.i386 p_test.o.i386 -g -ldl  
ld: p_test.o.i386: référence au symbole non défini «[email protected]@GLIBC_2.0» 
//lib/i386-linux-gnu/libc.so.6: error adding symbols: DSO missing from command line 
make: *** [i386_p_test] Erreur 1 

因此,與LD我得到這個錯誤,但是當我嘗試用gcc

make i386 
gcc -g -c -I. -I/usr/include -o p_test.o.i386 pkcs11test.c 
gcc -o p_test.i386 p_test.o.i386 -g -ldl 

我沒有錯誤,我的可執行

你知不知道我怎樣才能使LD工作與鏈接我的程序?

謝謝!

回答

2

當你開始使用GCC gcc -o p_test.i386 p_test.o.i386 -g -ldl,它實際上增加了很多內部的庫到ld命令。您可以通過向gcc添加-v選項來查看所有參數。 「內部圖書館」之一是glibc本身(-lc)。

例如,這裏GCC verbose mode output explanation我們可以看到它是用來可執行鏈接collect2程序。有添加到運行和幾個CRT的運行對象-lgcc -lgcc_eh -lc -lgcc -lgcc_eh庫聯太:

/usr/lib/gcc-lib/i686/3.3.1/collect2 
--eh-frame-hdr -m elf_i386 -dynamic-linker 
/lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o 
/usr/lib/gcc-lib/i686/3.3.1/crtbegin.o 
-L/usr/lib/gcc-lib/i686/3.3.1 
-L/usr/lib/gcc-lib/i686/3.3.1/../../.. 
    /tmp/ccQynbTm.o # << this is input file. 
-lgcc -lgcc_eh -lc -lgcc -lgcc_eh 
/usr/lib/gcc-lib/i686/3.3.1/crtend.o 
/usr/lib/crtn.o 

PS:我認爲這將是最好不要改變文件擴展名(後綴)。您p_test.o.i386可以被重命名爲p_test.i386.o

相關問題