Comment limiter la publication de l'API dans la bibliothèque partagée en langage C de Linux

** Problème avec l'API publiée dans la bibliothèque partagée **

J'ai eu beaucoup de mal à créer des bibliothèques partagées. Au fur et à mesure que l'échelle de la bibliothèque grandit, nous allons naturellement diviser l'intérieur en fichiers, définir l'API dans la bibliothèque et développer.

À cette époque, je me demandais toujours s'il y avait un moyen.

Si vous le faites normalement, ce sera comme ça. ** L'API d'en-tête définie dans la bibliothèque est également incluse dans les API disponibles dans la bibliothèque partagée créée **

L'en-tête public est spécifié, mais si vous lisez de force l'en-tête utilisé en interne, cette API sera également utilisée. Surtout lors de la publication d'une bibliothèque sur github, c'est un peu merdique de pouvoir utiliser des API involontaires comme vous le souhaitez.

Alors je l'ai vérifié sans m'y attendre.

** Vous pouvez limiter les API publiées dans la bibliothèque partagée! ** **

Il n'y a rien que vous ne puissiez pas faire, oui avec GNU! Donc, il semble que vous puissiez restreindre la publication avec les fonctions Linux existantes.

Référence: http://0xcc.net/blog/archives/000108.html

Par exemple, supposons que vous ayez un en-tête public de bibliothèque comme celui-ci: (Bibliothèque de mesure du temps précédemment créée)

timetestlog.h


void * timetestlog_init(char *delimiter, size_t maxloglen, unsigned long maxstoresize);
int timetestlog_store_printf(void * handle, const char *format, ...);
void timetestlog_exit(void * handle);

En tant que créateur de bibliothèque, je souhaite que vous n'utilisiez que cette API.

Supposons que vous ayez utilisé cette API lors du développement de cette bibliothèque.

testfile.h


int testfunction(void);

** Compilation normale **

Si vous compilez normalement avec ceci, vous pouvez utiliser testfunction si vous incluez testfile.h.

Vous pouvez vérifier l'API publiée avec la commande nm -D ou ʻobjdump -t`. En regardant le résultat de l'exécution de la commande, vous pouvez voir que la fonction de test est incluse. En plus de cela, il y a des API supplémentaires ici et là

Linux env$ nm -D .libs/libtimelog.so | grep " T "
0000000000000dec T _fini
00000000000007d8 T _init
0000000000000dc0 T testfunction
0000000000000d90 T timetestlog_exit
0000000000000b10 T timetestlog_init
0000000000000c90 T timetestlog_store_printf
Linux env$ objdump -t .libs/libtimelog.so | grep " g"
0000000000000dc0 g     F .text  000000000000002c              testfunction
0000000000202068 g       .data  0000000000000000              _edata
0000000000000dec g     F .fini  0000000000000000              _fini
0000000000000c90 g     F .text  00000000000000fc              timetestlog_store_printf
0000000000000b10 g     F .text  000000000000017f              timetestlog_init
0000000000202070 g       .bss   0000000000000000              _end
0000000000202068 g       .bss   0000000000000000              __bss_start
0000000000000d90 g     F .text  0000000000000022              timetestlog_exit
00000000000007d8 g     F .init  0000000000000000              _init

** - Restrictions d'API par version-script **

Utilisez "--version-script" pour limiter l'API publique. Spécifiez le fichier de configuration (libtimelog.map dans ce cas) qui définit le script de version et l'API publique de cette manière.

LDFLAGS+=-Wl,--version-script,libtimelog.map

Dans le fichier de paramètres, spécifiez l'API que vous souhaitez exposer globalement et spécifiez other (*) en local.

libtimelog.map


{
  global:
    timetestlog_init;
    timetestlog_store_printf;
    timetestlog_exit;
  local: *;
};

Voici l'API publique de la bibliothèque construite en spécifiant le fichier de paramètres ci-dessus. Vous pouvez voir que seule l'API minimale est exposée.

Linux env$ nm -D .libs/libtimelog.so | grep " T "
0000000000000cb0 T timetestlog_exit
0000000000000a30 T timetestlog_init
0000000000000bb0 T timetestlog_store_printf

Linux env$ objdump -t .libs/libtimelog.so | grep " g"
0000000000000bb0 g     F .text  00000000000000fc              timetestlog_store_printf
0000000000000a30 g     F .text  000000000000017f              timetestlog_init
0000000000000cb0 g     F .text  0000000000000022              timetestlog_exit

