Eu quero descobrir a lista de bibliotecas dinâmicas que um binário carrega quando executado (com seus caminhos completos). Estou usando o CentOS 6.0. Como fazer isso?
executable
libraries
dynamic-linking
Ciro Santilli adicionou uma nova foto
fonte
fonte
lld
Parece que não em darwin, nem posso encontrá-lo via homebrew.otool -L <path-to-binary>
ldd
. Veja a página de manual .readelf -d $executable | grep 'NEEDED'
Pode ser usado se você não puder executar o executável, por exemplo, se ele foi compilado em cruz ou se você não confia nele:
Exemplo:
Saída da amostra:
Observe que as bibliotecas podem depender de outras, então agora você precisa encontrar as dependências.
Uma abordagem ingênua que geralmente funciona é:
mas o método mais preciso é entender o
ldd
caminho / cache de pesquisa. Eu acho queldconfig
é o caminho a percorrer.Escolha um e repita:
Saída de amostra:
E assim por diante.
Veja também:
/proc/<pid>/maps
para processos em execuçãoMencionado pelo Basile , isso é útil para encontrar todas as bibliotecas atualmente sendo usadas pela execução de executáveis. Por exemplo:
mostra todas as dependências dinâmicas atualmente carregadas de
init
(PID1
):Este método também mostra as bibliotecas abertas com
dlopen
, testadas com esta configuração mínima hackeada com umasleep(1000)
no Ubuntu 18.04.Consulte também: Como ver os objetos compartilhados atualmente carregados no Linux? | Superusuário
fonte
ldd e lsof mostram as bibliotecas carregadas diretamente ou em um determinado momento . Eles não consideram bibliotecas carregadas via
dlopen
(ou descartadas pordlclose
). Você pode obter uma imagem melhor disso usandostrace
, por exemplo,(já que, em
dlopen
última análise, chamaopen
- embora você possa ter um sistema usando nomes diferentes para abrir 64 bits ...).Exemplo:
mostra-me isto:
a partir do qual se pode receber os nomes ".so" para ver apenas objetos compartilhados.
fonte
strace -e trace=open,openat myprogram
/proc/<pid>/maps
também mostradlopen
libs btw: a saída unix.stackexchange.com/questions/120015/…ltrace -S
é ainda mais interessante, pois mostra chamadas de syscalls e de biblioteca comodlopen
: unix.stackexchange.com/questions/226524/…lsof também pode mostrar quais bibliotecas estão sendo usadas para um processo específico.
ie
fonte
Para um processo do pid 1234, você também pode ler o
/proc/1234/maps
pseudo-arquivo (textual) (leia proc (5) ...) ou use o pmap (1)Isso fornece o espaço de endereço virtual desse processo, portanto, os arquivos (incluindo bibliotecas compartilhadas e até dlopen (3) -ed one) que são mapeados na memória
(é claro, use
ps aux
ou pgrep (1) para encontrar os processos executando algum programa)fonte
Para consulta em massa:
crie um pequeno script (
useslib
) e insira no PATH (ou especifique um caminho completo no comando abaixo)Use-o em um
find
comando, por exemplo:(libgtk-x11-2.0 parece ser a lib gtk2)
fonte
É possível usar
pmap
.Por exemplo, inicie um processo:
$ watch date
Obter pid:
$ ps -ef | grep watch
Mostrar mapa de memória:
$ pmap <pid>
Mostrar com o caminho completo:
$ pmap <pid> -p
fonte