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]