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.
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);
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
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
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