web-dev-qa-db-fra.com

Comment imprimer le chemin de recherche ld (linker)

Quel est le moyen d’imprimer les chemins de recherche qui sont examinés par ld dans l’ordre dans lequel ils sont recherchés?.

139
Talespin_Kit

Sous Linux, vous pouvez utiliser ldconfig, qui conserve la configuration et le cache de ld.so, pour imprimer la recherche de répertoires par ld.so avec

ldconfig -v 2>/dev/null | grep -v ^$'\t'

ldconfig -v imprime la recherche de répertoires par l'éditeur de liens (sans onglet principal) et les bibliothèques partagées trouvées dans ces répertoires (avec un onglet principal); la grep récupère les répertoires. Sur ma machine, cette ligne 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)

Les premiers chemins, sans hwcap dans la ligne, sont soit intégrés, soit lus dans /etc/ld.so.conf. L'éditeur de liens peut ensuite rechercher des répertoires supplémentaires dans le chemin de recherche de la bibliothèque de base, avec des noms tels que sse2 correspondant à des capacités de processeur supplémentaires. Ces chemins, avec hwcap dans la ligne, peuvent contenir des bibliothèques supplémentaires adaptées à ces capacités de processeur.

Une dernière remarque: utiliser -p au lieu de -v ci-dessus recherche dans le cache ld.so à la place.

76
telotortium

Vous pouvez le faire en exécutant la commande suivante:

ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012

gcc passe quelques chemins -L supplémentaires à l'éditeur de liens, que vous pouvez lister avec la commande suivante:

gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,;  ,g' | tr \; \\012

Les réponses suggérant d'utiliser ld.so.conf et ldconfig ne sont pas correctes car elles font référence aux chemins recherchés par l'éditeur de liens dynamique à l'exécution (c'est-à-dire chaque fois qu'un programme est exécuté), ce qui diffère du chemin recherché par ld (c'est-à-dire chaque fois qu'un programme est lié).

74
faken

Je ne suis pas sûr qu'il existe une option pour simplement imprimer le chemin de recherche effectif complet.

Mais: le chemin de recherche est constitué de répertoires spécifiés par les options -L sur la ligne de commande, suivis des répertoires ajoutés au chemin de recherche par les directives SEARCH_DIR("...") dans le ou les scripts de l'éditeur de liens. Ainsi, vous pouvez résoudre le problème si vous pouvez voir les deux, ce que vous pouvez faire comme suit:

Si vous appelez ld directement:

  • Les options -L correspondent à ce que vous avez dit.
  • Pour voir le script de l'éditeur de liens, ajoutez l'option --verbose. Recherchez les directives SEARCH_DIR("..."), généralement situées en haut de la sortie. (Notez que ceux-ci ne sont pas nécessairement les mêmes pour chaque invocation de ld - l'éditeur de liens possède un certain nombre de scripts de l'éditeur de liens intégrés par défaut différents, et choisit entre eux en fonction de diverses autres options de l'éditeur de liens.)

Si vous vous connectez via gcc:

  • Vous pouvez passer l'option -v à gcc afin qu'elle vous montre comment elle appelle l'éditeur de liens. En fait, normalement, il n'appelle pas ld directement, mais indirectement via un outil appelé collect2 (qui réside dans l'un de ses répertoires internes), qui à son tour appelle ld. Cela vous montrera quelles options de -L sont utilisées.
  • Vous pouvez ajouter -Wl,--verbose aux options gcc pour le faire passer --verbose à l'éditeur de liens, afin d'afficher le script de l'éditeur de liens comme décrit ci-dessus.
65
Matthew Slattery

La commande la plus compatible que j'ai trouvée pour gcc et clang sous Linux (grâce à armando.sano):

$ gcc -m64 -Xlinker --verbose  2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g'  | grep -vE '^$'

si vous donnez -m32, les répertoires de bibliothèque appropriés seront générés.

Exemples sur ma machine:

pour 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

pour 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
26
Raphaël Londeix

La question est étiquetée Linux, mais peut-être que cela fonctionne aussi sous Linux?

gcc -Xlinker -v

Sous Mac OS X, cela affiche:

@(#)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/
[...]

L'option -Xlinker de gcc ci-dessus ne fait que transmettre -v à ld. Pourtant:

ld -v

n'imprime pas le chemin de recherche.

5
armando.sano

Version Mac: $ ld -v 2, vous ne savez pas comment obtenir des chemins détaillés. sortie

Library search paths:
    /usr/lib
    /usr/local/lib
Framework search paths:
    /Library/Frameworks/
    /System/Library/Frameworks/
1
yfeleke