Les incompatibilités de binaires, de liaisons dynamiques et de librairies sont très nombreuses sous Linux. Voici quelques assertions pour clarifier la situation.
Les relations principales
- ld.so pour le format a.out
- ld-linux.so.1 pour les elf avec libc5
- ld-linux.so.2 pour les elf avec libc6/glibc2
- /etc/ld.so.conf est utilisé par ces trois chargeurs
- /etc/ld.so.cache est produit à partir de /etc/ld.so.conf
- libc6 = glibc2
- libc1-libc5 =/= glibc1
- libc5 correspond à l'arrivé du format elf
- libc1-libc4 correspondent au format a.out ?
- libc.so.[n] correspond à libc[n]
- Le lieur fait correspondre les numéros de version majeur
quelques notes
De nos jours libc et glibc ne font qu'un. Ceci est précisement le cas depuis les libc6 et glibc2, qui sont identiques. Mais auparavent, glibc était un fork (une branche séparée du tronc commun) de la libc. Vous devez en tenir compte si vous traitez avec des systèmes basés sur des librairies antérieures à libc6/glibc2.
Certains systèmes basés sur libc6, intègre encore libc5 pour des raisons de compatibilité (par exemple pour d'ancien programmes dont les sources ne sont pas disponible).
Avec le format de fichier ELF, le fichier ld.so.conf n'est plus strictement nécéssaire, car le format ELF fourni toute les informations nécéssaire à l'établissement des liaisons dynamiques lors du chargement de programmes les nécéssitant (il est malgré tout encore présent sur beaucoup de systèmes).
Un changement de numéro majeur dans une des librairie, signale le passage d'une ABI à une autre ABI (application binary interface), c'est à dire que les conventions régissants les deux librairie ne sont plus compatible. Un changement de numéro majeur n'est pas un simple mise à jour des algorithmes par exemple... c'est bien plus que cela.
Le chargeur lib[xxx].so.[n] n'est pas strictement obligatoire, et il peut exister au moins théoriquement evec le format ELF, des liaisons dynamiques qui ne passe pas par lib[xxx].so.[n].
Les dépendances de liaisons dynamiques d'une programme peuvent être testées avec le programme ldd (c'est le plus souvent un script que vous pouvez même lire pour l'étudier, mais il en existe des version binaires), qui fait parti de binutils (mais peut-être employé indépendament). Ce programme est utile pour determiner les raison parfois mystérieuses qui font qu'un binaire ne peut pas être lancé. Le plus souvent, si vous lancez par exemple le programme « truc », pour lequel il manque des dépendances dynamique, le shell se contente d'un maigre message du style « truc: not found »... qui ne vous apprends rien (et on se demande même pourquoi « truc » ne serait pas trouvé). En fait, ce n'est pas le fichier du programme qui n'est pas trouvé, mais l'une de ses dépendances. Lancez alors la commande « ldd truc » pour en savoir plus, et connaître la liste des dépendances non-résolues, ce qui vous donnera une chance d'être bien orienté pour mettre votre système à jour. Si un programme n'est pas dynamique, mais statique, alors ldd vous le signal tout simplement par un message du style « truc: not a dynamique program ».
La suite ...
La suite : Les bureaux et GDI sur Linux
