man gcc
gcc 编译时,如果使用了 -fvisibility=hidden 选项,编译的so文件中的函数默认是不导出的,就是动态链接是链接不到的;不仅有隐藏的效果(使用nm还是能看到的,所以,该选项不是出于安全考虑,主要是实现private的效果),也有利于编译器的进一步优化。由于历史代码可能不期望这个行为,所以该选项也不是默认行为(好像在object-c中是默认行为)。
下面测试一下:
main
1 2 3 4 5 6 7 8 9 |
#include<stdlib.h> #include<stdio.h> #include "f.h" int main(int ac, char** av) { printf("%d\n", a()); return 0; } |
f.h
1 |
int a(); |
这个头文件太简单了🤦♀️
libf.c
1 2 3 4 |
// __attribute__((visibility ("default"))) // 打开该注释就可以显式导出 int a() { return 1; } |
编译main.c
1 2 |
gcc -lf -L . main.c f.h #使用clang也行,参数都一样 |
编译libf.c
1 2 |
// 隐藏的编译方式,编译后,运行报错 gcc -shared -fvisibility=hidden -o libf.so libf.c |