我在GCC中创建了一个静态库,但是我想隐藏大部分符号.
例如,test1.c:
extern void test2(void);
void test1(void) {
printf("test1: ");
test2();
}
Run Code Online (Sandbox Code Playgroud)
test2.c中:
extern void test1(void);
void test2(void) {
printf("test2\n");
}
Run Code Online (Sandbox Code Playgroud)
library_api.c:
extern void test1(void);
extern void test2(void);
void library_api(void) {
test1();
test2();
}
Run Code Online (Sandbox Code Playgroud)
现在编译:
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
Run Code Online (Sandbox Code Playgroud)
如何仅显示"library_api()"函数以显示:
nm libapi.a
Run Code Online (Sandbox Code Playgroud)
而不是函数"test1()","test2()"和"library_api()"?换句话说,如何隐藏"test1()"和"test2()"从显示和可调用到libapi.a的外部用户?我不希望外部用户知道任何有关内部测试功能的信息.
最简单的解决方案是#include test1.c和test2.c library_api.c,并且只编译该文件.然后你可以使test1()和test2()静态.
或者,您可以将目标文件与组合使用ld -r,并objcopy --localize-symbols在链接后用于使测试函数保持静态.由于这可能相当繁琐,我真的推荐第一个选项.