2013-10-31 47 views
6

的構建運行Ubuntu 10.04段錯誤在我的glibc

$ uname -a 
Linux minion 2.6.32-36-generic-pae #79-Ubuntu SMP Tue Nov 8 23:25:26 UTC 2011 i686 GNU/Linux 

下載源,也做了以下內容:

CFLAGS="-O2 -U_FORTIFY_SOURCE -fno-stack-protector" '/home/user/Desktop/eglibc-2.11.1/configure' --prefix='/home/user/Desktop/eglibc_pristinebuild' 
make -j4 
export LD_LIBRARY_PATH=/lib/tls/i686/cmov:/lib:/usr/lib 

這工作:

$ ./elf/ld-linux.so.2 /bin/ls /usr 
bin games include lib lib64 local sbin share src 

這種失敗:

$ ./elf/ld-linux.so.2 /bin/true 
Segmentation fault 

但這個工程:

/lib/ld-linux.so.2 /bin/true 

Falsegrep,並cat和其他一切我已經試過在/bin段錯誤相同的方式。源代碼有問題嗎?我是否編譯不正確?

另外值得注意的是,我爲樹莓派(ARM)下載了正確的版本(稍微更新),編譯它,它沒有段錯誤。

回答

9

這種失敗:

$ ./elf/ld-linux.so.2 /bin/true 
Segmentation fault 

這完全是預期結果。

GLIBC由〜200個獨立文件組成,所有必須與完全匹配(必須來自同一個構建版),因爲它們之間使用未版本化的二進制接口。

當您運行./elf/ld-linux.so.2 /bin/true,您使用的是自己的ld-linux的身材,但系統版本的libc.so.6,這不是來自您的構建。

您可以確認這其實什麼用發生的事情:

LD_DEBUG=files,libs ./elf/ld-linux.so.2 /bin/true 

(這將證明/lib/libc.so.6正在使用)。

您可以通過使用例如

./elf/ld-linux.so.2 --library-path . /bin/true 

將然後使用./libc.so.6

+0

這工作完全,但爲什麼LS工作?它也過度依賴libc,對吧? – user2856949

+0

@ user2856949「爲什麼它能工作?」:'./ libc.so.6'和'。/ elf/ld-linux.so.2'都來自同一個版本(*你的*版本),所以它們工作一起很好。 –

+0

謝謝,但我問爲什麼二進制'/ bin/ls'的作品。 – user2856949