8
votes

Visibilité du symbole en utilisant g ++

J'ai compilé une bibliothèque C ++ sous Linux / Mac avec ses symboles cachés. J'ai utilisé _ attribut _ ((visibilité ("caché"))) Pour toutes mes classes et compilé avec des options (-C -O2 -FIC -MD -MP -MP -Mf). Sous Mac, à l'aide de MacDePendances (http://code.google.com/p/macDependency/), le travail est bien terminé, car je ne vois que mes exportations (j'ai réellement vu la différence avant et après).

Cependant, j'ai remarqué que l'utilisation de nm je vois toujours tous les noms des symboles. Cela se produit sous Mac et Linux.

Pourquoi est-ce? Y a-t-il un moyen d'éviter cela?

meilleures salutations et merci, Joe


2 commentaires

Sur Linux utilisez-vous nm -d pour afficher la table des symboles dynamiques? La visibilité ne s'applique qu'à la table des symboles dynamiques.


NM -D me donne en effet la "liste" correcte, merci.


3 Réponses :


14
votes

public ou caché, les symboles sont toujours là. nm code> montre tous les symboles. La différence est que les symboles cachés ne sont pas disponibles pour la liaison dynamique, c'est-à-dire non exportés et ne peuvent pas être interposés.

Vous pouvez également aimer les homme suivants GCC CODE>: P>

   -fvisibility=default|internal|hidden|protected
       ...
       A good explanation of the benefits offered by ensuring ELF symbols
       have the correct visibility is given by "How To Write Shared
       Libraries" by Ulrich Drepper (which can be found at
       <http://people.redhat.com/~drepper/>)---however a superior solution
       made possible by this option to marking things hidden when the
       default is public is to make the default hidden and mark things
       public.  This is the norm with DLL's on Windows and with
       -fvisibility=hidden and "__attribute__ ((visibility("default")))"
       instead of "__declspec(dllexport)" you get almost identical
       semantics with identical syntax.  This is a great boon to those
       working with cross-platform projects.


6 commentaires

Merci maxime, a définitivement la différence maintenant. Une autre question se pose cependant: comment puis-je voir la table de ces symboles sous Windows? Merci encore.


Probablement dépend.exe ou nm de cygwin.


Merci encore, je vais essayer demain. Connaissez-vous de quelque manière que ce soit pour supprimer ces symboles de la production de NM?


Makr4o vous a déjà donné la réponse: NM --Dynnamic et NM --extern-uniquement selon ce que vous voulez.


Désolé, ce que je voulais dire, c'est: y a-t-il un moyen de compiler / de lier / strip-teet / etc ma bibliothèque partagée afin que ces noms ne soient pas montrés avec une simple 'nm'?


Stackoverflow.com/Questions/4994741/Symbol-Visibilité- Utilisation-g / ...



6
votes

Vous pouvez bande votre binaire pour supprimer tout inutile symboles.


1 commentaires

Merci! J'ai effectivement essayé de cocher "Strip" de Netbeans, mais cela n'a pas fait l'affaire. J'ai essayé maintenant à la main avec --Strip - tout cela semble avoir le résultat que je m'attendais. Merci à tous ceux qui ont partisé!



3
votes

sur OSX (pas sûr d'autres personnes) J'ai trouvé ce qui suit.

Comme mentionné par Maxim, en utilisant -fvisbility = masqué = masqué ou __ ((visibilité ("Caché")) ) met toujours le symbole dans la table des symboles, il est simplement marqué comme inextenu. Le moyen le plus simple de voir ceci est avec nm , E.g: xxx

si la lettre après l'adresse est minuscule, cela signifie qu'il n'est pas exporté. Ici, a_function () est masqué, et a_public_function a une visibilité par défaut.

Pour dépouiller les symboles non exportés de la table des symboles, vous pouvez utiliser Strip -x , qui selon la page man "/ p>

-x Supprimez tous les symboles locaux (sauvegarder uniquement les symboles globaux). xxx

Je crois (mais je ne suis pas sûr de 100%) que l'utilisation de caché ne juste monte à changer drapeau et "introuvant" Les symboles ne seraient pas triviaux.


1 commentaires

La commande strip -x est ce que je cherchais à retirer complètement les symboles locaux de la table, c'est-à-dire que vous ne pouvez pas être vu en utilisant nm .