Encontre bibliotecas às quais um binário foi vinculado

Encontre bibliotecas às quais um binário foi vinculado

Eu sei que existe um comando que lista as bibliotecas e as respectivas versões às quais um software foi vinculado.

Algo com ld ou libtool?

Mas simplesmente não consigo me lembrar. Passei algum tempo no Google, mas não encontrei nada útil.

Atualizar
ldd <binary>ajudaria no Linux, (de@Ernesto) enquanto descobri que otool -L <binary>faz algo semelhante no MacOS X.

Responder1

Tente lddbinário-exec

Exemplo:

~$ ldd /bin/bash
    linux-gate.so.1 =>  (0x00606000)
    libncurses.so.5 => /lib/libncurses.so.5 (0x00943000)
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00c5d000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x003e9000)
    /lib/ld-linux.so.2 (0x00a41000)

Responder2

Para encontrar o que ele precisa diretamente:

readelf -d APP | grep NEEDED

lddcomo mencionado em outro lugar, mostrará todas as bibliotecas diretas e indiretas - tudo o que precisa em tempo de execução. Esta pode não ser uma lista completa, já que você pode abrir coisas dinamicamente com dlopen(), mas isso deve funcionar 99% das vezes.

ld e libtool são usados ​​em tempo de compilação/link. Eles não são úteis quando você tem um aplicativo.

EDITARPosso ver pelas respostas posteriores que você estava perguntando sobre o OSX, mas quero acrescentar algo à minha resposta sobre ferramentas Linux:

Uma coisa que esqueci de mencionar há algum tempo; você perguntou sobre versões. Nem responderá à pergunta "qual versão" ldd. readelfEles lhe dirão o nome do arquivo da biblioteca que você está procurando, e a convenção de nomenclatura pode conter algumas informações de versão, mas nada impõe isso. Os símbolos podem ser versionados, e você teria que usar um nível ainda mais baixo para nmvê-los,

Responder3

Outra maneira seria usar objdump.

objdump -x "binário" | grep NECESSÁRIO

Isso mostra todas as dependências necessárias apenas para este binário. Muito útil.

Responder4

Ooutras respostasperder um ponto importante:

Bibliotecas compartilhadas podem serdiretamentevinculado, ouindiretamentevinculado através de outra biblioteca.

Para apenas odiretamente ligado:

objdump --private-headers "${bin}" | grep 'NECESSÁRIO' | cortar --delimitador=' ' --fields=18-

Paratodos:

ldd "${bin}" | cortar --campos=2 | cortar --delimitador=' ' --fields=1 | rev | cortar --delimitador='/' --fields=1 | rev | classificar --unique --version-sort

informação relacionada