A biblioteca compartilhada HOWTO explica a maioria dos mecanismos envolvidos, e o manual do carregador dinâmico entra em mais detalhes. Cada variante unix tem seu próprio caminho, mas a maioria usa o mesmo formato executável ( ELF ) e possui vinculadores dinâmicos semelhantes (derivados do Solaris). Abaixo, resumirei o comportamento comum com foco no Linux; verifique os manuais do seu sistema para a história completa.
Em poucas palavras, quando procura uma biblioteca dinâmica ( .so
arquivo), o vinculador tenta:
- diretórios listados na
LD_LIBRARY_PATH
variável de ambiente ( DYLD_LIBRARY_PATH
no OSX);
- diretórios listados no rpath do executável ;
- diretórios no caminho de pesquisa do sistema, que (pelo menos no Linux) consiste nas entradas em
/etc/ld.so.conf
mais /lib
e /usr/lib
.
O rpath é armazenado no executável (é o DT_RPATH
ou DT_RUNPATH
atributo dinâmico). Ele pode conter caminhos absolutos ou caminhos começando com $ORIGIN
para indicar um caminho relativo ao local do executável (por exemplo, se o executável estiver dentro /opt/myapp/bin
e seu rpath for $ORIGIN/../lib:$ORIGIN/../plugins
, o vinculador dinâmico procurará /opt/myapp/lib
e /opt/myapp/plugins
). O rpath é normalmente determinado quando o executável é compilado, com a -rpath
opção para ld
, mas você pode alterá-lo posteriormente com chrpath
.
No cenário que você descreve, se você é o desenvolvedor ou acondicionador do aplicativo e pretendemos para que possa ser instalado em um …/bin
, …/lib
estrutura, em seguida, ligar com -rpath='$ORIGIN/../lib'
. Se você estiver instalando um binário pré-criado em seu sistema, coloque a biblioteca em um diretório no caminho de pesquisa ( /usr/local/lib
se você é o administrador do sistema, caso contrário, um diretório ao qual você adiciona $LD_LIBRARY_PATH
) ou tente chrpath
.
/lib64
e/usr/lib64
são usados para binários de 64 bits/lib
e/usr/lib
são usados para binários de 32 bits.ldconfig
.ldconfig
se envolve quando você instala uma biblioteca.*.so
bibliotecas não é o mesmo que$PATH
. O caminho de pesquisa é o indicado pelo @enzotib em sua resposta. Para imprimir os caminhos que serão pesquisados, executeldconfig -v 2>/dev/null | grep -v ^$'\t'
./sbin/ldconfig
e aquela outra mágica do Andrew Bate para fazê-lo rodar sem raizNo Linux, o comportamento é explicitado na
ld(1)
página do manualfonte
Tenho certeza de que a resposta aqui é
ldconfig
.http://linux.die.net/man/8/ldconfig
fonte
Para aplicativos em execução, o arquivo
/proc/1234/maps
contém todas as bibliotecas vinculadas dinamicamente reais.Onde
1234
está o pid do executável em execução.O Linux segue LD_LIBRARY_PATH e outras variáveis, como apontado na resposta de Gilles.
fonte