Bibliothèque dynamique et variables globales sous Linux : une nouvelle politique ?

Le
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é).

Merci pour toute aide

Cordialement,

Helfer THomas
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Arnaud Giersch
Le #24483301
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
Helfer Thomas
Le #24483421
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
espie
Le #24483551
In article 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 ?



Je crois que tu ne vas pas y couper, il va falloir aller regarder
ce que racontent tes diverses lignes de compilation cote linker.

Donc g++ -v -Wl,-verbose

de preference en comparant dans les deux cas...
Helfer Thomas
Le #24485631
Le 17/05/2012 13:40, Marc Espie a écrit :
In article 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 ?



Je crois que tu ne vas pas y couper, il va falloir aller regarder
ce que racontent tes diverses lignes de compilation cote linker.

Donc g++ -v -Wl,-verbose

de preference en comparant dans les deux cas...



Autant pour moi, je viens de tester à nouveau l'option
-Wl,--no-as-needed et cela marche ! J'ai dû raté quelque chose..

Merci pour votre aide !
Publicité
Poster une réponse
Anonyme