Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

4 réponses
Avatar
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

4 réponses

Avatar
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
Avatar
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
Avatar
espie
In article <4fb4d4d3$0$1690$,
Helfer Thomas wrote:
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...
Avatar
Helfer Thomas
Le 17/05/2012 13:40, Marc Espie a écrit :
In article<4fb4d4d3$0$1690$,
Helfer Thomas wrote:
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 !