Ce paragraphe est en fait un peu court : il sera �tendu dans une version ult�rieure d�s que j'aurai r�cup�r� le HowTo ELF
Linux poss�de des biblioth�ques dynamiques, comme on vous le r�p�te depuis le d�but de ce document ! Or, il existe un syst�me pour reporter le travail d'association des noms des symboles et de leur adresse dans la biblioth�que, qui est normalement effectu� lors de l'�dition de liens en l'effectuant lors du chargement du programme.
Envoyez moi vos erreurs ! Je n'en fait pas grand chose sauf les ins�rer dans ce paragraphe...
can't load library: /lib/libxxx.so, Incompatible version
(seulement a.out) Cela signifie que vous n'avez pas la version correcte de la biblioth�que (num�ro dit majeur). Non, il n'est pas possible d'effectuer un lien symbolique sur la biblioth�que que vous poss�dez : si vous avez de la chance, vous obtiendrez un segmentation fault. R�cup�rez la nouvelle version. Un message un peu �quivalent existe �galement sur les syst�mes ELF :
ftp: can't load library 'libreadline.so.2'
warning using incompatible library version xxx
(seulement a.out) Vous avez un num�ro de version de biblioth�que (mineur) inf�rieur � la version avec laquelle a �t� compil� le programme. Le programme fonctionnera s�rement. Une mise � jour est toutefois conseill�e.
Il existe certaines variables d'environnements que le chargeur dynamique
utilise. Beaucoup sont exploit�es par le programme ldd
lorsqu'il
s'agit de particularit�s de l'environnement de l'utilisateur, ce qui
peuvent �tre positionn�es pour lancer ldd avec des options
particuli�res. Voici une description des diff�rentes variables d'environnement
que vous pouvez rencontrer :
LD_BIND_NOW
--- normalement, les fonctions ne sont
pas cherch�es dans les biblioth�ques avant leur appel. En positionnant
cette option, vous v�rifiez que toutes les fonctions employ�es dans
votre programmes se trouvent bien dans la biblioth�que lors de son
chargement, ce qui ralentit le lancement du programme. C'est utile lorsque
vous voulez tester que l'�dition de liens s'est parfaitement d�roul�e
et que tous les symboles sont bien associ�s.
LD_PRELOAD
peut �tre d�fini avec un nom de fichier
qui contient des fonctions surchargeant des fonctions d�j� existantes.
Par exemple, si vous testez une strat�gie d'allocation m�moire,
et que vous voulez remplacer le malloc de la biblioth�que C par le
v�tre situ� dans un module ayant pour nom malloc.o
, il vous suffit
de faire :
$ export LD_PRELOAD=malloc.o
$ test_mon_malloc
LD_ELF_PRELOAD
et LD_AOUT_PRELOAD
sont similaires, mais
leur utilisation est sp�cifique au type de binaire utilis�. Si
LD_
TypeBinaire_PRELOAD
et LD_PRELOAD
sont positionn�s,
celui correspondant le mieux � la machine est utilis�.
LD_LIBRARY_PATH
contient une liste de r�pertoires contenant
les biblioth�ques dynamiques. Cela n'affecte pas l'�dition de liens :
cela n'a qu'un effet lors de l'ex�cution. Il faut noter qu'elle est
d�sactiv�e pour des programmes qui s'ex�cutent avec un setuid ou un setgid.
Enfin, LD_ELF_LIBRARY_PATH
et
LD_AOUT_LIBRARY_PATH
peuvent �tre utilis�s pour orienter le mode de
compilation du binaire. LD_LIBRARY_PATH
ne devrait pas �tre n�cessaire en principe : ajoutez les r�pertoires dans le
fichier /etc/ld.so.conf/
et relancez ldconfig.
LD_NOWARN
s'applique au format a.out uniquement. Lorsqu'elle
est positionn�e (c.a.d si elle existe par exemple avec
LD_NOWARN=true; export LD_NOWARN
) cela arr�te le chargeur du programme
m�me sur des avertissements insignifiants (tels que des messages
d'incompatibilit�s de num�ros mineurs de version).
LD_WARN
s'applique � ELF uniquement. Lorsqu'elle est
positionn�e, on transforme le message habituellement fatal Can't find
library en un avertissement. Ce n'est pas positionn� par d�faut mais
c'est important pour un programme comme ldd.
LD_TRACE_LOADED_OBJECTS
s'applique � ELF uniquement, et
permet de simuler l'ex�cution des programmes comme s'ils l'�taient
par ldd
:
$ LD_TRACE_LOADED_OBJECTS=true /usr/bin/lynx
libncurses.so.1 => /usr/lib/libncurses.so.1.9.6
libc.so.5 => /lib/libc.so.5.2.18
Cela ressemble �norm�ment au syst�me de chargement dynamique
utilis� sous Solaris 2.x. Ce syst�me est d�crit d'une
mani�re pr�cise dans le document expliquant la programmation
avec ELF �crit par H J Lu et dans la page de manuel
dlopen(3)
, qui se trouve dans le paquetage ld.so.
Voici un exemple simple : pensez � faire l'�dition de liens avec
-ldl
#include <dlfcn.h>
#include <stdio.h>
main()
{
void *libc;
void (*printf_call)();
if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY))
{
printf_call = dlsym(libc,"printf");
(*printf_call)("Bonjour ! Ha ben ca marche pil poil sous Linux !\n");
}
}
Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:30