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_PATHno 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.confplus/libe/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 .