2009-10-13 3 views
8

J'ai construit un programme ELF de test en utilisant le LSB SDK (Notez que ma question n'est pas spécifique au bit de poids faible):Comment puis-je trouver quelle dépendance ELF n'est pas satisfaite?

$ /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 la 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. Existe-t-il un outil similaire à ldd pour les bibliothèques qui peut être utilisé pour trouver le lien manquant?

Je ne pense pas qu'il est lié à la 2.6.15/2.6.28-15 différence 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 d'un .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 

Répondre

11

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 LSB et l'architecture) existe. ldd et readelf -l seront en mesure d'afficher l'interpréteur ELF demandé par votre exécutable.

(lsbcc (ou quelque chose dans le bit de poids faible toolchain) l'emporte sur le défaut /lib/ld-linux.so.2, 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 du système ici), mais vous l'avez.)

+0

Voilà, je n'ai pas l'interpréteur LSB (/lib64/ld-lsb-x86-64.so.3) sur le système. En fait, je ne savais pas qu'il y avait un interpréteur spécifique à LSB à installer ... C'est marrant que les binaires du LSB SDK ne soient pas compatibles LSB. – math

Questions connexes