Question

Je l'ai construit un programme ELF test à l'aide du SDK bit de poids faible ( Notez que ma question n'est pas spécifique à LSB ):

$ /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

Mais je suis incapable de le lancer ( oui, je vous assure le fichier est dans le répertoire ... ):

$ ./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

Je pense qu'il ya une dépendance ELF qui remplit pas, mais je ne sais pas comment le trouver. Y at-il un outil similaire ldd pour les bibliothèques qui peuvent être utilisés pour trouver le chaînon manquant?

Je ne pense pas qu'il est lié à la différence 2.6.15 / 2.6.28-15 parce que le compilateur fonctionne LSB:

$ 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

Juste au cas où, voici la section dynamique ELF de 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
Était-ce utile?

La solution

Cela ressemble à ce qui se passe lorsque l'interpréteur ELF est manquant.

Assurez-vous que /lib/ld-lsb.so.2 (ou similaire, varie selon la version et l'architecture LSB) existe. ldd et readelf -l seront en mesure de montrer l'interpréteur ELF votre exécutable demande.

(lsbcc (ou quelque chose dans le bit de poids faible toolchain) l'emporte sur la /lib/ld-linux.so.2 par défaut du système, probablement en passant -Wl,--dynamic-linker=/lib/ld-lsb.so.2 au compilateur, pour des raisons que je pense sont assez stupides (glibc a toujours fourni assez excellente compatibilité ascendante ici), mais vous avoir.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top