13. ELF

Contents of this section

13.1 Introduction

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 :

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.

13.2 Installation

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 :

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 :

  1. Installation de l'éditeur de liens dynamique
    # cd /usr/src
    # tar xvfz /.../ld.so-1.8.5.tar.gz
    # cd ld.so-1.8.5
    # sh instldso.sh
    
  2. Sauvegarde des anciennes bibliothèques (au format a.out)
    # 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
    
  3. Installation des nouvelles bibliothèques
    # cd /
    # tar xvfz /.../libc-5.4.17.bin.tar.gz
    # tar xvfz /.../libg++-2.7.2.1.bin.tar.gz
    # ldconfig -v
    
  4. Installation des nouveaux utilitaires
    # 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

13.3 Migration vers un système tout-ELF

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.

13.4 Utilisation des utilitaires ELF

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

13.5 Sources d'information sur ELF

Quelques documents concernant ELF sont disponibles sur ftp.ibp.fr dans /pub/linux/ELF/doc. Il s'agit de :

Il est également possible d'en apprendre plus sur ELF par les URL suivants :


Next Chapter, Previous Chapter

Table of contents of this chapter, General table of contents

Top of the document, Beginning of this Chapter