2009-10-01 9 views
9

Ho creato una libreria statica in GCC, ma mi piacerebbe nascondere la maggior parte dei simboli.Con GCC, come esportare solo determinate funzioni in una libreria statica?

Per esempio, 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(); 
} 

Ora compilare con:

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 

Come faccio ad avere solo il "library_api) (" la funzione di presentarsi per:

nm libapi.a 

al posto delle funzioni "test1()", "test2()", e "library_api()"? In altre parole, come faccio a nascondere "test1()" e "test2()" da mostrare e essere richiamabile a utenti esterni di libapi.a? Non voglio che gli utenti esterni sappiano nulla delle funzioni di test interne.

risposta

9

La soluzione più semplice è #include test1.c e test2.c in library_api.c e compila solo quel file. Quindi puoi fare test1() e test2() statico.

In alternativa, è possibile combinare i file oggetto con ld -r e utilizzare objcopy --localize-symbols per rendere statiche le funzioni di test dopo il collegamento. Dato che questo può diventare abbastanza noioso, consiglio comunque la prima opzione.

+0

La dichiarazione del simbolo 'static' non aiuta a nasconderla nella libreria statica. –

+1

@Pavel: certo. Non puoi collegarti a un simbolo statico; se lo si desidera, è anche possibile rimuovere tutti i simboli statici dopo la compilazione. –

+0

Ho provato "ld -r --retain-symbols-file tmp.list test1.o test2.o library_api.o -o libapi.a" dove tmp.list contiene solo "library_api" e "nm libapi.a" mostra ancora i simboli test1 e test2 come globali. Qualche idea? – Will

2

ld ha la possibilità

--retain-simboli-FILE file Mantenere solo simboli elencati in FILE

per consentire di assegnare un nome in modo esplicito i simboli che si desidera mastio.

Problemi correlati