Fonctionnement multilib

0 se veut 100% multilib, des versions alpha aux versions epsilon. La distribution contient les bibliothèques 32 bits et 64 bits de chaque paquet lorsque celui-ci fournit des bibliothèques. Il est donc possible de compiler ET d'exécuter des programmes 32 bits ou 64 bits nativement.

Mécanisme multilib

  • /usr/lib et /lib contiennent les bibliothèques 32 bits, compilées généralement avec les drapeaux de GCC suivants :
    • gcc -m32 -O2 -march=i686 -pipe
  • /usr/lib64 et /lib64 contiennent les bibliothèques 64 bits, compilées généralement avec les drapeaux de GCC suivants :
    • gcc -m64 -O2 -fPIC -pipe

pkg-config ne fait pas exception et dispose de deux répertoires pour stocker ses fichiers de définition .pc :

/usr/lib/pkgconfig/*.pc
/usr/lib64/pkgconfig/*.pc

/usr/share/pkgconfig étant un lien vers /usr/lib64/pkgconfig.

Certains binaires sont spécifiques à une architecture ou bien contiennent des chemins codés en dur en leur sein. Ces binaires ont donc besoin d'être renommés en « -32 » et « -64 » et on met alors en place un système utilisant un faux binaire générique, qui n'est qu'un lien pointant vers un programme enveloppe, nommé « /usr/bin/multiarch_wrapper » ; lequel va décider du comportement à adopter en fonction de l'architecture.

La variable spéciale USE_ARCH, définie à “32” ou non-définie (le 64 bits étant l'artchitecture par défaut), permet de sélectionner les bons binaires à exécuter dans ce cas de figure. Cette variable est surtout utilisée lors de la compilation de paquets en 32 bits.


La compilation en multilib

Les « recettes » sont un bon exemple de la méthode à utiliser lorsqu'on veut séparer les bibliothèques 32 bits des 64 bits. Elle consiste, dans un cas standard, à invoquer les classiques « ./configure, make, make install » de la façon suivante :

  • En 32 bits :
USE_ARCH=32
CC="gcc -m32" CXX="g++ -m32" PKG_CONFIG_PATH="/usr/lib/pkgconfig" \
LDFLAGS="-L/usr/lib -L/lib" ./configure
make
  • En 64 bits :
USE_ARCH=64 # facultatif, présent seulement dans un esprit de rigueur
CC="gcc -m64" CXX="g++ -m64" PKG_CONFIG_PATH="/usr/lib64/pkgconfig" \
LDFLAGS="-L/usr/lib64 -L/lib64" ./configure
make

Le positionnement des LDFLAGS forçant l'éditeur de liens 'ld' à lier aux bonnes bibliothèques s'est avéré nécessaire au fur et à mesure que les compilations échouaient ou bien généraient des bibliothèques 64 bits partout !

Voyez la page Méthode de création des paquets.

Une recette générique est disponible ici : http://git.tuxfamily.org/0linux/0linux.git?p=gitroot/0linux/0linux.git;a=blob;f=generique.recette.