Determinar dependências diretas de objetos compartilhados de um binário Linux?

170

Como posso descobrir facilmente as dependências diretas de objetos compartilhados de um binário Linux no formato ELF?

Estou ciente da ferramenta ldd, mas isso parece gerar todas as dependências de um binário, incluindo as dependências de qualquer objeto compartilhado do qual o binário é dependente.

Gnu grátis
fonte
2
relacionada unix.stackexchange.com/questions/120015/...
Ciro Santilli郝海东冠状病六四事件法轮功

Respostas:

262

Você pode usar readelfpara explorar os cabeçalhos ELF. readelf -dlistará as dependências diretas como NEEDEDseções.

 $ 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
 ...
Esteira
fonte
20
Isso é ótimo. Ao contrário ldd, readelf pode inspecionar um binário multi-plataforma (ou seja, inspecionar um executável ARM a partir do Linux x86-64.)
Robert Calhoun
86

Se você deseja localizar dependências recursivamente (incluindo dependências de dependências, dependências de dependências de dependências etc.)…

Você pode usar o lddcomando ldd - imprime dependências de bibliotecas compartilhadas

Serge C
fonte
5
O comando ldd calcula dependências de dependências, o que não é o que eu quero.
Free Wildebeest
11
Para mim, isso funciona bem. E até diz a você, quais das bibliotecas podem e não podem ser encontradas.
Philipp F
2
O ldd não funcionaria com um executável - apenas para descobrir as dependências das bibliotecas compartilhadas, é útil.
Tuxdude 9/10/12
2
Tuxdude, por que você acha isso? Qual é o motivo da inutilização do ldd para os executáveis ​​do ELF?
Vitaly Isaev
Isso é incrível para copiar as bibliotecas compartilhadas necessárias da máquina de desenvolvimento para o arquivo de implantação.
Tomáš Zato - Restabelecer Monica
30

A objdumpferramenta pode fornecer essas informações. Se você invocar objdumpcom a -xopção, para que ela produza todos os cabeçalhos, você encontrará as dependências de objetos compartilhados logo no início na "Seção dinâmica".

Por exemplo, a execução objdump -x /usr/lib/libXpm.so.4no meu sistema fornece as seguintes informações na "Seção 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

As dependências diretas de objetos compartilhados estão listadas como valores 'NECESSÁRIOS'. Então, no exemplo acima, libXpm.so.4no meu sistema só precisa libX11.so.6e libc.so.6.

É importante observar que isso não significa que todos os símbolos necessários para a passagem do binário objdumpestarão presentes nas bibliotecas, mas mostra pelo menos quais bibliotecas o carregador tentará carregar ao carregar o binário.

Gnu grátis
fonte
13

O ldd -v imprime a árvore de dependência na seção "Informações da versão: '. O primeiro bloco nessa seção são as dependências diretas do binário.

Consulte Hierárquico ldd (1)

Hannes
fonte
Qual é a diferença entre this e objdump -x <binary> | grep "NEEDED"? Quero dizer, ambos são quase exatamente iguais, só estou conseguindo um .soarquivo a mais lddque objdump. Mas o fato de os resultados não serem os mesmos me faz pensar em qual método é mais preciso.
m4l490n 13/07