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.