2010-04-28 37 views
6

我想提供共享庫以及我的程序,而不是使用目標系統的版本差異。如何鏈接到不同的libc文件?

ldd說我的程序使用這些共享庫:

linux-gate.so.1 => (0xf7ef0000)**(made by kernel)** 
libc.so.6 => /lib32/libc.so.6 (0xf7d88000)**(libc-2.7.so)** 
/lib/ld-linux.so.2 (0xf7ef1000)**(ld-2.7.so)** 

我已經成功連接ld-xxx.so通過編譯:

gcc -std=c99 -D_POSIX_C_SOURCE=200112L -O2 -m32 -s -Wl,-dynamic-linker,ld-2.7.so myprogram.c 

但我沒有設法成功鏈接libc-xxx.so。我怎樣才能做到這一點 ?

+1

你可能要考慮靜態連接你的程序,如果你只有一個可執行文件。這樣,沒有人會意外丟失你的libc版本,如果他們刪除你的程序,他們不會讓你的libc徘徊。 – nategoose 2010-04-28 17:26:28

+0

相同,但靜態:http://stackoverflow.com/questions/10763394/how-to-build-a-c-program-using-a-custom-version-of-glibc – 2015-06-08 20:14:58

回答

7

我發現瞭如何做到這一點:

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

6

-nodefaultlibs-nostdlib傳遞給gcc會告訴它不會將默認庫作爲參數傳遞給ld。然後,您將能夠明確指定要鏈接的libc。有關這兩個選項的更多詳細信息和注意事項,請參閱gcc(1)手冊頁。

+2

請注意這個帖子是錯誤的。你不需要通過任何2個標誌。 – 2011-04-30 12:46:52

相關問題