O HOWTO da biblioteca compartilhada explica a maioria dos mecanismos envolvidos, e o manual do carregador dinâmico entra em mais detalhes. Cada variante do unix tem seu próprio caminho, mas a maioria usa o mesmo formato executável ( ELF ) e tem o mesmo linkers dinâmicos (derivados do Solaris). Abaixo, resumirei o comportamento comum com foco no Linux; verifique os manuais do seu sistema para ver a história completa.
Em poucas palavras, quando estiver procurando por uma biblioteca dinâmica ( .so
file), o vinculador tentará:
- diretórios listados na variável de ambiente
LD_LIBRARY_PATH
(DYLD_LIBRARY_PATH
no OSX); - diretórios listados no caminho do executável ;
- diretórios no caminho de pesquisa do sistema, que (pelo menos no Linux) consiste nas entradas em
/etc/ld.so.conf
plus/lib
e/usr/lib
.
O rpath é armazenado no executável (é o atributo DT_RPATH
ou DT_RUNPATH
dynamic). Ele pode conter caminhos ou caminhos absolutos começando com $ORIGIN
para indicar um caminho relativo ao local do executável (por exemplo, se o executável estiver em /opt/myapp/bin
e seu caminho for $ORIGIN/../lib:$ORIGIN/../plugins
, o vinculador dinâmico procurará em /opt/myapp/lib
e /opt/myapp/plugins
). O rpath é normalmente determinado quando o executável é compilado, com a opção -rpath
para ld
, mas você pode alterá-lo posteriormente com chrpath
.
No cenário descrito, se você for o desenvolvedor ou empacotador do aplicativo e pretender que ele seja instalado em uma estrutura …/bin
, …/lib
, vincule-se a -rpath='$ORIGIN/../lib'
. Se você estiver instalando um binário pré-compilado em seu sistema, coloque a biblioteca em um diretório no caminho de pesquisa ( /usr/local/lib
se você for o administrador do sistema, caso contrário, um diretório incluído em $LD_LIBRARY_PATH
) ou tente chrpath
.