linker ld : chemin de recherche par défaut des lib, modification des chemins de recherch e des lib

Le
ludo
bonjour,

J'aimerais comprendre comment le linker recherche les librairies, le
"man ld" n'étant pas très explicite

la doc indique que l'on peut spécifier des chemins avec l'option -L
Mais ld semble utiliser également des chemins par défaut et je n'ai pas
trouvé où ils étaient définis
le "man ld" n'indique pas de fichier de configuration (genre
/etc/ld.conf) ni de variable d'environnement

j'ai essayé de tracer le comportement de ld avec strace (la libde test
libouestlalib.a/.so n'existant pas)
$strace ld -louestlalib -o a
ce qui donne quelque chose comme :
open("/usr/bin/../lib/libouestlalib.so", O_RDONLY|O_LARGEFILE) = -1
ENOENT (No such file or directory)
open("/usr/i486-linux-gnu/lib32/libouestlalib.so", O_RDONLY|O_LARGEFILE)
= -1 ENOENT (No such file or directory)
open("/usr/local/lib32/libouestlalib.so", O_RDONLY|O_LARGEFILE) = -1
ENOENT (No such file or directory)
open("/lib32/libouestlalib.so", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No
such file or directory)
open("/usr/lib32/libouestlalib.so", O_RDONLY|O_LARGEFILE) = -1 ENOENT
(No such file or directory)
open("/usr/i486-linux-gnu/lib/libouestlalib.so", O_RDONLY|O_LARGEFILE) =
-1 ENOENT (No such file or directory)
open("/usr/local/lib/libouestlalib.so", O_RDONLY|O_LARGEFILE) = -1
ENOENT (No such file or directory)
open("/lib/libouestlalib.so", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such
file or directory)
open("/usr/lib/libouestlalib.so", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No
such file or directory)

grosso modo, l'ordre des répertoires me semble presque logique :
/usr/bin/../lib /usr/local/lib /lib /usr/lib
/usr/bin/../lib est un chemin relatif à ld qui force l'utilisation de
/usr/lib
ce qui signifie que si on reconstruit une lib, déjà existante sur la
machine dans /usr/lib, avec une génération par défaut dans /usr/local/*,
la nouvelle version dans /usr/local/lib ne sera pas utilisée si elle est
déjà présente dans /usr/lib (il faudra forcément utiliser l'option 'ld
-L /usr/local/lib' )

Par exemple, si on regénère libz.so avec une installation dans
/usr/local/lib
ld -lz -o a
continue d'utiliser /usr/lib/libz.so
par contre
ld -L /usr/local/lib -lz -o a
utilisera la nouvelle version /usr/local/lib/libz.so

Il y a des répertoires dépendant de l'archi (/usr/i486-linux-gnu) qui
n'existe pas : c'est pour le debug de ld ?

=> Je suppose que ces différents chemins de recherche sont codés en dur
dans ld lors de sa génération : est ce correct ?

ce que j'en déduis :
1/ il n'y a pas de fichiers de configuration pour spécifier tous les
chemins de recherche des lib
2/ pour modifier les chemins de recherche des lib, il n'y a qu'une seule
façon de faire : l'option '-L'

Mais est ce effectivement comme cela que fonctionne ld ?

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
David Soulayrol
Le #17763091
Le jeudi 06 novembre 2008 à 11:32 +0100, ludo a écrit :
bonjour,
[...]
ce que j'en déduis :
1/ il n'y a pas de fichiers de configuration pour spécifier tous les
chemins de recherche des lib



Si. Jette un oeil à /etc/ld.so.conf. Ce fichier est utilisé par la
système pour créer /etc/ld/so/cache (je ne sais plus s'il faut
intervenir manuellement pour rafraîchir le cache).

2/ pour modifier les chemins de recherche des lib, il n'y a qu'une seule
façon de faire : l'option '-L'



Non. La macro LD_LIBRARY_PATH permet de spécifier des chemins
prioritaires.

Mais est ce effectivement comme cela que fonctionne ld ?



--
David.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Bruno Muller
Le #17764331
--=-saZC8Tzg6fjby3G9jY0r
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: quoted-printable

Hello,

Il faut faire la différence entre le linker (ld, fournit par binutils)
qui est utilisé lors de la compilation et le linker/loader
(ld.so/ld-linux.so fournit par la glibc) utilisé à l'exécution : leur
fonctionnement est totalement indépendant.

Pour ld.so, les répertoires de recherche des lib dynamiques (.so) (hors
ceux par défauts : /lib et /usr/lib) sont indiqués dans /etc/ld.so.conf .

Pour ld, les répertoires de recherche des lib (.a) sont fixés lors de s a
compilation, si ceux par défaut ne conviennent pas, par la variable
LIB_PATH. On peut les connaître par la commande "ld
--verbose" (SEARCH_DIR).
En dehors de ces chemins il est nécessaire de passer par la variable
LIBDIR ou l'option -L.

Bruno

--
HISTOIRE
M : Il paraît que Thomas Jefferson a eu un enfant avec son chien...
P : Mais non ! C'est avec son esclave qu'il a eu un gosse...
M : Qu'est-ce qu'il a eu alors, avec son chien ?
P : La chtouille.
M : Ah, ouais...

--=-saZC8Tzg6fjby3G9jY0r
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: Ceci est une partie de message
=?ISO-8859-1?Q?numériquement?= =?ISO-8859-1?Q?_signée?
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEABECAAYFAkkS7xIACgkQuJD2bkb8m5t+mwCgnXEAM5kaz0V0p2lgFoX8IB0R
UAsAn3afm4kVH6WtHDfwgUXpWSbZVppN
=SRap
-----END PGP SIGNATURE-----

--=-saZC8Tzg6fjby3G9jY0r--

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
ludo
Le #17800521
Bruno Muller a écrit :
Hello,

Il faut faire la différence entre le linker (ld, fournit par binutils)
qui est utilisé lors de la compilation et le linker/loader
(ld.so/ld-linux.so fournit par la glibc) utilisé à l'exécution : leur
fonctionnement est totalement indépendant.

Pour ld.so, les répertoires de recherche des lib dynamiques (.so) (hors
ceux par défauts : /lib et /usr/lib) sont indiqués dans /etc/ld.so.conf.

Pour ld, les répertoires de recherche des lib (.a) sont fixés lors de sa
compilation, si ceux par défaut ne conviennent pas, par la variable
LIB_PATH. On peut les connaître par la commande "ld
--verbose" (SEARCH_DIR).
En dehors de ces chemins il est nécessaire de passer par la variable
LIBDIR ou l'option -L.

Bruno



petite précision : LIB_PATH et LIBDIR : tu veux parler de variables dans
un makefile ?
LIB_PATH et LIBDIR comme var. d'env ne semblent pas prise en compte par ld
(sur le net, on trouve un "man ld" pour une vieille version qui parle de
LIBDIR et LLIBDIR, mais elles ne semblent plus utilisées)


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Publicité
Poster une réponse
Anonyme