gcc 的visibility 使用

gcc 的visibility 使用(zz)

-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确实起到作用了。

你可能感兴趣的:(visibility)