[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: