Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

11 views
Skip to first unread message

Helfer Thomas

unread,
May 15, 2012, 2:23:43 PM5/15/12
to
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

Arnaud Giersch

unread,
May 17, 2012, 5:52:46 AM5/17/12
to
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

unread,
May 17, 2012, 6:37:06 AM5/17/12
to
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

Marc Espie

unread,
May 17, 2012, 7:40:30 AM5/17/12
to
In article <4fb4d4d3$0$1690$426a...@news.free.fr>,
Helfer Thomas <helfer...@free.fr> 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...

Helfer Thomas

unread,
May 18, 2012, 2:40:50 AM5/18/12
to
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 !
0 new messages