Page suivante Page précédente Table des matières

4. Patches et exécutables

Arrivé à ce point, vous pouvez, si vous le voulez, vous arrêter. Vous avez installé tout ce qui est nécessaire à la compilation et à l'exécution de programmes ELF.

Vous pourriez cependant vouloir recompiler des programmes en ELF, que ce soit par amour du travail bien fait ou pour minimiser l'usage de la mémoire. Pour la plupart des applications destinées à l'utilisateur final, c'est plutôt simple. Cependant certains paquetages se reposent trop sur le système sur lequel ils tournent et pourraient planter pour l'une ou plusieurs des raisons qui suivent:

  • Conventions différentes pour le soulignement dans l'assembleur: dans un exécutable a.out, les labels externes reçoivent le préfixe _; pas en ELF. Cela ne fait pas de différence à moins que vous n'intégriez des instructions assembleur écrites à la main: toutes les étiquettes de la forme _foo doivent être traduites en foo, ou (si vous voulez conserver la portabilité) en EXTERNAL(foo)EXTERNAL est une macro qui retourne soit son argument (si __ELF__ est défini) soit _ concaténé avec son argument dans le cas contraire.
  • Différences de libc 5 par rapport à libc 4. L'interface pour le support local a changé, pour une fois.
  • L'application ou le processus de compilation selon la connaissance du format binaire utilisé --- emacs, par exemple, écrit l'image de sa mémoire sur le disque sous format binaire, vous avez donc besoin de savoir quel format vos fichiers compilés utilisent.
  • L'application est ou comprend des bibliothèques partagées (X11 en est un exemple trivial). Il faudra de manière évidente faire des modifications pour adapter les différentes méthodes de création de bibliothèques partagées en ELF.

