linker ld : chemin de recherche par défaut des lib, modification des chemins de recherche des lib
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 ?
Reply to: