使用GCC,如何仅导出静态库中的某些功能?

时间:2009-10-01 20:41:29

标签: c static

我在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 个答案:

答案 0 :(得分:9)

最简单的解决方案是将#include test1.c和test2.c导入library_api.c,并且只编译该文件。然后你可以使test1()和test2()静态。

或者,您可以将目标文件与ld -r组合,并使用objcopy --localize-symbols在链接后使测试函数保持静态。由于这可能相当繁琐,我真的推荐第一个选项。

答案 1 :(得分:2)

ld有选项

  

- retain-symbols-file FILE仅保留FILE中列出的符号

允许您明确命名您想要的符号 保持。