2013-10-31 5 views
6

Ubuntu 10,04Segfault von ld-linux in meinem Build von 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 

die Quelle heruntergeladen und hat die folgenden:

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 

Dies funktioniert:

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

dies nicht gelingt :

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

Aber das funktioniert:

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

False, grep und cat und alles andere, was ich in /bin segfault auf die gleiche Weise versucht haben. Gibt es ein Problem mit der Quelle? Kompiliere ich es falsch?

Bemerkenswert ist, dass ich die richtige Version (etwas neuer) für die Raspberry Pi (ARM) heruntergeladen, kompiliert, und es hat keine segfaults.

Antwort

9

Dies schlägt fehl:

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

Das ganz Ergebnis erwartet wird.

GLIBC besteht aus ~ 200 separaten Dateien, die alle genau übereinstimmen müssen (müssen aus dem gleichen Build stammen), weil sie nicht versionierte binäre Schnittstellen zwischen ihnen verwenden.

Beim Ausführen ./elf/ld-linux.so.2 /bin/true, können Sie Ihre eigene Version von ld-linux verwenden, aber die System Version von libc.so.6, die nicht von Ihrem Build gekommen.

Sie können bestätigen, dass das ist in der Tat, was geschieht mit:

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

(dies wird beweisen, dass /lib/libc.so.6 verwendet wird).

Sie können dies beheben, indem Sie z.B.

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

die dann ./libc.so.6

+0

verwenden Das funktioniert perfekt, aber warum funktioniert ls? Es hängt auch stark von libc ab, oder? – user2856949

+0

@ user2856949 "Warum funktioniert es?": Sowohl './ libc.so.6' und'./Elf/ld-linux.so.2' stammen vom selben Build (* your * build), also funktionieren sie zusammen gut. –

+0

Danke, aber ich fragte, warum die Binärdatei '/ bin/ls' funktioniert. – user2856949