Qual é a maneira de imprimir os caminhos de pesquisa visualizados por ld na ordem em que pesquisam.
153
Você pode fazer isso executando o seguinte comando:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
O gcc passa alguns caminhos -L extras para o vinculador, que você pode listar com o seguinte comando:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
As respostas sugerindo o uso de ld.so.conf e ldconfig não estão corretas porque se referem aos caminhos pesquisados pelo vinculador dinâmico de tempo de execução (ou seja, sempre que um programa é executado), que não é o mesmo que o caminho pesquisado por ld (ou seja, sempre que um programa está vinculado).
/usr/local/..
quais causa erro de biblioteca ausente e a vinculação falha. Eu tenho que renomear/usr/local
toda vez para excluir esse caminho de pesquisa. Existe uma maneira simples de excluir ou substituir o/usr/local
caminho?ld
o caminho de pesquisa de s. Por exemplo, às vezes eu tenho que compilar um código-fontemakefile
ou gerar makefile a partir deconfigure
scripts ou deCMakeLists.txt
ou ainda mais complicados comovala
ousrt
. É difícil para mim para modificarld
caminho de pesquisa em tais casosNo Linux, você pode usar
ldconfig
, que mantém a configuração e o cache ld.so, para imprimir a pesquisa de diretóriosld.so
comldconfig -v
imprime a pesquisa de diretórios pelo vinculador (sem uma guia inicial) e as bibliotecas compartilhadas encontradas nesses diretórios (com uma guia inicial); ogrep
obtém os diretórios. Na minha máquina, esta linha imprimeOs primeiros caminhos, sem
hwcap
na linha, são internos ou lidos no /etc/ld.so.conf. O vinculador pode procurar diretórios adicionais no caminho básico de pesquisa da biblioteca, com nomes comosse2
correspondendo a recursos adicionais da CPU. Esses caminhos, comhwcap
na linha, podem conter bibliotecas adicionais personalizadas para esses recursos da CPU.Uma observação final: usar em
-p
vez de-v
acima procura nold.so
cache.fonte
export LD_LIBRARY_PATH=/some/other/dir
, isso não afetará a saída desse comando ?! Parece que não funciona 100%?LD_LIBRARY_PATH
ativando a depuração. Por exemploLD_DEBUG=libs /lib/ld-linux.so --list cat
(você pode usar qualquer executável, escolhicat
como a primeira coisa que consegui pensar). Pode valer a pena esperar por "search path
". Observe que, se você tiver uma/etc/ld.so.cache
que corresponda a todas as bibliotecas necessárias, não verá o caminho de pesquisa do sistema interno, porque não chegará tão longe.gcc
caminho de pesquisa é o mesmo com esses?Não tenho certeza se existe alguma opção para simplesmente imprimir o caminho de pesquisa efetivo completo.
Mas: o caminho de pesquisa consiste em diretórios especificados por
-L
opções na linha de comandos, seguidos por diretórios adicionados ao caminho de pesquisa porSEARCH_DIR("...")
diretivas no (s) script (s) do vinculador. Portanto, você pode descobrir se pode ver os dois, o que pode ser feito da seguinte maneira:Se você estiver chamando
ld
diretamente:-L
opções são o que você disse que são.--verbose
opção Procure asSEARCH_DIR("...")
diretivas, geralmente perto da parte superior da saída. (Observe que eles não são necessariamente os mesmos para todas as chamadas deld
- o vinculador possui vários scripts diferentes do vinculador padrão interno e escolhe entre eles com base em várias outras opções do vinculador.)Se você está vinculando via
gcc
:-v
opção para,gcc
para que ela mostre como chama o vinculador. De fato, normalmente não invocald
diretamente, mas indiretamente, por meio de uma ferramenta chamadacollect2
(que mora em um de seus diretórios internos), que por sua vez invocald
. Isso mostrará quais-L
opções estão sendo usadas.-Wl,--verbose
àsgcc
opções para fazê-lo passar--verbose
para o vinculador, para ver o script do vinculador, conforme descrito acima.fonte
-T script
meu script, substitui completamente o script padrão do ld e só olhou para onde eu apontava.O comando mais compatível que encontrei para o gcc e o clang no Linux (graças a armando.sano):
se você der
-m32
, ele produzirá os diretórios de biblioteca corretos.Exemplos na minha máquina:
para
g++ -m64
:para
g++ -m32
:fonte
A pergunta está marcada com Linux, mas talvez isso funcione bem no Linux?
No Mac OS X, isso imprime:
A
-Xlinker
opçãogcc
acima apenas passa-v
parald
. Contudo:não imprime o caminho de pesquisa.
fonte
-Lpath
. Então, a resposta @ Raphaël Londeix é melhor.Versão para Mac: $ ld -v 2, não sabe como obter caminhos detalhados. resultado
fonte
ld -v 2
ld
. O pessoal da Binutil o desabilitou nos scripts de construção. Ele foi desativado por anos.