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).
ld
o caminho de pesquisa de s. Por exemplo, às vezes eu tenho que compilar um código-fonte makefile
ou gerar makefile a partir de configure
scripts ou de CMakeLists.txt
ou ainda mais complicados como vala
ou srt
. É difícil para mim para modificar ld
caminho 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.so
com
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -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); o grep
obté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 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 como sse2
correspondendo a recursos adicionais da CPU. Esses caminhos, com hwcap
na linha, podem conter bibliotecas adicionais personalizadas para esses recursos da CPU.
Uma observação final: usar em -p
vez de -v
acima procura no ld.so
cache.
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 exemplo LD_DEBUG=libs /lib/ld-linux.so --list cat
(você pode usar qualquer executável, escolhi cat
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 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 ld
diretamente:
-L
opções são o que você disse que são.--verbose
opçã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
:
-v
opção para, gcc
para que ela mostre como chama o vinculador. De fato, normalmente não invoca ld
diretamente, 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 -L
opções estão sendo usadas.-Wl,--verbose
às gcc
opções para fazê-lo passar --verbose
para o vinculador, para ver o script do vinculador, conforme descrito acima.-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):
$ 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 -Xlinker
opção gcc
acima apenas passa -v
para 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/local
toda vez para excluir esse caminho de pesquisa. Existe uma maneira simples de excluir ou substituir o/usr/local
caminho?