Frage

Ich habe ein Test -ELF -Programm mit dem LSB SDK (Beachten Sie, dass meine Frage nicht spezifisch für LSB 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 kann es nicht starten (Ja, ich versichere 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 gibt eine Elfenabhängigkeit, die nicht erfüllt ist, aber ich weiß nicht, wie ich sie findet. Gibt es ein Tool ähnlich wie LDD für Bibliotheken, mit dem der fehlende Link gefunden werden kann?

Ich glaube nicht, dass es mit dem Unterschied zwischen 2.6.15 und 2.6.28-15 zusammenhängt, da der LSB-Compiler funktioniert:

$ 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 ist hier der elf dynamische Abschnitt von A.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
War es hilfreich?

Lösung

Dies sieht so aus, als ob der Elf -Dolmetscher fehlt.

Sicherstellen, dass /lib/ld-lsb.so.2 (oder ähnlich; variiert je nach LSB -Version und Architektur) existiert. ldd und readelf -l Kann den ELF -Dolmetscher zeigen, den Ihre ausführbare Datei verlangt.

(lsbcc (oder etwas in der LSB -Toolchain) überschreibt den Standardeinsatz des Systems /lib/ld-linux.so.2, wahrscheinlich durch Pass -Wl,--dynamic-linker=/lib/ld-lsb.so.2 Für den Compiler bin ich aus Gründen ziemlich albern (GLIBC hat hier immer ziemlich hervorragende Rückwärtskompatibilität gewährt), aber da haben Sie es.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top