Les inventions ingénieuses, la technologie qui émancipe, la culture et la technique des bidouilles.
The ingenious inventions, the liberating or locking up technology, hacker culture and techniques.

Derniers articles

Ailleurs...

Formats Ouverts

My activity on Github

tonin on GitHub

Planet Ubuntu

Ubuntu News

<   mardi 2 avril 2013   >

Sur une machine ayant un noyau amd64, il faut normalement installer des exécutables compilés pour cette architecture. Vous devez cependant savoir que la plupart des processeurs 64 bits sont bien capables de faire tourner les exécutables 32 bits sans problème. Le tout est d’avoir tous les morceaux de l’exécutable à portée de main, ce qui n’est pas toujours évident lorsqu’ils utilisent des bibliothèques partagées.

Voici un petit mode d’emploi pratico-pratique pour faire tout cela sur une Debian Squeeze [1]. Comme exemple, nous prendrons le logiciel webalizer évolué et re-distribué par Stone Steps. On trouve le paquet Debian (i386 donc) dans le dépôt d’Izzy Soft.

Installer l’exécutable

Pour commencer, nous devons installer l’exécutable que nous voulons faire tourner sur notre machine. Utilisez un paquet .deb ou un tarball, cela dépendra de ce que vous avez à votre disposition. Si c’est un .deb, pour l’installation, nous devons forcer dpkg à ne pas porter attention à la différence d’architecture (--force-architecture), ni aux dépendances que nous devrons ensuite installer manuellement (--force-depends).

wget http://apt.izzysoft.de/ubuntu/dists/generic/index.php?file=webalizer-stonesteps_3.10.2.5-izzy1_i386.deb -O webalizer-stonesteps_3.10.2.5-izzy1_i386.deb
dpkg -i --force-architecture --force-depends webalizer-stonesteps_3.10.2.5-izzy1_i386.deb

Installer la couche de compatibilité i386

Pour pouvoir lancer un exécutable i386 utilisant des bibliothèques partagées, le plus simple est d’utiliser le paquet de rétro-compatibitilité ia32-libs Il contient un ensemble de base des bibliothèques les plus utiles. Celles-ci s’installent alors dans des répertoires différents des bibliothèques natives. Les unes vont dans /lib32 et /usr/lib32, les autres dans /lib64 et /usr/lib64. Le dynamic library linker de Debian a été modifié pour fournir, lors de l’exécution, la bonne bibliothèque en fonction de l’architecture pour laquelle le logiciel a été compilé.

aptitude install ia32-libs

Chercher les bibliothèques manquantes

Si nous avons de la chance, notre exécutable i386 peut s’exécuter directement. Mais il est probable qu’il utilise des bibliothèques partagées supplémentaires, il faut donc les installer manuellement. Pour cela, vous pouvez utiliser ldd qui vous montrera la liste des bibliothèques manquantes. Il faut ensuite aller les chercher manuellement sur un dépôt Debian (veillez à bien prendre les paquets correspondants à votre distribution, ici Squeeze).

ldd /usr/bin/webalizer
	linux-gate.so.1 =>  (0xf77ab000)
	libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf76ac000)
	libdl.so.2 => /lib32/libdl.so.2 (0xf76a8000)
	libpthread.so.0 => /lib32/libpthread.so.0 (0xf768e000)
	libdb_cxx-4.6.so => not found
	libgd.so.2 => not found
	libz.so.1 => /usr/lib32/libz.so.1 (0xf767a000)
	libgcc_s.so.1 => /usr/lib32/libgcc_s.so.1 (0xf765c000)
	libc.so.6 => /lib32/libc.so.6 (0xf7514000)
	libm.so.6 => /lib32/libm.so.6 (0xf74ee000)
	/lib/ld-linux.so.2 (0xf77ac000)
wget http://ftp.fr.debian.org/debian/pool/main/libg/libgd2/libgd2-xpm_2.0.36~rc1~dfsg-5_i386.deb
wget http://ftp.fr.debian.org/debian/pool/main/d/db4.6/libdb4.6_4.6.21-16_i386.deb
wget http://ftp.fr.debian.org/debian/pool/main/d/db4.6/libdb4.6++_4.6.21-16_i386.deb

Attention, n’installez pas ces paquets de la manière habituelle, ne forcez pas non plus l’architecture, car alors vous remplaceriez vos bibliothèques 64 bits. Il va falloir faire une installation manuelle.

Installer les bibliothèques manquantes

