Comment s'appliquent -fvisibility option de symboles dans les bibliothèques statiques?
Je partage un projet de bibliothèque qui est construit à partir de 4 bibliothèques statiques (.a
) et un objet (.o
) fichier. Je suis en train d'ajouter la -fvisibility=hidden
option pour limiter les symboles de la sortie pour seulement ceux que je marque dans la source avec un __attribute__.
J'ai ajouté le -fvisibility=hidden
option pour les options de compilation pour le .so
projet (qui couvre la .o
fichier) et pour la .a
projets.
Les symboles dans l'objet fichier sont supprimés comme prévu à partir de la dernière .so
. Cependant, les symboles de la .a
projets sont encore à l'étape de .so
fichier. L'ajout de la -fvisibility=hidden
option pour le .so
lien de commande n'a aucun effet.
Ce que je fais mal?
Mon but ici est de supprimer à partir de la .so
tous les symboles, sauf les fonctions de l'interface de la bibliothèque.
EDIT: en fait j'ai utilisé un carte de la version pour résoudre cela pour l'instant. Cependant, il exige le maintien de la version de script externe des symboles de changement. Accepté de répondre a une meilleure idée.
- Plate-forme ne sont pas mentionnés, mais pour une solution pour le faire sous iOS/OS X, reportez-vous à stackoverflow.com/a/18949281/316487
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, la visibilité est traitée lors de la liaison, et l'éditeur de liens ne semblent pas l'imposer sur la statique des archives. Une question connexe (mais pas un doublon) a été demandé sur DONC ici.
Ce que je vous conseille de faire est de remplacer votre étape de lien:
gcc -shared -o mylib.so foo.o libbar.a
dans un de deux étapes du processus où vous récupérer des fichiers de l'objet:ar x libbar.a
(éventuellement dans une adaptées, répertoire vide)gcc -fvisibility=hidden -shared -o mylib.so foo.o tempdir/*.o
-fvisibility=hidden
. Selon le GCC Visibilité Wiki dans la section Comment utiliser le nouveau C++ visibilité support il est dit que modifier votre système pour passer d'-fvisibility=cachés à chaque appel de la GCC compiler un fichier source.. Donc je me demandais si vous avez vraiment besoin pour définir la visibilité du pavillon lors de la construction de la sorte d'objet.-fvisibility=hidden
et-s
?Simplement passer
-Wl,--exclude-libs,ALL
à gccCela indique à l'éditeur de liens pour transformer tous les symboles dans les bibliothèques statiques pour caché.
--exclude-libs
accepte également une liste des archives (c'est à dire statique de la bibliothèque de noms) pour une granularité plus fine sur laquelle les bibliothèques pour masquer les symboles de.Remarque: cela ne fonctionnera que dans les systèmes à l'aide de GNU binutils (par exemple Linux) ou avec un éditeur de liens de soutien
--exclude-libs
(par exemple, il ne fonctionnera pas avec OSX est ld64)C'est une réponse au problème pour OS X.
Le Mac
ld
ne prend pas en charge--exclude-libs
, mais il prend en charge-exported_symbol sym
et il ne l'appliquer à l'objet des fichiers de bibliothèques statiques. Et quand vous êtes de filtrage pour une API publique, la liste blanche est assez petit pour l'énoncer.J'ai fini par le suivant dans mon Makefile pour générer un
-Wl,-exported_symbol,_api_func_1
drapeau export pour chaque symbole:Ensuite, vous pouvez si-porte entre cette version des drapeaux et la GNU ld version après la détection de l'éditeur de liens qui le système a.