-fvisibility=default|internal|
hidden|protected
gcc的
visibility是说,如果编译的时候用了这个属性,那么动态库的符号都是
hidden的,除非强制声明。
1.创建一个c源文件,内容简单
#include<stdio.h>
#include<stdlib.h>
__attribute ((
visibility("default"))) void not
_
hidden ()
{
printf("exported symbol\n");
}
void is
_
hidden ()
{
printf("
hidden one\n");
}
想要做的是,第一个函数符号可以被导出,第二个被隐藏。
先编译成一个动态库,使用到属性-fvisibility
gcc -shared -o libvis.so -fvisibility=
hidden vis.c
现在查看
# readelf -s libvis.so |grep
hidden
7: 0000040c 20 FUNC GLOBAL DEFAULT 11 not
_
hidden
48: 00000420 20 FUNC LOCAL
HIDDEN 11 is
_
hidden
51: 0000040c 20 FUNC GLOBAL DEFAULT 11 not
_
hidden
可以看到,属性确实有作用了。
现在试图link
vi main.c
int main()
{
not
_
hidden();
is
_
hidden();
return 0;
}
试图编译成一个可执行文件,链接到刚才生成的动态库,
gcc -o exe main.c -L ./ -lvis
结果提示:
/tmp/cckYTHcl.o: In function `main':
main.c:(.text+0x17): undefined reference to `is
_
hidden'
说明了
hidden确实起到作用了。