J'ai compilé une bibliothèque C ++ sous Linux / Mac avec ses symboles cachés. J'ai utilisé Cependant, j'ai remarqué que l'utilisation de Pourquoi est-ce? Y a-t-il un moyen d'éviter cela? P>
meilleures salutations et merci,
Joe p>
3 Réponses :
public ou caché, les symboles sont toujours là. Vous pouvez également aimer les 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.
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.
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 code> ou
nm code> 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 code> et
NM --extern-uniquement code> 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 / ...
Vous pouvez bande code>
votre binaire pour supprimer tout inutile symboles. p>
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é!
sur OSX (pas sûr d'autres personnes) J'ai trouvé ce qui suit.
Comme mentionné par Maxim, en utilisant si la lettre après l'adresse est minuscule, cela signifie qu'il n'est pas exporté. Ici, Pour dépouiller les symboles non exportés de la table des symboles, vous pouvez utiliser -x Supprimez tous les symboles locaux (sauvegarder uniquement les symboles globaux). P>
blockQuote> Je crois (mais je ne suis pas sûr de 100%) que l'utilisation de -fvisbility = masqué = masqué code> ou
__ ((visibilité ("Caché")) ) code> 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 code>, E.g: p>
a_function () code> est masqué, et
a_public_function code> a une visibilité par défaut. P>
Strip -x code>, qui selon la page man "/ p>
caché code> ne em> juste em> monte à changer drapeau et "introuvant" Les symboles ne seraient pas triviaux. p> p>
La commande strip -x code> 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 code>.
Sur Linux utilisez-vous
nm -d code> 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.