Quelle est la manière d'imprimer les chemins de recherche qui ont été regardés par ld dans l'ordre dans lequel il recherche.
154
Vous pouvez le faire en exécutant la commande suivante:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc transmet 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 d'exécution (c'est-à-dire à chaque fois qu'un programme est exécuté), ce qui n'est pas le même que le chemin recherché par ld (c'est-à-dire à chaque fois un programme est lié).
/usr/local/..
lesquelles une erreur de bibliothèque manquante est causée et la liaison échoue. Je dois renommer à/usr/local
chaque fois pour exclure ce chemin de recherche. Existe-t-il un moyen simple d'exclure ou de remplacer le/usr/local
chemin?ld
chemin de recherche. Par exemple, je dois parfois compiler un code source à partir demakefile
ou générer un makefile à partir d'unconfigure
script ou à partir deCMakeLists.txt
ou encore plus compliqués tels quevala
ousrt
. Il m'est difficile de modifier leld
chemin de recherche dans de tels casSous Linux, vous pouvez utiliser
ldconfig
, qui gère la configuration et le cache ld.so, pour imprimer les répertoires recherchésld.so
avecldconfig -v
imprime la recherche de répertoires par l'éditeur de liens (sans onglet de début) et les bibliothèques partagées trouvées dans ces répertoires (avec un onglet de début); legrep
récupère les répertoires. Sur ma machine, cette ligne s'imprimeLes premiers chemins, sans
hwcap
dans la ligne, sont soit intégrés, soit lus depuis /etc/ld.so.conf. L'éditeur de liens peut ensuite rechercher des répertoires supplémentaires sous le chemin de recherche de la bibliothèque de base, avec des noms tels quesse2
correspondant à des capacités de processeur supplémentaires. Ces chemins, avechwcap
dans la ligne, peuvent contenir des bibliothèques supplémentaires adaptées à ces capacités CPU.Une dernière remarque: utiliser
-p
au lieu de-v
ci - dessus recherche leld.so
cache à la place.la source
export LD_LIBRARY_PATH=/some/other/dir
, cela n'affecte pas la sortie de cette commande?! Cela semble ne pas fonctionner à 100%?LD_LIBRARY_PATH
en activant le débogage. Par exempleLD_DEBUG=libs /lib/ld-linux.so --list cat
(vous pouvez utiliser n'importe quel exécutable, j'ai choisicat
comme première chose à laquelle je pourrais penser). Cela vaudra peut-être la peine d'être salué pour "search path
". Notez que si vous avez un/etc/ld.so.cache
qui correspond à toutes les bibliothèques nécessaires, vous ne pourrez pas voir le chemin de recherche système intégré, car il n'ira pas aussi loin.gcc
chemin de recherche est-il le même avec ceux-ci?Je ne suis pas sûr qu'il existe une option pour simplement imprimer le chemin de recherche efficace complet.
Mais: le chemin de recherche se compose de répertoires spécifiés par des
-L
options sur la ligne de commande, suivis des répertoires ajoutés au chemin de recherche par desSEARCH_DIR("...")
directives dans le (s) script (s) de l'éditeur de liens. Vous pouvez donc le résoudre si vous pouvez voir les deux, ce que vous pouvez faire comme suit:Si vous appelez
ld
directement:-L
options sont ce que vous avez dit qu'elles sont.--verbose
option. Recherchez lesSEARCH_DIR("...")
directives, généralement vers le haut de la sortie. (Notez que ce ne sont pas nécessairement les mêmes pour chaque appel deld
- l'éditeur de liens a un certain nombre de scripts de l'éditeur de liens par défaut intégrés différents, et choisit entre eux en fonction de diverses autres options de l'éditeur de liens.)Si vous créez un lien via
gcc
:-v
option àgcc
afin qu'elle vous montre comment elle appelle l'éditeur de liens. En fait, il n'appelle normalement pasld
directement, mais indirectement via un outil appelécollect2
(qui vit dans l'un de ses répertoires internes), qui à son tour invoqueld
. Cela vous montrera quelles-L
options sont utilisées.-Wl,--verbose
desgcc
options pour le faire passer--verbose
à l'éditeur de liens, pour voir le script de l'éditeur de liens comme décrit ci-dessus.la source
-T script
mon script a complètement remplacé le script par défaut de ld et n'a regardé que là où je l'ai indiqué.La commande la plus compatible que j'ai trouvée pour gcc et clang sous Linux (grâce à armando.sano):
si vous donnez
-m32
, il affichera les bons répertoires de bibliothèque.Exemples sur ma machine:
pour
g++ -m64
:pour
g++ -m32
:la source
La question est étiquetée Linux, mais peut-être que cela fonctionne aussi bien sous Linux?
Sous Mac OS X, cela imprime:
L'
-Xlinker
optiongcc
ci-dessus passe simplement-v
àld
. Toutefois:n'imprime pas le chemin de recherche.
la source
-Lpath
. Donc, la réponse @ Raphaël Londeix est meilleure.Version Mac: $ ld -v 2, je ne sais pas comment obtenir des chemins détaillés. production
la source
ld -v 2
ld
. Les gens de Binutil l'ont désactivé dans les scripts de construction. Il est désactivé depuis des années.