2009-10-13 7 views
8

ich ein Test ELF Programm mit dem LSB SDK erstellt habe (beachten Sie, dass meine Frage nicht spezifisch LSB):Wie kann ich herausfinden, welche ELF-Abhängigkeit nicht erfüllt ist?

$ /opt/lsb/bin/lsbcc tst.c 
$ ls -l a.out 
-rwxr-xr-x 1 math math 10791 2009-10-13 20:13 a.out 
$ file a.out 
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped 

Aber ich bin nicht in der Lage, es zu starten (ja, ich versichern Ihnen, die Datei ist im Verzeichnis ...):

$ ./a.out 
bash: ./a.out: No such file or directory 

$ uname -a 
Linux math 2.6.28-15-generiC#52-Ubuntu SMP Wed Sep 9 10:48:52 UTC 2009 x86_64 GNU/Linux 

ich denke, es eine ELF-Abhängigkeit, die nicht erfüllen, aber ich weiß nicht, wie es zu finden. Gibt es ein Tool, das ldd für Bibliotheken ähnlich ist und mit dem der fehlende Link gefunden werden kann?

Ich glaube nicht, es auf die Differenz 2.6.15/2.6.28-15 verwendet ist, weil der LSB-Compiler arbeitet:

$ file /opt/lsb/bin/lsbcc 
/opt/lsb/bin/lsbcc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped 

Nur für den Fall, hier ist der ELF dynamische Teil eines .out:

0x0000000000000001 (NEEDED)    Shared library: [libpthread.so.0] 
0x0000000000000001 (NEEDED)    Shared library: [libm.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 
0x000000000000000c (INIT)    0x400428 
0x000000000000000d (FINI)    0x400638 
0x0000000000000004 (HASH)    0x400278 
0x0000000000000005 (STRTAB)    0x400350 
0x0000000000000006 (SYMTAB)    0x4002a8 
0x000000000000000a (STRSZ)    121 (bytes) 
0x000000000000000b (SYMENT)    24 (bytes) 
0x0000000000000015 (DEBUG)    0x0 
0x0000000000000003 (PLTGOT)    0x600fe8 
0x0000000000000002 (PLTRELSZ)   24 (bytes) 
0x0000000000000014 (PLTREL)    RELA 
0x0000000000000017 (JMPREL)    0x400410 
0x0000000000000007 (RELA)    0x4003f8 
0x0000000000000008 (RELASZ)    24 (bytes) 
0x0000000000000009 (RELAENT)   24 (bytes) 
0x000000006ffffffe (VERNEED)   0x4003d8 
0x000000006fffffff (VERNEEDNUM)   1 
0x000000006ffffff0 (VERSYM)    0x4003ca 
0x0000000000000000 (NULL)    0x0 

Antwort

11

Das sieht wie aus, wenn der ELF-Interpreter fehlt.

Stellen Sie sicher, dass /lib/ld-lsb.so.2 (oder ähnlich; variiert je nach LSB-Version und Architektur) vorhanden ist. ldd und readelf -l können den ELF-Interpreter anzeigen, den Ihre ausführbare Datei anfordert.

(lsbcc (oder etwas in der LSB-Toolchain) überschreibt die Standardeinstellung des Systems /lib/ld-linux.so.2, wahrscheinlich von -Wl,--dynamic-linker=/lib/ld-lsb.so.2 an die Compiler vorbei, aus Gründen, ich denke, sind eher albern (Glibc immer ziemlich hervorragende Rückwärtskompatibilität hier) zur Verfügung gestellt hat, aber es Sie haben es.)

+0

Das ist es, ich habe nicht den LSB-Interpreter (/lib64/ld-lsb-x86-64.so.3) auf dem System. Tatsächlich wusste ich nicht, dass es einen LSB-spezifischen Interpreter gibt, den ich installieren muss ... Es ist lustig, dass die Binaries im LSB SDK nicht LSB-fähig sind. – math