__attribute__ ((visibility("default")))

Jason1512

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

 

  Attribute Definitions Specific to g++

    作为对visibility属性(详见于“Visibility Attributes and Pragmas for GCC C++ Libraries”)的补充,g++提供了2个额外的属性,即init_priority(priority)和java_interface属性。

    The init_priority Attribute

    该属性允许用户控制某个名字空间里的对象的初始化顺序。通常,对象的初始化顺序是它们在某个代码单元里的定义顺序。init_priority只有一个整型参数,值为101到65535,越小表示优先级越大。比如,在下面的伪码里,类MyClass将比类YourClass先初始化:

    class MyClass

    {

    …

    };

    class YourClass

    {

    __attribute__ ((visibility("default"))) void MyMethod();

    …

    };

    要改变它们的初始化顺序,你可以把代码改成下面这样:

    class MyClass

    {

    __attribute__ ((init_priority(65535)));

    …

    };

    class YourClass

    {

    __attribute__ ((init_priority(101)));

    …

    };

    你只需要注意所使用的优先级数值的顺序,具体使用了哪个数值则无所谓(即只要MyClass的优先级数值比YourClass大就行了,是不是65535和101则无所谓)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>