2009-10-01 5 views
9

J'ai créé une bibliothèque statique dans GCC, mais j'aimerais cacher la plupart des symboles.Avec GCC, comment exporter uniquement certaines fonctions dans une bibliothèque statique?

Par exemple, test1.c:

extern void test2(void); 
void test1(void) { 
    printf("test1: "); 
    test2(); 
} 

test2.c:

extern void test1(void); 
void test2(void) { 
    printf("test2\n"); 
} 

library_api.c:

extern void test1(void); 
extern void test2(void); 
void library_api(void) { 
    test1(); 
    test2(); 
} 

Maintenant compilez avec:

gcc -c test1.c -o test1.o 
gcc -c test2.c -o test2.o 
gcc -c library_api.c -o library_api.o 
ar rcs libapi.a test1.o test2.o library_api.o 

Comment puis-je obtenir que le "library_api()" fonction pour afficher pour:

nm libapi.a 

au lieu des fonctions "test1()", "test2()" et "library_api()"? En d'autres termes, comment cacher "test1()" et "test2()" d'apparaître et être appelable aux utilisateurs externes de libapi.a? Je ne veux pas que les utilisateurs externes sachent quoi que ce soit sur les fonctions de test internes.

Répondre

9

La solution la plus simple consiste à # inclure test1.c et test2.c dans library_api.c, et compiler uniquement ce fichier. Ensuite, vous pouvez rendre statiques test1() et test2().

Vous pouvez également combiner les fichiers objet avec ld -r et utiliser objcopy --localize-symbols pour rendre les fonctions de test statiques après la liaison. Comme cela peut devenir assez fastidieux, je recommande vraiment la première option, cependant.

+0

Déclarer le symbole 'static' n'aide pas non plus à le cacher dans la bibliothèque statique. –

+1

@Pavel: c'est sûr. Vous ne pouvez pas créer de lien avec un symbole statique. Si vous le souhaitez, vous pouvez également supprimer tous les symboles statiques après la compilation. –

+0

J'ai essayé "ld -r --retain-symboles-fichier tmp.list test1.o test2.o bibliothèque_api.o -o libapi.a" où tmp.list contient juste "library_api" et "nm libapi.a" montre encore les symboles test1 et test2 sont globaux. Des idées? – Will

2

ld a l'option

--retain-symboles fichier FICHIER Gardez uniquement les symboles listés dans FICHIER

pour vous permettre de nommer explicitement les symboles que vous voulez garder.

Questions connexes