Qual é a maneira de imprimir os caminhos de pesquisa visualizados por ld na ordem em que pesquisam.
Qual é a maneira de imprimir os caminhos de pesquisa visualizados por ld na ordem em que pesquisam.
Respostas:
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).
ldo caminho de pesquisa de s. Por exemplo, às vezes eu tenho que compilar um código-fonte makefileou gerar makefile a partir de configurescripts ou de CMakeLists.txtou ainda mais complicados como valaou srt. É difícil para mim para modificar ldcaminho de pesquisa em tais casos
No Linux, você pode usar ldconfig, que mantém a configuração e o cache ld.so, para imprimir a pesquisa de diretórios ld.socom
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -vimprime a pesquisa de diretórios pelo vinculador (sem uma guia inicial) e as bibliotecas compartilhadas encontradas nesses diretórios (com uma guia inicial); o grepobtém os diretórios. Na minha máquina, esta linha imprime
/usr/lib64/atlas:
/usr/lib/llvm:
/usr/lib64/llvm:
/usr/lib64/mysql:
/usr/lib64/nvidia:
/usr/lib64/tracker-0.12:
/usr/lib/wine:
/usr/lib64/wine:
/usr/lib64/xulrunner-2:
/lib:
/lib64:
/usr/lib:
/usr/lib64:
/usr/lib64/nvidia/tls: (hwcap: 0x8000000000000000)
/lib/i686: (hwcap: 0x0008000000000000)
/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib/sse2: (hwcap: 0x0000000004000000)
/usr/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/sse2: (hwcap: 0x0000000004000000)
Os primeiros caminhos, sem hwcapna 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 como sse2correspondendo a recursos adicionais da CPU. Esses caminhos, com hwcapna linha, podem conter bibliotecas adicionais personalizadas para esses recursos da CPU.
Uma observação final: usar em -pvez de -vacima procura no ld.socache.
export LD_LIBRARY_PATH=/some/other/dir, isso não afetará a saída desse comando ?! Parece que não funciona 100%?
LD_LIBRARY_PATHativando a depuração. Por exemplo LD_DEBUG=libs /lib/ld-linux.so --list cat(você pode usar qualquer executável, escolhi catcomo a primeira coisa que consegui pensar). Pode valer a pena esperar por " search path". Observe que, se você tiver uma /etc/ld.so.cacheque corresponda a todas as bibliotecas necessárias, não verá o caminho de pesquisa do sistema interno, porque não chegará tão longe.
gcccaminho 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 -Lopções na linha de comandos, seguidos por diretórios adicionados ao caminho de pesquisa por SEARCH_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 lddiretamente:
-Lopções são o que você disse que são.--verboseopção Procure as SEARCH_DIR("...")diretivas, geralmente perto da parte superior da saída. (Observe que eles não são necessariamente os mesmos para todas as chamadas de ld- 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:
-vopção para, gccpara que ela mostre como chama o vinculador. De fato, normalmente não invoca lddiretamente, mas indiretamente, por meio de uma ferramenta chamada collect2(que mora em um de seus diretórios internos), que por sua vez invoca ld. Isso mostrará quais -Lopções estão sendo usadas.-Wl,--verboseàs gccopções para fazê-lo passar --verbosepara o vinculador, para ver o script do vinculador, conforme descrito acima.-T scriptmeu 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):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
se você der -m32, ele produzirá os diretórios de biblioteca corretos.
Exemplos na minha máquina:
para g++ -m64:
/usr/x86_64-linux-gnu/lib64
/usr/i686-linux-gnu/lib64
/usr/local/lib/x86_64-linux-gnu
/usr/local/lib64
/lib/x86_64-linux-gnu
/lib64
/usr/lib/x86_64-linux-gnu
/usr/lib64
/usr/local/lib
/lib
/usr/lib
para g++ -m32:
/usr/i686-linux-gnu/lib32
/usr/local/lib32
/lib32
/usr/lib32
/usr/local/lib/i386-linux-gnu
/usr/local/lib
/lib/i386-linux-gnu
/lib
/usr/lib/i386-linux-gnu
/usr/lib
A pergunta está marcada com Linux, mas talvez isso funcione bem no Linux?
gcc -Xlinker -v
No Mac OS X, isso imprime:
@(#)PROGRAM:ld PROJECT:ld64-224.1
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 armv6m armv7m armv7em
Library search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib
Framework search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/
[...]
A -Xlinkeropção gccacima apenas passa -vpara ld. Contudo:
ld -v
não imprime o caminho de pesquisa.
-Lpath. Então, a resposta @ Raphaël Londeix é melhor.
Versão para Mac: $ ld -v 2, não sabe como obter caminhos detalhados. resultado
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
ld -v 2
ld. O pessoal da Binutil o desabilitou nos scripts de construção. Ele foi desativado por anos.
/usr/local/..quais causa erro de biblioteca ausente e a vinculação falha. Eu tenho que renomear/usr/localtoda vez para excluir esse caminho de pesquisa. Existe uma maneira simples de excluir ou substituir o/usr/localcaminho?