Depuis ses toutes premières versions, Linux supporte les binaires au format a.out. Récemment, le support pour les binaires au format ELF a été intégré dans le noyau et une distribution des bibliothèques partagées au format ELF a été faite. Les avantages du format ELF par rapport au format a.out sont nombreux :
dlopen()
, dlsym()
et
dlclose()
Les dernières versions des distributions sont basées sur le format ELF. Ce qui suit n'a donc de sens que si tu ne possèdes pas une version récente et si tu veux mettre à jour toi même au fur à mesure. Attention : cela peut être long et périlleux.
La première version publique des utilitaires et des bibliothèques ELF
a été diffusée en mai 1995. La version à jour des bibliothèques
ELF et des outils associés est disponible sur les sites FTP
tsx-11.mit.edu
et sunsite.unc.edu
ainsi que sur leur miroir
français ftp.ibp.fr
, dans le répertoire /pub/linux/GCC
.
Il est possible d'utiliser cette distribution pour mettre à jour ses bibliothèques. Toutefois, il est fortement recommandé d'utiliser une distribution binaire basée sur ELF (comme Slackware 3.1 ou Red Hat 4.0).
Enfin bon, si tu souhaites quand même faire la mise à jour toi-même, voici la liste des fichiers à récupérer :
binutils-2.7.0.3.bin.tar.gz
: les utilitaires (as, ld, ...),binutils-2.7.0.3.tar.gz
: les sources des utilitaires
(as, ld, ...),gcc-2.7.2.1.bin.tar.gz
: le compilateur GCC 2.7.2.1,ld.so-1.8.5.tar.gz
: l'éditeur de liens dynamique,libc-5.4.17.bin.tar.gz
: les bibliothèques au format ELF,libc-5.4.17.tar.gz
: les sources des bibliothèques,libg++-2.7.2.1.bin.tar.gz
: la bibliothèque C++ au format ELF.Il est impératif de suivre à la lettre les instructions qui suivent. En effet, il est très facile de rendre son système inutilisable lors de la mise à jour des bibliothèques, et c'est encore plus vrai lors de la transition entre les formats a.out et ELF.
La procédure de mise à jour est la suivante :
# cd /usr/src # tar xvfz /.../ld.so-1.8.5.tar.gz # cd ld.so-1.8.5 # sh instldso.sh
# mkdir -p /usr/i486-linuxaout/bin /usr/i486-linuxaout/lib # echo "/usr/i486-linuxaout/lib" >> /etc/ld.so.conf # ldconfig -v # cd /usr/lib # mv *.o *.a *.sa lib*.so.* /usr/i486-linuxaout/lib # cd /lib # mv *.o *.a *.sa lib*.so.* /usr/i486-linuxaout/lib # ldconfig -v # cd /usr # mv include /usr/i486-linuxaout
# cd / # tar xvfz /.../libc-5.4.17.bin.tar.gz # tar xvfz /.../libg++-2.7.2.1.bin.tar.gz # ldconfig -v
# cd / # tar xvfz /.../gcc-2.7.2.1.bin.tar.gz # rm -rf /usr/lib/ldscripts # rm -f /usr/bin/as /usr/bin/as.1.38.1l.2 /usr/bin/as.2.2l # rm -f /usr/bin/ld /usr/bin/ld.1.9l.4 # tar xvfz /.../binutils-2.7.0.3.bin.tar.gz
Voilà ! Tu as maintenant un système dans lequel coexistent les
bibliothèques aux formats a.out (sous /usr/i486-linuxaout/lib
) et ELF
(sous /lib
et /usr/lib
). Les anciens binaires doivent
continuer à s'exécuter correctement.
Attention, si tu utilises des systèmes de fichiers différents pour
/
et /usr
, tu risques d'avoir des problèmes au démarrage
de la machine. En effet, les anciennes bibliothèques étant dans
/usr/i486-linuxaout/lib
, elles ne sont pas accessibles tant que
/usr
n'est pas monté, ce qui peut empêcher un démarrage normal
du système. Si tu es dans ce cas, il faut impérativement que tu déplaces
au moins l'image a.out de la bibliothèque C :
# cd /usr/i486-linuxaout/lib # mv libc.so.* /lib # ldconfig -v
Maintenant que tu as installé les utilitaires et les bibliothèques ELF, il ne te reste plus qu'à recompiler tous les programmes que tu utilises pour bénéficier de ce nouveau format d'exécutable. Il te faut donc retrouver les sources de tous tes programmes et les compiler un par un (bon courage, ça peut prendre pas mal de temps :-). Tu peux également récupérer des binaires déjà compilés sur les sites FTP Linux, beaucoup sont désormais au format ELF.
Il est à noter que certains programmes nécessitent des modifications pour être compilables en ELF, c'est notamment le cas du noyau Linux (version 1.2.x) ainsi que de tous les logiciels contenant des bibliothèques partagées.
Sur le site ftp.ibp.fr
, le répertoire /pub/linux/ELF
contient des patches pour certains programmes.
Les nouvelles versions du compilateur et des utilitaires génèrent
des exécutables au format ELF, par défaut. Il est possible de créer des
exécutables au format a.out en utilisant l'option -b i486-linuxaout
lors de l'appel de gcc.
Il est désormais assez facile de construire des bibliothèques dynamiques.
Les fichiers source doivent être compilés avec l'option -fPIC
afin
que le code généré puisse s'exécuter à n'importe quelle adresse (les
bibliothèques dynamiques sont chargées à des adresses non prévisibles
aussi le code
doit être indépendant de son adresse physique). L'option -shared
de gcc permet ensuite de générer une bibliothèque dynamique.
Par exemple, pour générer une bibliothèque libtruc.so.1.0
, on
utilisera les commandes suivantes :
$ gcc -c -fPIC *.c $ gcc -shared -Wl,-soname,libtruc.so.1 -o libtruc.so.1.0 *.o
Quelques documents concernant ELF sont disponibles sur
ftp.ibp.fr
dans /pub/linux/ELF/doc
. Il s'agit de :
ELF.doc.tar.gz
: la spécification du format ELF,ELF.ps.gz
: un article, écrit par H.J. Lu, décrivant
l'implémentation du format ELF dans Linux,move_to_elf.gz
: une description de la transition entre les
formats a.out et ELF.Il est également possible d'en apprendre plus sur ELF par les URL suivants :
http://www.intac.com/~cully/elf.html
http://www.sjc.ox.ac.uk/users/barlow/linux-gcc.html
Next Chapter, Previous Chapter
Table of contents of this chapter, General table of contents
Top of the document, Beginning of this Chapter