2013-10-31 16 views
6

esecuzione Ubuntu 10,04Segfault da ld-linux nella mia build di 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 

Scaricato l'origine e ha fatto la seguente:

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 

Questo funziona:

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

questo viene a mancare :

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

Ma questo funziona:

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

False, grep e cat e tutto il resto che ho provato in /bin segfault nello stesso modo. C'è un problema con la fonte? Sto compilando in modo errato?

Inoltre, ho notato che ho scaricato la versione corretta (leggermente più recente) per il raspberry pi (ARM), lo ho compilato e non ha segoults.

risposta

9

Questo fallisce:

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

che è interamente atteso risultato.

GLIBC è costituito da ~ 200 file separati, che tutti devono corrispondere esattamente a (devono provenire dalla stessa build), perché utilizzano interfacce binarie non verificate tra di loro.

Quando si esegue ./elf/ld-linux.so.2 /bin/true, si sta utilizzando la propria build di ld-linux, ma il sistema versione di libc.so.6, che non è venuto dal vostro build.

È possibile confermare che questo è in realtà ciò che sta accadendo utilizzando:

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

(questo si dimostrerà che /lib/libc.so.6 viene utilizzato).

È possibile risolvere questo problema utilizzando, ad es.

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

che sarà quindi utilizzare ./libc.so.6

+0

Questo funziona perfettamente, ma perché ls funziona? Anch'essa dipende molto dalla libc, giusto? – user2856949

+0

@ user2856949 "perché funziona?": Entrambi './Libc.so.6' e'./Elf/ld-linux.so.2' provengono dalla stessa build (* your * build), quindi funzionano insieme bene. –

+0

Grazie, ma stavo chiedendo perché il binario '/ bin/ls' funzioni. – user2856949