GCC编译之如何控制共享文件导出符号

本文探讨了在GCC编译中遇到的全局符号介入问题,即一个共享对象的全局符号被另一个共享对象的同名符号覆盖。介绍了Linux下动态连接器对此的处理规则,并详细讲解了如何控制GCC编译的共享文件导出符号,包括使用C++的visibility支持和通过链接参数`--retain-symbols-file`、`--version-script`。提供了相应的宏定义示例和控制导出符号的方法。
摘要由CSDN通过智能技术生成

背景

前不久在调试一个与导出符号相关的bug,问题大概如此:

模块A.so在堆上构造了一个对象即 CTest *one = new CTest; , CTestA.so定义,后来使用one->AMemFunc(),即调用一个成员函数时崩溃。原来在另一个模块B.so(A.so先加载)中,也有一个同名的CTest定义,但是却没有一个叫AMemFunc的成员函数,因此崩溃。

那为什么A.soCTest会被解析到B.so呢?

全局符号介入

这种一个共享对象里面的全局符号被另一个共享对象的同名全局符号覆盖的现象又被称为共享对象全局符号介入(Global Symbol Interpose)。对于全局符号介入这个问题,linux下的动态连接器是这样处理的:它定义了一个规则,那就是当一个符号需要被加入全局符号表时,如果相同的符号名已经存在,则后加入的符号被忽略。

其实,在上述的情形里,B.soCTest是不需要导出的,GCC编译的so

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值