Pregunta

He construido un programa de ELF prueba utilizando el SDK de LSB ( nota que mi pregunta no es específico de 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

Pero no soy capaz de lanzarlo ( Sí, se lo aseguro el 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. ¿Existe una herramienta similar a ldd para las bibliotecas que se pueden utilizar para encontrar el eslabón perdido?

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í está la sección dinámica de ELF 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
¿Fue útil?

Solución

Esto se parece a lo que ocurre cuando el intérprete ELF no se encuentra.

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

(lsbcc (o algo en el LSB cadena de herramientas) anula /lib/ld-linux.so.2 predeterminado 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 no se tenerlo.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top