簡體   English   中英

GCC -nostdlib失敗,未定義對__libc_csu_fini的引用

[英]GCC -nostdlib fails with undefined reference to `__libc_csu_fini'

我為鏈接器提供了以下文件:ld-2.7.so,libc-2.7.so和crt1.o,但編譯失敗。 是否可以鏈接到與默認glibc不同的glibc?

(不可進行靜態編譯或安裝單獨的glibc。)

gcc -Wl,-dynamic-linker,ld-2.7.so,libc-2.7.so,crt1.o -nostdlib program.c

crt1.o: In function `_start':  
(.text+0x12): undefined reference to `__libc_csu_fini'  
crt1.o: In function `_start':  
(.text+0x19): undefined reference to `__libc_csu_init'  
/tmp/user/1000/ccauFlwt.o: In function `findsize':  
program.c:(.text+0x21): undefined reference to `stat'  
/tmp/user/1000/ccauFlwt.o: In function `findtime':  
program.c:(.text+0x4c): undefined reference to `stat'  
collect2: ld returned 1 exit status  

我發現了如何做:

rpath指定提供的庫位於何處。 此文件夾應包含:libc.so.6,libdl.so.2,libgcc_s.so.1以及更多。 使用strace檢查以找出您的二進制文件使用了哪些庫。

ld.so是提供的鏈接器

gcc -Xlinker -rpath = / default / path / to / libraries -Xlinker -I / default / path / to / libraries / ld.so program.c

正如@onemasse所說,您還需要與該版本的libc兼容的頭文件。 雖然在glibc版本之間仍然可以正常工作,但是不能依靠它。

否則,我建議您在啟動新庫之前使用export LD_PRELOAD_PATH到其他libc所在的任何位置。

但是,您真正要做的是在Linux中交叉編譯Linux,但要使用另一個libc。 看一下crosstool

如果要鏈接到系統提供的另一個libc,則還需要使用與該libc版本兼容的頭文件來編譯程序。

另外,我對“ -dynamic-linker”選項不熟悉。 它不在gcc的手冊頁中。 我真的無法弄清楚您要做什么。

也許您應該嘗試使用它,然后從那里開始工作:

gcc -ldl program.c -o program

通常,您不必顯式鏈接“ libc”或“ crt1.o”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM