Bibliothèque dynamique et variables globales sous Linux : une nouvelle politique ?
4 réponses
Helfer Thomas
Bonjour,
j'ai récemment vu des changements significatifs dans la façon dont sont
gérées les variables globales dans les bibliothèques dynamiques.
Un exemple simple : le fichier suivant (A.cxx) déclare une variable
globale a dont le constructeur affiche "A" :
A.cxx :
#include<iostream>
struct A
{
A()
{
std::cout << "A" << std::endl;
}
};
A a;
Ce fichier est compilé ainsi :
g++ --shared -fPIC A.cxx -o libA.so
Soit maintenant une fonction main vide :
test.cxx
--------
int main(void)
{return 0;}
Ce fichier est compilé et linké sur la bibliothèque précédente :
g++ test.cxx -o test -L. -lA
Sous debian squeeze, j'obtiens le comportement attendu : ./test affiche "A".
Sous ubuntu (depuis les deux dernières versions), ./test n'affiche rien !!
Ce comportement est d'autant plus étrange que si j'appelle la librairie
via dlopen (sans linker dessus), le comportement est le même sur les
deux systèmes !
Quelqu'un pourra-t'il me renseigner sur la nouvelle politique des
dernières versions du linker (c'est bien qui est en cause) ? Cerise sur
le gateau : comment retrouver l'ancien comportement (aucun des
__attribute__ gcc que j'ai essayé n'a fonctionné).
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Arnaud Giersch
Bonjour,
Mardi 15 mai 2012, vers 20:23:43 (+0200), Helfer Thomas a écrit:
j'ai récemment vu des changements significatifs dans la façon dont sont gérées les variables globales dans les bibliothèques dynamiques.
[...]
Quelqu'un pourra-t'il me renseigner sur la nouvelle politique des dernières versions du linker (c'est bien qui est en cause) ?
Si j'ai bien suivi, Ubuntu active par défaut l'option --as-needed pour ld, ce qui a pour effet de ne lier que les bibliothèques qui sont effectivement utilisées. Ce serait en projet chez Debian qui devrait y venir aussi un jour.
Cerise sur le gateau : comment retrouver l'ancien comportement (aucun des __attribute__ gcc que j'ai essayé n'a fonctionné).
Essaie avec : g++ test.cxx -o test -L. -Wl,--no-as-needed -lA
Arnaud
Bonjour,
Mardi 15 mai 2012, vers 20:23:43 (+0200), Helfer Thomas a écrit:
j'ai récemment vu des changements significatifs dans la façon dont
sont gérées les variables globales dans les bibliothèques dynamiques.
[...]
Quelqu'un pourra-t'il me renseigner sur la nouvelle politique des
dernières versions du linker (c'est bien qui est en cause) ?
Si j'ai bien suivi, Ubuntu active par défaut l'option --as-needed pour
ld, ce qui a pour effet de ne lier que les bibliothèques qui sont
effectivement utilisées. Ce serait en projet chez Debian qui devrait
y venir aussi un jour.
Cerise sur le gateau : comment retrouver l'ancien comportement
(aucun des __attribute__ gcc que j'ai essayé n'a fonctionné).
Essaie avec :
g++ test.cxx -o test -L. -Wl,--no-as-needed -lA
Mardi 15 mai 2012, vers 20:23:43 (+0200), Helfer Thomas a écrit:
j'ai récemment vu des changements significatifs dans la façon dont sont gérées les variables globales dans les bibliothèques dynamiques.
[...]
Quelqu'un pourra-t'il me renseigner sur la nouvelle politique des dernières versions du linker (c'est bien qui est en cause) ?
Si j'ai bien suivi, Ubuntu active par défaut l'option --as-needed pour ld, ce qui a pour effet de ne lier que les bibliothèques qui sont effectivement utilisées. Ce serait en projet chez Debian qui devrait y venir aussi un jour.
Cerise sur le gateau : comment retrouver l'ancien comportement (aucun des __attribute__ gcc que j'ai essayé n'a fonctionné).
Essaie avec : g++ test.cxx -o test -L. -Wl,--no-as-needed -lA
Arnaud
Helfer Thomas
Le 17/05/2012 11:52, Arnaud Giersch a écrit :
g++ test.cxx -o test -L. -Wl,--no-as-needed -lA
Je viens de tester et cela ne semble pas résoudre mon problème. Une autre idée peut-être ?
Merci pour la réponse,
Helfer Thomas
Le 17/05/2012 11:52, Arnaud Giersch a écrit :
g++ test.cxx -o test -L. -Wl,--no-as-needed -lA
Je viens de tester et cela ne semble pas résoudre mon problème. Une
autre idée peut-être ?