Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Chemin de recherche de ld

14 réponses
Avatar
matlerouge
Bonjour

Je compile un prog mais on me dit :

/usr/bin/ld: skipping incompatible /usr/lib/../lib/libc.so when
searching for -lc
(...)
/usr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
/usr/bin/ld: cannot find -lc


En fait je fais du gros bricolage, mais bon.
J'ai donc mis la bonne libc dans un repertoire /libtmp (car je ne veux
pas corrompre l'autre libc : enfait je compile une nouvelle version de
gcc avec une version de gcc qui est pas faite pour mon systeme)

Je pensais qu'en configurant ld.so.conf en lui rajoutant /libtmp, puis
un ldconfig suffirais a faire chercher ld dans /libtmp. Mais je me suis
trompé : ld ne cherche toujours pas dans /libtmp.

Apparement en modifiant ld.so.conf on ne change que le repertoire de
recherche de lib dynamique a l'execution du prog c'est ca ?

Donc comment changer le chemin de recherche de ld en tant que lieur ?

Merci

10 réponses

1 2
Avatar
manuel viet
In article <41a8826a$0$27321$, matlerouge wrote:

Donc comment changer le chemin de recherche de ld en tant que lieur ?


Je n'ai pas la réponse sous mon chapeau, mais il me semble que ce point
est traité dans la documentation linux from scratch.

http://www2.fr.linuxfromscratch.org/lfs/news.html

--
(( Manuel Viet * mailto:
(^.^)
(")")

Avatar
no_spam
On Sat, 27 Nov 2004 13:37:37 +0000, manuel viet wrote:

In article <41a8826a$0$27321$, matlerouge wrote:

Donc comment changer le chemin de recherche de ld en tant que lieur ?


Je n'ai pas la réponse sous mon chapeau, mais il me semble que ce point
est traité dans la documentation linux from scratch.


et de façon très explicite dans le man...
Je ne l'ai pas en français, mais ce n'est pas dur à comprendre:
The linker uses the following search paths to locate required
shared libraries.

1. Any directories specified by -rpath-link options.

2. Any directories specified by -rpath options. The difference
between -rpath and -rpath-link is that directories specified by
-rpath options are included in the executable and used at run-
time, whereas the -rpath-link option is only effective at link
time. It is for the native linker only.

3. On an ELF system, if the -rpath and "rpath-link" options were
not used, search the contents of the environment variable
"LD_RUN_PATH". It is for the native linker only.

4. On SunOS, if the -rpath option was not used, search any direc-
tories specified using -L options.

5. For a native linker, the contents of the environment variable
"LD_LIBRARY_PATH".

6. For a native ELF linker, the directories in "DT_RUNPATH" or
"DT_RPATH" of a shared library are searched for shared
libraries needed by it. The "DT_RPATH" entries are ignored if
"DT_RUNPATH" entries exist.

7. The default directories, normally /lib and /usr/lib.

8. For a native linker on an ELF system, if the file
/etc/ld.so.conf exists, the list of directories found in that
file.

Pour les librairies static (.a), la recherche est plus simple puisque ld
ne fait que les points 4, 5 et 7.


Avatar
Nicolas George
matlerouge wrote in message <41a8826a$0$27321$:
Apparement en modifiant ld.so.conf on ne change que le repertoire de
recherche de lib dynamique a l'execution du prog c'est ca ?


Oui.

Donc comment changer le chemin de recherche de ld en tant que lieur ?


-L, comme le man de ld le dit. On peut forcer gcc à passer une option -L à
ld systématiquement en bidouillant ses specs.

Avatar
Jérémy JUST
On Sat, 27 Nov 2004 14:57:29 +0100
no_spam wrote:

Pour faire plus court:

5. For a native linker, the contents of the environment
variable "LD_LIBRARY_PATH".


Si le besoin est temporaire, ou limité à un seul utilisateur, définir
la variable LD_LIBRARY_PATH

8. For a native linker on an ELF system, if
the file /etc/ld.so.conf exists, the list of directories
found in that file.


Si le besoin est pérenne ou commun à tout le système, utiliser ça, et
aller lire le man de ldconfig(8) (ne pas oublier de reconstruire le
cache de ld).

--
Jérémy JUST

Avatar
Nicolas George
no_spam wrote in message :
Pour les librairies static (.a), la recherche est plus simple puisque ld
ne fait que les points 4, 5 et 7.


Tu dis des bêtises : la différence ne se fait pas sur la dualité
statique/partagées, mais sur la dualité compilation/exécution. Les points 4
et 7 concernent la recherche des bibliothèques, tant statiques que partagées
à la production du binaire, les autres points concernent la recherche des
bibliothèques partagées lors de l'exécution du binaire (mais dépendent
parfois des options ou variables utilisées lors de la compilation).

Pour fixer les idées, si on compile ainsi :

ld -o foo -rpath /opt/foo/lib $(OBJECTS) -L../bar -lbar

alors ld va chercher soit libbar.a soit libbar.a dans ../bar, mais à
l'exécution, les bibliothèques partagées seront cherchées dans /opt/foo/lib.

Avatar
JRD
Bonjour,

no_spam wrote:
On Sat, 27 Nov 2004 13:37:37 +0000, manuel viet wrote:

In article <41a8826a$0$27321$, matlerouge wrote:

Donc comment changer le chemin de recherche de ld en tant que lieur ?


Je n'ai pas la réponse sous mon chapeau, mais il me semble que ce point
est traité dans la documentation linux from scratch.


et de façon très explicite dans le man...
[page de manuel]

Pour les librairies static (.a), la recherche est plus simple puisque ld
ne fait que les points 4, 5 et 7.


Compiler le compilateur gcc est un cas à part.
C'est un peu comme écrire un système d'exploitation sur une machine
sans système d'exploitation mais qui doit fonctionner quand même!

Ce n'est pas forcément le bon gros programme à compiler pour s'amuser
ou apprendre.

Dans mes souvenirs (lontains!), gcc se compilait de manière récursive:

1- Compilation de gcc(n+1) avec gcc(n);
2- Verification du fonctionnement de gcc(n+1);
3- Installation de gcc(n+1) (Avec sauvegarde de gcc(n), évidemment!);
4- Compilation de gcc(n+1) avec gcc(n+1) fraichement installé.
5- Refaire point 2 puis point 3
6- Recommencer les points 4, 2 puis 3.

Généralement, deux "passes" suffisent pour avoir un gcc(n+1) optimisé.

Le mieux est quand même de voir le site de gcc :
http://gcc.gnu.org/

JRD.
Ancien bidouilleur ;-)
--
jerome (dot) drapeau <at> free (dot) fr
http://jerome.drapeau.free.fr
La critique est aisée, l'art est difficile.



