2009-10-13 7 views
8

he construido un programa de ELF prueba utilizando el SDK de LSB (nota que mi pregunta no es específico de LSB):¿Cómo puedo saber qué dependencia de ELF no se cumple?

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

Pero no soy capaz de lanzarlo (sí, ya que aseguran la archivo es en el directorio ...):

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

creo que hay una dependencia ELF que no se cumpla, pero no sé cómo llegar a ella. ¿Hay alguna herramienta similar a ldd para las bibliotecas que se pueda usar para encontrar el enlace que falta?

No creo que se relaciona con la diferencia 2.6.15/2.6.28-15 porque el compilador de LSB está trabajando:

$ 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 

Por si acaso, aquí es la sección dinámica de un ELF .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 

Respuesta

11

Esto se parece a lo que sucede cuando falta el intérprete ELF.

Asegúrese de que exista /lib/ld-lsb.so.2 (o similar; varía según la versión y arquitectura de LSB). ldd y readelf -l podrán mostrar el intérprete ELF que su ejecutable está solicitando.

(lsbcc (o algo en el LSB cadena de herramientas) anula por defecto /lib/ld-linux.so.2 del sistema, probablemente pasando -Wl,--dynamic-linker=/lib/ld-lsb.so.2 para el compilador, por razones creo que son bastante tonto (Glibc siempre ha proporcionado bastante excelente compatibilidad con versiones anteriores aquí), pero hay lo tiene.)

+0

Eso es todo, no tengo el intérprete de LSB (/lib64/ld-lsb-x86-64.so.3) en el sistema. De hecho, no sabía que hay un intérprete específico de LSB que necesito instalar ... Es curioso que los archivos binarios del LSK SDK no sean compatibles con LSB. – math

Cuestiones relacionadas