Como imprimir o caminho de pesquisa ld (vinculador)

153

Qual é a maneira de imprimir os caminhos de pesquisa visualizados por ld na ordem em que pesquisam.

Talespin_Kit
fonte

Respostas:

95

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).

faken
fonte
2
Você atingiu o local. Eu tenho um problema de vinculação, durante o processo de vinculação, o vinculador encontra bibliotecas instaladas manualmente nas /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?
kenn
1
Você pode tentar especificar manualmente os caminhos da biblioteca com a opção -L no GCC, que acho que (não tenho certeza) substituirá os caminhos da biblioteca do sistema. Você também pode tentar definir a variável de ambiente LIBRARY_PATH antes de compilar: $ LIBRARY_PATH = / somedir / gcc ...
faken
1
Eu sei que ligando na linha de comando compilando. Eu quis dizer uma maneira global de substituir 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
Kenn
Ao usar o CMake, você pode selecionar as bibliotecas exatas que são usadas durante a fase de configuração (algumas dessas entradas são mostradas apenas no modo avançado). Quanto aos scripts de configuração do Autotools, consulte esta resposta: stackoverflow.com/questions/7561509/… . Isso não responde diretamente à sua pergunta, mas pode ajudá-lo a fazer o que deseja.
faken 9/09/14
81

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.

telotortium
fonte
51
Ele está perguntando sobre o vinculador (ld) e não o carregador (ld.so)!
21713
3
Como é possível que, se eu definir export LD_LIBRARY_PATH=/some/other/dir, isso não afetará a saída desse comando ?! Parece que não funciona 100%?
TMS
3
@fons O engraçado é que cheguei aqui procurando esta resposta. :) caminho de link-time ou run-time? Eu acho que essa é a questão. LIBRAY_PATH (tempo do link) vs LD_LIBRARY_PATH.
Daniel Santos
2
Eu descobri em algumas plataformas (por exemplo, arme com o Linaro toolchain) que o ldconfig na verdade não pesquisa os mesmos diretórios que o vinculador de tempo de execução. Você pode obter o caminho de pesquisa e incluir os caminhos 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.
John O'M.
O gcccaminho de pesquisa é o mesmo com esses?
Nn0p 7/09/16
67

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:

  • As -Lopções são o que você disse que são.
  • Para ver o script do vinculador, adicione a --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:

  • Você pode passar a -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.
  • Você pode adicionar -Wl,--verboseàs gccopções para fazê-lo passar --verbosepara o vinculador, para ver o script do vinculador, conforme descrito acima.
Matthew Slattery
fonte
5
A opção --verbose para o vinculador fez o truque. Muito útil!
Ari #
Eu estava tentando descobrir onde o vinculador estava procurando e não encontrou SEARCH_DIR na saída. Acontece que, enquanto eu estava usando -T scriptmeu script, substitui completamente o script padrão do ld e só olhou para onde eu apontava.
Thomasa88
29

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
Raphaël Londeix
fonte
Obrigado! aprimoramento pequenininho - livre-se de um grep ou dois: sed -n 's / SEARCH_DIR ("= \? ([^"] \ +) "); * / \ 1 \ n / gp'
Bruce K
2
Por que isso requer um método tão obscuro?
bmacnaughton
Isso funcionou como um encanto! como adicionamos os diretórios nesta lista, o caminho de pesquisa do vinculador?
pari
6

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.

armando.sano
fonte
No Linux, ele também imprime diretórios, mas na forma de -Lpath. Então, a resposta @ Raphaël Londeix é melhor.
Pevik
2

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/
yfeleke
fonte
3
Eu recebo "não é possível abrir 2: não existe esse arquivo ou diretório". Em execuçãold -v 2
Jack
2
A pergunta está marcada com Linux, não com o OS X. Não acredito que o OS X use GNU's ld. O pessoal da Binutil o desabilitou nos scripts de construção. Ele foi desativado por anos.
JWW