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?.
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.
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é).
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:
-L
correspondent à ce que vous avez dit.--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
:
-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.-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.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
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.
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/