Determinar dependencias directas de objetos compartidos de un binario de Linux?

170

¿Cómo puedo encontrar fácilmente las dependencias directas de objetos compartidos de un binario de Linux en formato ELF?

Conozco la herramienta ldd, pero parece que genera todas las dependencias de un binario, incluidas las dependencias de los objetos compartidos de los que depende el binario.

Ñu libre
fuente
2
relacionado unix.stackexchange.com/questions/120015/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

262

Puede usar readelfpara explorar los encabezados ELF. readelf -denumerará las dependencias directas como NEEDEDsecciones.

 $ readelf -d elfbin

Dynamic section at offset 0xe30 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400520
 0x000000000000000d (FINI)               0x400758
 ...
Estera
fuente
20
Esto es genial. A diferencia de ldd, readelf puede inspeccionar un binario multiplataforma (es decir, inspeccionar un ejecutable ARM desde x86-64 linux)
Robert Calhoun
86

Si quieres encontrar dependencias recursivamente (incluidas las dependencias de dependencias, dependencias de dependencias de dependencias, etc.) ...

Puedes usar el lddcomando. ldd: imprime dependencias de biblioteca compartida

Serge C
fuente
55
El comando ldd resuelve dependencias de dependencias, que no es lo que quiero.
Gratis ñus
11
Para mí esto funciona bien. Y hasta te dice cuál de las bibliotecas podría y no pudo ser encontrada.
Philipp F
2
ldd no funcionaría con un ejecutable; solo para descubrir las dependencias de las bibliotecas compartidas es útil.
Tuxdude
2
Tuxdude, ¿por qué piensas eso? ¿Cuál es la razón de la inutilidad de ldd para los ejecutables ELF?
Vitaly Isaev el
Esto es increíble para copiar las bibliotecas compartidas requeridas desde la máquina de desarrollo hasta el archivo de implementación.
Tomáš Zato - Restablece a Mónica el
30

La objdumpherramienta puede brindarle esta información. Si invoca objdumpcon la -xopción, para que muestre todos los encabezados, encontrará las dependencias de los objetos compartidos al principio en la "Sección dinámica".

Por ejemplo, ejecutar objdump -x /usr/lib/libXpm.so.4en mi sistema proporciona la siguiente información en la "Sección dinámica":

Dynamic Section:
  NEEDED               libX11.so.6
  NEEDED               libc.so.6
  SONAME               libXpm.so.4
  INIT                 0x0000000000002450
  FINI                 0x000000000000e0e8
  GNU_HASH             0x00000000000001f0
  STRTAB               0x00000000000011a8
  SYMTAB               0x0000000000000470
  STRSZ                0x0000000000000813
  SYMENT               0x0000000000000018
  PLTGOT               0x000000000020ffe8
  PLTRELSZ             0x00000000000005e8
  PLTREL               0x0000000000000007
  JMPREL               0x0000000000001e68
  RELA                 0x0000000000001b38
  RELASZ               0x0000000000000330
  RELAENT              0x0000000000000018
  VERNEED              0x0000000000001ad8
  VERNEEDNUM           0x0000000000000001
  VERSYM               0x00000000000019bc
  RELACOUNT            0x000000000000001b

Las dependencias directas de objetos compartidos se enumeran como valores 'NECESARIOS'. Entonces, en el ejemplo anterior, libXpm.so.4en mi sistema solo necesita libX11.so.6y libc.so.6.

Es importante tener en cuenta que esto no significa que todos los símbolos necesarios para el binario que se pasa objdumpestarán presentes en las bibliotecas, pero al menos muestra a qué bibliotecas intentará cargar el cargador al cargar el binario.

Ñu libre
fuente
13

ldd -v imprime el árbol de dependencias en la sección "Información de la versión: '. El primer bloque en esa sección son las dependencias directas del binario.

Ver jerárquico ldd (1)

Hannes
fuente
¿Cuál es la diferencia entre this y objdump -x <binary> | grep "NEEDED"? Quiero decir, ambos son casi exactamente lo mismo, solo estoy obteniendo un .soarchivo más lddque objdump. Pero el hecho de que los resultados no sean los mismos me hace preguntarme qué método es más preciso.
m4l490n