С GCC, как я могу экспортировать только определенные функции в статической библиотеке? - PullRequest
9 голосов
/ 02 октября 2009

Я создал статическую библиотеку в GCC, но я хотел бы скрыть большинство символов.

Например, 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();
}

Теперь скомпилируйте с:

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

Как получить функцию «library_api ()» для показа:

nm libapi.a

вместо функций "test1 ()", "test2 ()" и "library_api ()"? Другими словами, как я могу скрыть "test1 ()" и "test2 ()" от показа и возможности вызова внешним пользователям libapi.a? Я не хочу, чтобы внешние пользователи знали что-либо о внутренних функциях тестирования.

Ответы [ 2 ]

9 голосов
/ 02 октября 2009

Самое простое решение - включить test1.c и test2.c в library_api.c и скомпилировать только этот файл. Затем вы можете сделать test1 () и test2 () статическими.

Кроме того, вы можете объединить объектные файлы с ld -r и использовать objcopy --localize-symbols, чтобы сделать тестовые функции статичными после компоновки. Хотя это может быть довольно утомительным, но я действительно рекомендую первый вариант.

2 голосов
/ 02 октября 2009

ld имеет опцию

- файл сохраненных символов ФАЙЛ Сохранять только символы, перечисленные в ФАЙЛЕ

, чтобы позволить вам явно назвать символы, которые вы хотите держать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...