|
Documentation NetBSD :FAQ ELF de NetBSD |
Il en existe aussi avec le programme de chargement : ld.elf_so. Sur de nombreux système, ce chemin se résume à /usr/lib. Sur les version de NetBSD précédant la 1.4, la recherche s'effectue aussi dans /usr/local/lib.
Le premier mécanisme de localisation est la liste de recherche «rpath» incluse dans l'image de l'exécutable. Cette liste est établie à l'aide de la directive -R de ld(1). La syntaxe POSIX pour les options de ld est :
-Wl,option,option,...
Par exemple : -Wl,-R/usr/quelquechose/lib.
Plusieurs directives -R peuvent être données à un seul programme afin de créer une liste de chemins d'accès aux bibliothèques partagées.
Cette directive est aussi connue sous le nom de -rpath. L'avantage de -R est que ça marche aussi sur les anciennes versions de NetBSD.
L'idée est que le Makefile ne cherchera à lier que le simple fichier .so (qui voudrait changer tous les Makefiles uniquement parce qu'une nouvelle version de bibliothèque est sortie ?). Cependant, une fois lié, le programme veut connaitre la version majeure mais ne veut pas utiliser de version mineure.
La bibliothèque elle-même sait qu'elle est libgizmo.so.4 car la directive -soname libgizmo.so.4 a été utilisée lors de sa création. Le programme sait qu'il utilisera la version majeure 4 car l'éditeur de liens a copié la chaine DT_SONAME, qui vaut libgizmo.so.4, de la bibliothèque dans l'exécutable.
N'utilisez pas -soname libgizmo.so car le programme utiliserait la dernière version majeure et pourrait se bloquer si elle a changé (le nombre majeur change lorsque la nouvelle bibliothèque devient incompatible). De même, n'utilisez pas -soname libgizmo.so.4.2 car une modification compatible qui augmente le nombre mineur casserait inutilement le lien.
cc -O -Werror -c -fpic -DPIC f.c -o f.so
ar cq libf_pic.a `NM=nm lorder f.so | tsort -q`
ld -x -shared -R/my/directory/lib -soname libf.so.4 -o
libf.so.4.9 /usr/lib/crtbeginS.o --whole-archive
libf_pic.a /usr/lib/crtendS.o
Une autre façon :
% cat Makefile
LIB=f
SRCS=f.c
.include <bsd.lib.mk>
% cat shlib_version
major=4
minor=9
% make
Vous pouvez désactiver certaines cibles du Makefile avec NOPROFILE=1 et NOSTATICLIB=1.
Encore une autre façon :
libtool- Le paquetagelibtoolest un gros script shell destiné à gérer les bibliothèques statiques et dynamiques indépendamment de la machine. Il existe un paquetage NetBSD libtool et même une page d'accueillibtool.
En fait, quelques développeurs du système ELF ont apparamment ajouté un tel fichier mais avec des résultats mitigés. Le mécanisme ELF a été conçu pour corriger certains problèmes donc réintroduire l'ancien mécanisme peut les faire revenir.
Actuellement, nous supportons la fonctionnalité /etc/ld.so.conf dans notre éditeur de liens ELF mais rien ne prouve que la solution hybride soit la meilleure. Pour cette raison, son existance n'est pas dévoilée, son utilisation n'est pas encouragée et un modèle d'installation par défaut est proposé. Cela existe pour ceux qui pensent qu'ils en ont réellement besoin et ne peuvent vivre sans.
Voici quelques problèmes.
Les outils ELF sont des paquetages standardisés entretenus par des tierces parties. Ils sont constamment utilisés sur les différents systèmes et plate-formes. A long terme, la standardisation d'ELF améliore la qualité à la fois des systèmes et des applications.
#!/bin/sh -x -e SRC=/usr/src # Si src est une mise à jour, pe : vers -current, de même que config, # vous pouvez recompiler make : ### cp /usr/bin/make /usr/bin/make.old ### cd $SRC/usr.bin/make && make && make install # par la même occasion, /bin/sh, flex, etc # variables magiques de compilation export DESTDIR=/../. # bidouille d'enfer export OBJECT_FMT=a.out export BOOTSTRAP_ELF=YESSIREE # MàJ des fichiers .mk pour les nouvelles variables cd $SRC/share/mk && make install # Effacer les anciens objets cd $SRC && make cleandir # Éventuellement utile : ### cd $SRC/gnu && make depend # Outils de compilation cd $SRC/gnu/usr.bin/binutils && make cd ../gas.new && make cd ../ld.new && make cd ../egcs && make # (copier ici les anciens outils a.out, au cas où) cd $SRC/gnu/usr.bin/binutils && make install cd ../gas.new && make install cd ../ld.new && make install cd ../egcs && make install # Éventuellement utile : ### cd $SRC/gnu/lib/libbfd && make # compilation ELF native export OBJECT_FMT=ELF # MàJ des fichiers inclus et bibliothèques de base cd $SRC && make includes cd $SRC/lib/csu && make && make install cd $SRC/lib && make && make install # Éditeur de liens dynamiques (besoin de libc_pic.a) cd $SRC/libexec/ld.elf_so && make && make install # fin de compilation cd $SRC/gnu/lib && make && make install cd $SRC && make && make install
Si vous devez effectuer des modifications au script ci-dessus, faites-le nous savoir en écrivant à <www@NetBSD.org>.
if echo __ELF__ | ${CC:-cc} -E - | grep -q __ELF__
then echo "Pas ELF"
else echo "Le système est ELF"
fi
|
|