Forum Programmation.c Édition "récursive" des liens modifiée dans les versions récentes de GCC ?

Posté par  (site Web personnel) .
Étiquettes : aucune
0
2
sept.
2011

Plop,

Je viens de tomber sur une question inédite pour moi qui est celle du comportement de GCC face à une utilisation de symboles d'une bibliothèque "lointaine".

Je m'explique. Imaginez la situation suivante : prog -> liba -> libb, ce qui en français donne quelque chose du genre : le programme est liée à la bibliothèque A qui est elle même liée à la bibliothèque B.

Que doit-il se passer si le programme utilise un symbole de la libb ? (bien sûr, le "prototypage" est supposé exister, la problématique ne porte que sur l'édition des liens)

J'utilise ce genre de schémas sans problème depuis de nombreuses années et là, paf, avec un "gcc version 4.6.0 20110603 (Red Hat 4.6.0-10) (GCC)", j'ai un message qui m'explique le symbole est inconnu, mais qu'il semble exister dans la libb (merci Capt'ain Obvious !)

Est-ce un changement de comportement de la part de GCC ? Une modification spécifique à cette release du compilateur (Fedora 15) ? Quel est "l'avis" du standard sur ce point ?

Merci de vos commentaires.

  • # J'ai ma réponse ...

    Posté par  (site Web personnel) . Évalué à -1.

    ... il semblerait en effet que ce soit une modification spécifique de Fedora, depuis la F13 :

    Les dépendances doivent maintenant êtres explicites à l'éditions des liens. C'est certes plus propre, mais j'ai tendance à trouver dommage le fait que ça casse la compatibilité.

    • [^] # Re: J'ai ma réponse ...

      Posté par  . Évalué à 3.

      Les dépendances doivent maintenant êtres explicites à l'éditions des liens. C'est certes plus propre, mais j'ai tendance à trouver dommage le fait que ça casse la compatibilité.

      En fait, c'est un peu plus compliqué que çà... Supposons ceci :

      • le programme dépend de libA
      • la libA dépend de libB
      • la libB définit le symbole sym_B
      • le programme appelle directement le symbole sym_B
      • le programme est lié avec -lA ( et pas -lB ! )

      L'ancien comportement était, dans l'ordre, avec arrêt au premier trouvé :

      • ld tente de trouver sym_B dans les .o
      • puis regarde dans la première couche de dépendances, libA
      • puis descend d'un cran dans les dépendances, libB

      L'inconvénient avec ce comportement, c'est que si libA.so est mis à jour et ne dépend plus de libB, alors il y aura une erreur de link à l'exécution.

      Le nouveau comportement :

      • ld tente de trouver sym_B dans les .o
      • puis regarde dans la première couche de dépendances, libA

      Donc, le symbole sym_B ne sera pas trouvé. Et c'est normal. Puisque le programme fait un appel explicite à sym_B, il doit spécifier explicitement une dépendance à libB.

      Ce qui n'a pas changé :

      • le programme dépend de libA
      • la libA dépend de libB
      • le programme ne fait aucun appel explicite à un symbole de libB

      Dans ce cas, l'édition de liens va réussir.

      Hop,
      Moi.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.