Avatar
no_spam
On Sat, 27 Nov 2004 14:48:23 +0000, Nicolas George wrote:

no_spam wrote in message :
Pour les librairies static (.a), la recherche est plus simple puisque ld
ne fait que les points 4, 5 et 7.


Tu dis des bêtises : la différence ne se fait pas sur la dualité
statique/partagées, mais sur la dualité compilation/exécution. Les points 4
et 7 concernent la recherche des bibliothèques, tant statiques que partagées
à la production du binaire,


C'est exactement ce que je dit...

les autres points concernent la recherche des
bibliothèques partagées lors de l'exécution du binaire (mais dépendent
parfois des options ou variables utilisées lors de la compilation).


Ils sont aussi utilisé par ld au moment de la compil: il vérifie qu'il
peut bien résoudre tous les symboles des libraries partagées au moment
du link.
Le fonctionnement du linker dynamique est différent et est indépendant
des options du link lors de la compilation.

Pour fixer les idées, si on compile ainsi :

ld -o foo -rpath /opt/foo/lib $(OBJECTS) -L../bar -lbar

alors ld va chercher soit libbar.a soit libbar.a dans ../bar, mais à
l'exécution, les bibliothèques partagées seront cherchées dans /opt/foo/lib.


Il va aussi chercher les libs dynamiques au moment du link dans
/opt/foo/lib.
Le linker dynamique (/lib/ld-linux.so) ira chercher dans /opt/foo/lib
dans le cas de l'option -rpath uniquement parce que le linker aura
rajouté un attribut "DT_RPATH" dans la section de load dynamique du
fichier ELF.
D'autre part les options -L sont bien utilisées par ld pour linker, que
les librairies soient statiques _ou_ dynamiques, mais ne génèrent pas
d'information pour le linker dynamique. Si celui ci n'est pas correctement
configuré, le programme ne s'executera pas, même si le bon chemin a
été spécifié lors du link avec -L et que ld a vérifié (c'est quand
même la base de son boulot !) que la librairie est présente et que tous
les symboles sont résolus.


Avatar
matlerouge
JRD wrote:
(...)
Compiler le compilateur gcc est un cas à part.
C'est un peu comme écrire un système d'exploitation sur une machine
sans système d'exploitation mais qui doit fonctionner quand même!

Ce n'est pas forcément le bon gros programme à compiler pour s'amuser
ou apprendre.



En fait je fais ca car gentoo sur amd64 ne suporte pas gnat, donc j'ai
choper le compilo gcc de la redhat : il suporte gnat (et qui est en
version 3.3.3), et j'aimerais bien recompiler mon gcc 3.4.3 avec le
suport d'ada (donc en le compilant avec le gcc de la redhat). Mais ca
marche tres difficilement vu qu'il faut aussi les librairies de la
redhat et tout et tout.