** Résumé **

Vous pouvez spécifier l'API publique à l'aide de ** --version-script **. Jusqu'à présent, j'étais préoccupé par l'API à publier, et j'ai en fait rassemblé les fichiers que je voulais séparer, Vous pouvez maintenant créer une bibliothèque avec votre structure de fichiers préférée sans hésitation.

Recommended Posts

Comment limiter la publication de l'API dans la bibliothèque partagée en langage C de Linux
Comment utiliser la bibliothèque C en Python
Comment éliminer le "Les balises doivent être un tableau de hachages." Erreur dans l'API qiita
De l'introduction de l'API GoogleCloudPlatform Natural Language à son utilisation
Lignes directrices pour se réincarner dans le monde du développement de programmation Linux (langage C / C ++)
[Langage C] Comment utiliser la fonction crypt sous Linux [Hachage de mot de passe]
Méthode de contrôle exclusive multi-processus en langage C
[Langage C] Faites attention à la combinaison de l'API de mise en mémoire tampon et de l'appel système sans mise en mémoire tampon
[Langage C] [Linux] Récupère la valeur de la variable d'environnement
linux / c> lien> Obtenir le résultat de l'exécution de la commande shell dans le programme C> On m'a appris à utiliser popen ()
Comment trouver le nombre optimal de clusters pour les k-moyennes
Comment déboguer une bibliothèque Python standard dans Visual Studio
[Linux] [C / C ++] Résumé de la façon d'obtenir pid, ppid, tid
J'ai essayé d'illustrer le temps et le temps du langage C
Une introduction à l'API de socket moderne pour apprendre en C
Remarques sur l'utilisation de la guimauve dans la bibliothèque de schémas
[Linux] [C / C ++] Comment obtenir la valeur d'adresse de retour d'une fonction et le nom de fonction de l'appelant
Comment afficher une colonne de fichiers spécifiée sous Linux (awk)
Comment déterminer l'existence d'un élément sélénium en Python
Introduction à l'API Socket apprise en langage C, partie 1, édition serveur
Comment connaître la structure interne d'un objet en Python
Comment changer la couleur du seul bouton pressé avec Tkinter
Comment vérifier la taille de la mémoire d'une variable en Python
Comment utiliser Python Kivy (référence) -J'ai traduit le langage Kivy de la référence API-
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Comment afficher le résultat de sortie de la commande man Linux dans un fichier
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
Comment envelopper C en Python
[Note du débutant] Comment spécifier le chemin de lecture de la bibliothèque en Python
Une histoire d'essayer d'améliorer le processus de test d'un système vieux de 20 ans écrit en C
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_3
[Langage C] Je souhaite générer des nombres aléatoires dans la plage spécifiée
[Linux] Une commande pour obtenir une liste des commandes exécutées dans le passé
Comment comparer si le contenu des objets dans scipy.sparse.csr_matrix est le même
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_1
Qu'est-ce qu'une bibliothèque en langage C? Quelles informations sont ouvertes au public?
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_2
[Comprendre en 3 minutes] Le début de Linux
Comment vérifier la version de Django
Implémenter une partie du processus en C ++
Comment utiliser Google Test en langage C
[Linux] Comment utiliser la commande echo
Comment faire fonctionner Linux depuis la console
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Comment passer le chemin vers la bibliothèque construite avec pyenv et virtualenv avec PyCharm
Comment mentionner un groupe d'utilisateurs avec une notification de mou, comment vérifier l'ID d'un groupe d'utilisateurs
Vous serez ingénieur dans 100 jours - Jour 29 - Python - Bases du langage Python 5
Comment identifier de manière unique la source d'accès dans la vue de classe générique Django
Vous serez ingénieur dans 100 jours --Jour 26 --Python --Basiques du langage Python 3
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
Un mémorandum expliquant comment exécuter la commande magique! Sudo dans Jupyter Notebook
Comment trouver le coefficient de la courbe approximative passant par les sommets en Python
Vous serez ingénieur dans 100 jours --Jour 32 --Python --Basiques du langage Python 7
Comment changer l'apparence du champ de clé étrangère non sélectionné dans le formulaire modèle de Django
Comment rendre la largeur de police du notebook jupyter mis dans pyenv égale
Vous serez ingénieur dans 100 jours --Jour 28 --Python --Les bases du langage Python 4