[英]Linking a C program directly with ld fails with undefined reference to `__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.