Liaison dynamique

Présentation…

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 LibC 5
  • « ld-linux.so.2 » pour les ELF avec LibC 6 ( alias GLibC 2 )
  • « /etc/ld.so.conf » est utilisé par ces trois chargeurs
  • « /etc/ld.so.cache » est produit à partir de « /etc/ld.so.conf »
  • LibC 6 est la même chose que GLibC 2
  • Les LibC 1 à LibC 5 ne sont pas la même chose que GLibC 1
  • LibC 5 correspond à l’arrivé du format ELF
  • Les LibC 1 à LibC 4 correspondent au format a.out ( à vérifier cependant )
  • « 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écisément le cas depuis les LibC 6 et GLibC 2, qui sont identiques. Mais auparavant, 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 à LibC 6 ou GLibC 2.

Certains systèmes basés sur LibC 6, intègre encore LibC 5 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écessaire, car le format ELF fourni toutes les informations nécessaire à l’établissement des liaisons dynamiques lors du chargement de programmes les nécessitant ( 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égissant 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 avec 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épendamment ). Ce programme est utile pour déterminer 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 ».