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 [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Répondre à