2009-10-01 14 views
9

Stworzyłem bibliotekę statyczną w GCC, ale chciałbym ukryć większość symboli.W GCC, w jaki sposób mogę eksportować tylko niektóre funkcje w bibliotece statycznej?

Na przykład 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(); 
} 

Teraz skompilować z:

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 

Jak mogę dostać tylko "library_api()" funkcji, aby pokazać się na:

nm libapi.a 

zamiast funkcji "test1()", "test2()" i "library_api()"? Innymi słowy, w jaki sposób ukryć "test1()" i "test2()" przed wyświetlaniem i byciem wywołanym przez zewnętrznych użytkowników libapi.a? Nie chcę, aby użytkownicy zewnętrzni wiedzieli o wewnętrznych funkcjach testowych.

Odpowiedz

9

Najprostszym rozwiązaniem jest #include test1.c i test2.c na library_api.c i tylko skompiluj ten plik. Następnie możesz ustawić statyczność test1() i test2().

Alternatywnie można łączyć pliki obiektów z ld -r i używać objcopy --localize-symbols, aby po podłączeniu funkcje testowe stały się statyczne. Ponieważ może to być dość nudne, naprawdę polecam pierwszą opcję.

+0

Deklaracja symbolu 'static' nie pomaga również w ukrywaniu go w bibliotece statycznej. –

+1

@Pavel: na pewno to robi. Nie można łączyć z statycznym symbolem; w razie potrzeby można również usunąć wszystkie statyczne symbole po kompilacji. –

+0

Próbowałem "ld -r --retain-symbols-file tmp.list test1.o test2.o library_api.o -o libapi.a" gdzie tmp.list po prostu zawiera "library_api" i "nm libapi.a" wciąż pokazuje symbole test1 i test2 jako globalne. Jakieś pomysły? – Will

2

ld posiada opcję

--retain-symbole-do pliku Przechowywać tylko symbole wymienione w aktach

co pozwala jednoznacznie nazwać symbole chcesz twierdzy.

Powiązane problemy