Je vais donc lacher l'affaire, je cree un compte "gnat" qui utilise le
gcc de redhat, et les aures compte le gcc de la gentoo. C'est pas tres
joli mais ca a la merite de marcher.

Dans mes souvenirs (lontains!), gcc se compilait de manière récursive:

1- Compilation de gcc(n+1) avec gcc(n);
2- Verification du fonctionnement de gcc(n+1);
3- Installation de gcc(n+1) (Avec sauvegarde de gcc(n), évidemment!);
4- Compilation de gcc(n+1) avec gcc(n+1) fraichement installé.
5- Refaire point 2 puis point 3
6- Recommencer les points 4, 2 puis 3.


Oui oui c toujours le cas quand tu fais un make bootstrap !

Avatar
Nicolas George
no_spam wrote in message :
Pour les librairies static (.a), la recherche est plus simple puisque ld
ne fait que les points 4, 5 et 7.
Tu dis des bêtises : la différence ne se fait pas sur la dualité

statique/partagées, mais sur la dualité compilation/exécution. Les points 4
et 7 concernent la recherche des bibliothèques, tant statiques que partagées
à la production du binaire,
C'est exactement ce que je dit...



Non. D'ailleurs je laisse la citation, pour que tout le monde puisse s'en
rendre compte : tu prétends qu'il y a une différence entre le cas statique
et le cas partagé.

Ils sont aussi utilisé par ld au moment de la compil:


Non, cf. plus bas.

il vérifie qu'il
peut bien résoudre tous les symboles des libraries partagées au moment
du link.


Oui, mais ce n'est pas de ça qu'il est question.


Le fonctionnement du linker dynamique est différent et est indépendant
des options du link lors de la compilation.


Stricto sensu, c'est vrai. Mais les options de liaison lors de la
compilation influent sur les options présentes dans le binaire, qui à leur
tour influent sur le fonctionnement du chargeur dynamique.

ld -o foo -rpath /opt/foo/lib $(OBJECTS) -L../bar -lbar


Il va aussi chercher les libs dynamiques au moment du link dans
/opt/foo/lib.


Non, il ne le fait pas. Tu peux essayer.



Avatar
no_spam
On Sat, 27 Nov 2004 16:31:34 +0000, Nicolas George wrote:

no_spam wrote in message :
Pour les librairies static (.a), la recherche est plus simple puisque ld
ne fait que les points 4, 5 et 7.
Tu dis des bêtises : la différence ne se fait pas sur la dualité

statique/partagées, mais sur la dualité compilation/exécution. Les points 4
et 7 concernent la recherche des bibliothèques, tant statiques que partagées
à la production du binaire,
C'est exactement ce que je dit...



Non. D'ailleurs je laisse la citation, pour que tout le monde puisse s'en
rendre compte : tu prétends qu'il y a une différence entre le cas statique
et le cas partagé.

Ils sont aussi utilisé par ld au moment de la compil:


Non, cf. plus bas.


Si tu développait tous les jours par exemple en cross-developpement (donc
en utilisant pas les libraries systèmes), tu te rendrais vite compte que
de c'est délirant...
Donc, non seulement ils sont utilisé par ld, mais en plus ils sont
___indispensables___ pour que ld fonctionne !

peut bien résoudre tous les symboles des libraries partagées au moment
du link.


Oui, mais ce n'est pas de ça qu'il est question.


Je rapelle le contenu du début du thread:
"Donc comment changer le chemin de recherche de ld en tant que lieur ?"
ld, c'est le linker au moment de la compil, pas le linker dynamique.

Le fonctionnement du linker dynamique est différent et est indépendant
des options du link lors de la compilation.


Stricto sensu, c'est vrai. Mais les options de liaison lors de la
compilation influent sur les options présentes dans le binaire, qui à leur
tour influent sur le fonctionnement du chargeur dynamique.


C'est exactement ce que j'ai dit, cf:
"Le linker dynamique (/lib/ld-linux.so) ira chercher dans /opt/foo/lib
dans le cas de l'option -rpath uniquement parce que le linker aura
rajouté un attribut "DT_RPATH" dans la section de load dynamique du
fichier ELF.".

ld -o foo -rpath /opt/foo/lib $(OBJECTS) -L../bar -lbar


Il va aussi chercher les libs dynamiques au moment du link dans
/opt/foo/lib.


Non, il ne le fait pas. Tu peux essayer.


Il est bien obligé, sinon explique moi comment il résoud les symboles ?
Je te rapelle que ld doit résoudre _tous_ les symboles pour arriver à
linker un executable, même si celui-ci est dynamique. Je ne vois pas
comment il ferait sans accéder aux librairies ! C'est absurde !




1 2