Les paquets que nous venons de télécharger installent les bibliothèques dans /usr/lib/, or nous aimerions qu’elles soient dans /usr/lib32/ (comme pour le paquet ia32-libs). Pour y arriver, nous sommes obligés d’installer ces paquets dans un répertoire annexe (ex : /emul/ia32-linux/), et de copier, ou, plus simple, de faire un lien symbolique, vers le répertoire pour l’architecture 32 bits.

mkdir -p /emul/ia32-linux/usr
ln -s /usr/lib32/ /emul/ia32-linux/usr/lib
ln -s /lib32/ /emul/ia32-linux/lib
dpkg -X libdb4.6_4.6.21-16_i386.deb /emul/ia32-linux/
dpkg -X libdb4.6++_4.6.21-16_i386.deb /emul/ia32-linux/
dpkg -X libgd2-xpm_2.0.36~rc1~dfsg-5_i386.deb /emul/ia32-linux/

Vous pourrez alors vérifier que votre exécutable trouve bien toutes les bibliothèques partagées dont il a besoin (et vérifiez qu’il les trouve dans les répertoires 32 bits, ou nativement). On peut alors essayer de l’exécuter.

ldd /usr/bin/webalizer
	linux-gate.so.1 =>  (0xf7707000)
	libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf7608000)
	libdl.so.2 => /lib32/libdl.so.2 (0xf7604000)
	libpthread.so.0 => /lib32/libpthread.so.0 (0xf75ea000)
	libdb_cxx-4.6.so => /usr/lib32/libdb_cxx-4.6.so (0xf7499000)
	libgd.so.2 => /usr/lib32/libgd.so.2 (0xf7457000)
	libz.so.1 => /usr/lib32/libz.so.1 (0xf7443000)
	libgcc_s.so.1 => /usr/lib32/libgcc_s.so.1 (0xf7425000)
	libc.so.6 => /lib32/libc.so.6 (0xf72de000)
	libm.so.6 => /lib32/libm.so.6 (0xf72b7000)
	/lib/ld-linux.so.2 (0xf7708000)
	libXpm.so.4 => /usr/lib32/libXpm.so.4 (0xf72a7000)
	libX11.so.6 => /usr/lib32/libX11.so.6 (0xf718a000)
	libjpeg.so.62 => /usr/lib32/libjpeg.so.62 (0xf716a000)
	libfontconfig.so.1 => /usr/lib32/libfontconfig.so.1 (0xf713b000)
	libfreetype.so.6 => /usr/lib32/libfreetype.so.6 (0xf70c2000)
	libpng12.so.0 => /lib32/libpng12.so.0 (0xf709e000)
	libxcb.so.1 => /usr/lib32/libxcb.so.1 (0xf7085000)
	libexpat.so.1 => /usr/lib32/libexpat.so.1 (0xf705f000)
	libXau.so.6 => /usr/lib32/libXau.so.6 (0xf705c000)
	libXdmcp.so.6 => /usr/lib32/libXdmcp.so.6 (0xf7056000)
/usr/bin/webalizer

Remarques

Comme nous avons installé des paquets de manière manuelle, leur mise à jour (par exemple pour corriger des failles de sécurité) devra également être faite manuellement. Il faudra tenir compte de cette spécificité lors de la maintenance de votre machine, surtout si c’est une machine publique ou sensible.

Cette procédure d’installation est valable pour Debian Squeeze. Wheezy (la 7e version de Debian) permet d’avoir des paquets multi-architecture. Ce qui veut dire que les paquets de libgd, par exemple, pour 32 bits et 64 bits pourraient co-exister dans /usr/lib64/ et dans /usr/lib32/ Il ne sera alors plus nécessaire de passer par un répertoire annexe pour leur installation, du moins si tous les paquets supportent l’installation en multi-architecture.

Petit point supplémentaire à noter, lors de la mise à jour de Squeeze vers Wheezy, il sera également nécessaire de dire aux outils de gestion des paquets qu’ils doivent travailler en multi-architecture.

Pour les distributions autres que Debian, j’imagine qu’il doit exister un paquet semblable à ia32-libs et un fonctionnement similaire, mais je ne peux vous en dire plus.

< brève précédente    -    brève suivante >

[1Il est probable que dans les versions ultérieures de Debian, tout cela devienne plus facile, bien que ce ne soit pas encore sûr.


plouf Creative Commons -  Espace privé -  XHTML -  CSS -  v1.1.4