Voici maintenant deux listes: la première présente les programmes qui nécessitaient des modifications pour pouvoir être compilés sous ELF (c'est-à-dire dont vous devez obtenir une nouvelle version pour pouvoir les compiler en ELF) et la seconde comporte des programmes qui nécessitent toujours des patches extérieurs.

4.1 Mise à jour:

  • Dosemu. Maintenant, dosemu tourne avec ELF. Les versions actuelles de dosemu sont disponibles sur ftp://tsx-11.mit.edu/pub/linux/ALPHA/dosemu/
  • e2fsutils. Les utilitaires pour e2fs versions 0.5c et plus se compilent sans modifications en ELF.
  • Emacs. Il y a potentiellement deux problèmes: (i) Emacs a une manière tout à fait particulière de se construire, à savoir qu'il faut en exécuter une version minimale, charger toutes les parties utiles en tant que lisp, et écrire l'image de sa mémoire sur le disque en tant que fichier binaire. (FSF) Emacs 19.29 et XEmacs 19.12 (anciennement Lucid Emacs) peuvent tous deux détecter que vous compilez en ELF et s'y adapter automatiquement. (ii) Si vous compilez une version de emacs sous ncurses, cela va rater à moins que vous n'éditiez au préalable src/s/linux.h dans la distribution emacs pour y ajouter la ligne #define TERMINFO quelque part près du début. Cela n'est pas nécessaire pour la version 19.31 mais l'est pour la version XEmacs 19.13. Il semblerait que cela soit réparé dans la 19.14.
  • gdb 4.16. Votre copie actuelle de gdb continuera de fonctionner comme par le passé mais le support de la bibliothèque partagée dans la 4.16 est bien meilleur, donc si vous voulez déboguer des programmes qui manipulent bizarrement cette zone, c'est une mise à jour qui vaut le coup.
  • Le Noyau. Les versions 2.0 du noyau (ou plus récentes) fonctionnent à merveille avec ELF; vous devez répondre "yes" à chacune des questions:
    Kernel support for ELF binaries (CONFIG_BINFMT_ELF) [Y/m/n/?]
    Compile kernel as ELF - if your GCC is ELF-GCC (CONFIG_KERNEL_ELF) [Y/n/?]
    
    quand vous exécutez make config (c'est également valable pour la plupart des noyaux de la série 1.3). Si vous utilisez encore le 1.2, veuillez consulter la liste qui suit.
  • perl 5. Perl 5.001m et + se compilent sans modification sur un système ELF complet avec chargement dynamique. Les versions actuelles de Perl peuvent être obtenues sur le CPAN (Comprehensive Perl Archive Network): voir ftp://ftp.funet.fi/pub/mirrors/perl/CPAN pour le site le plus proche de chez vous.
  • ps et top. Procps 0.98 et + marcheront avec ELF (les précédentes versions aussi mais elles ne sont pas en mesure de lire les WCHAN si vous en avez besoin). Prenez en considération que les noyaux de la série 2.0 ont de toute manière besoin de procps 0.99a ou plus.
  • Le programme cal dans util-linux 2.2 ne fonctionne pas. Passez à version 2.5 ou plus récent.
  • Mosaic. Je ne suis pas en mesure de le compiler par moi-même mais l'exécutable Mosaic 2.7b1 est disponible par l'intermédiaire de NCSA en ELF. Il a été lié sous une configuration X étrange, avec pour résultat sur les systèmes normaux qu'il dit ne pas trouver libXpm.so.4.5. Une manière simple de réparer cela est de l'éditer avec précaution avec emacs ou une autre éditeur qui prend en charge les fichiers exécutables. Cherchez l'occurrence de la chaîne libXpm.so.4.5^@ (où ^@ est un zéro ASCII --- caractère NUL)), effacez le .5 et ajoutez deux caractères de plus après le NUL pour ne pas modifier la longueur du fichier.

4.2 Patch

  • file. Il fonctionne de toute manière mais peut être amélioré: ftp://ftp.uk.linux.org/pub/Linux/libc/non-core/file.patch.
  • make-3.74 --- soit vous récupérez le code source sur un site GNU et appliquez le patch qui accompagne libc-5.3.12, soit vous récupérez l'exécutable make-3.74.gz sur tsx-11. Il y a un bogue dans le make de GNU qui ne se manifeste qu'avec les nouvelles versions ELF de libc --- cela vient en fait d'un bogue dans les anciennes versions de la libc de GNU, qui était aussi présent dans la libc Linux jusqu'à peu. Si vous conservez votre vieux programme make en a.out, il continuera de fonctionner mais si vous en voulez une version ELF il vous faut le patch. Les développeurs GNU de Make sont au courant du bogue et devraient un jour sortir une version corrigée.
  • Le noyau 1.2.x . 3 options s'offrent à vous:
    1. patcher légèrement le Makefile de manière à utiliser le compilateur a.out. cd /usr/src/linux/, coupez le patch qui suit et mettez-le dans patch -p1. Ou encore éditez le Makefile manuellement en utilisant ce qui suit comme guide; c'est suffisamment clair (effacez les lignes comportant un - et rajoutez les ligne avec un +.
      diff -u linux-1.2.13/Makefile.orig linux/Makefile
      --- linux-1.2.13/Makefile.orig  Wed Aug 16 20:53:26 1995
      +++ linux/Makefile      Fri Dec  8 16:19:49 1995
      @@ -12,9 +12,9 @@
       TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
      
      -AS     =as
      -LD     =ld
      -HOSTCC =gcc -I$(TOPDIR)/include
      -CC     =gcc -D__KERNEL__ -I$(TOPDIR)/include
      +AS     =/usr/i486-linuxaout/bin/as
      +LD     =ld  -m i386linux
      +HOSTCC =gcc -b i486-linuxaout -I$(TOPDIR)/include
      +CC     =gcc -b i486-linuxaout -D__KERNEL__ -I$(TOPDIR)/include
       MAKE   =make
       CPP    =$(CC) -E
       AR     =ar
      
      Autrement,
    2. Appliquez le patch de H J Luqui permet de compiler le noyau en ELF (et ajoute également comme possibilité de faire des core dumps ELF). On peut le trouver à ftp://ftp.cdrom.com/pub/linux/slackware_source/kernel-source/v1.2/linuxelf-1.2.13.diff.gz. Si vous utilisez une distribution ELF (RedHat 2.1, Slackware 3) qui est fournie avec un noyau de la série 1.2, vous vous rendrez certainement compte que ce patch ou un qui lui est similaire a déjà été appliqué. La meilleure idée est cependant de probablement
    3. Passer à la 2.0! 1.2 n'a jamais été prévu pour ELF après tout.
    Un autre problème va se poser pour la compilation du 1.2.13 avec gcc 2.7.2 et supérieur; il y avait un bogue dans asm/io.h qui est seulement détecté par gcc 2.7.2. Vous devez vous munir du patch ftp://ftp.uk.linux.org/pub/Linux/libc/misc/io.h.


Page suivante Page précédente Table des matières