2015-07-28 1 views
3

J'ai:gcc cacher la visibilité des symboles provenant de la bibliothèque statique inclus

  1. une bibliothèque partagée, disent libShared.so, qui contient une classe Bar, avec une méthode int Bar::do(int d) const
  2. une bibliothèque statique, dire libStatic.a, qui contient une classe Foo, avec une méthode int Foo::act(int a) const.

Le code de Bar est quelque chose comme ceci:

//Bar.h 
class __attribute__ ((visibility ("default"))) Bar 
{ 
    private: 
    __attribute__ ((visibility ("hidden"))) int privateMethod(int x) const; 
    public: 
    Bar() {} 
    int do(int d) const; 
} 

//Bar.cpp 
#include "Bar.h" 
#include "Foo.h" 

int Bar::do(int d) const { 
    Foo foo; 
    int result = foo.act(d) + this->privateMethod(d); 
    return result; 
} 

libShared.so est compilé avec le drapeau -fvisibility = caché.

Le problème est le suivant: I exécuter la commande Linux nm -g -D -C --defined seule libShared.so, et il en résulte que classe Foo, ainsi que son procédé, est visible à l'extérieur libShared.so, malgré avoir dit au compilateur de tout cacher sauf ce qui est marqué comme "public" (en fait, ils sont marqués comme "T" par nm).

Comment puis-je éviter cela? Je veux libShared.so de ne pas exposer les symboles provenant de ses dépendances.

Merci

Répondre

5

Vous devez compiler libStatic.a aussi avec le drapeau -fvisibility=hidden.

+0

Désolé, mais cela n'empêchera pas _libShared.so_ d'utiliser _Foo_? – Mauro

+2

Je me réponds. Ça marche! Je suppose que c'est parce qu'une liaison statique ne supporte pas les symboles qui se cachent, donc le drapeau _hidden_ ​​ne prendra effet que lorsque les objets de la bibliothèque statique seront utilisés à l'intérieur d'un lien partagé. Merci beaucoup! – Mauro