Como determinar onde um executável procura por uma biblioteca compartilhada?

2

Eu sei que tenho a biblioteca, mas o executável não consegue encontrá-la. Se eu soubesse onde estava pesquisando, poderia criar um link simbólico onde ele espera encontrar o lib.

$ ~/Apps/simutrans/simutrans
/home/dan/Apps/simutrans/simutrans: error while loading shared libraries: libbz2.so.1.0: cannot open shared object file: No such file or directory

$ locate libbz2
...
/lib/x86_64-linux-gnu/libbz2.so.1
/lib/x86_64-linux-gnu/libbz2.so.1.0
/lib/x86_64-linux-gnu/libbz2.so.1.0.4
/usr/lib/x86_64-linux-gnu/libbz2.a
/usr/lib/x86_64-linux-gnu/libbz2.so
...

Aparentemente, o executável não está usando /etc/ld.so.conf* para encontrar bibliotecas; se fosse, então teria encontrado o lib:

$ cat /etc/ld.so.conf.d/x86_64-linux-gnu.conf 
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

Inspecionando o executável com readelf , conforme mencionado em onde o sistema procurará por bibliotecas dinâmicas? , não mostra uma entrada RUNPATH que teria mostrado quando a biblioteca precisa ser encontrada.

    
por Dan Ross 12.12.2015 / 13:46

1 resposta

4

Supondo que seu programa seja executado com o usuário atual (sem setuid, etc), você pode usar strace para obter essa informação, por exemplo,

strace -o foo.out ~/Apps/simutrans/simutrans

e procure no arquivo de saída por open chamadas.

    
por 12.12.2015 / 13:50