C 多个动态库存在同名函数问题处理方法:-fvisibility=hidden

前言

在使用多个动态库时,两个动态库之间有可能存在相同名称的函数,由于动态链接器在程序加载时会对外部引用进行重定位,这样会出现只有第一个函数生效,即所有对该函数的调用都将指向第一个加载的动态库的同名函数中。这样就会很混乱,而且在想改名称也不是很简单的情况下就会很麻烦(例如同名函数太多,甚至就是模板)等等。

处理方法

这里只找到一种处理方法,当然你直接把名字改成不一样或者统一添加前缀(例如C++ namespace)也不错。方法如下:

-fvisibility=hidden

将以上的写入gcc/g++中去,从.o的生成到.so的生成的命令行都要填上。这个有什么作用呢?GUN规定动态库中的所有函数的全局变量默认是对外可见的,如果编译动态库时不添加以上参数,默认是可见的,添加之后,如果调用动态库的函数,由于无法定义到引用的实际实现,会报错:

undefined symbol: XXX

所以还没有结束,接着就是要把动态库部分需要对外显示的函数接口显示出来:例如模块的入口函数:

__attribute__((visibility("default"))) int app_main(void)

__attribute__作用:

__attribute__ 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)

格式:__attribute__(((visibility("default"),,,,,))

当然大家可以看明白,同名的不是可执行文件要调用的函数,而是动态库中其他函数要使用的。

类似案例:

1.一个XXX.a和一个YYY.so内有一些重名的函数要使用,.so是无法进行修改的。

现象:直接连接使用会段错误。

处理步骤1:将.a的编译步骤添加hidden:

gcc -fvisibility=hidden -c *.cpp
ar -rc -o libXXX.a *.o

但是这样加载的时候还是有报错,后面添加了步骤2:

修改链接的顺序:

gcc A.c libXXX.a -lYYY

之前是将libXXX.a放到了后面,就算添加了hidden,但是还是会去使用先连接的YYY.so中的符号,而将libXXX.a放在前面,由于进行了hidden,所以除了接口的文件之外,不会有其他的 符号污染,后面的YYY.so还是使用自己的符号,互不影响。

2.

内核态导出的parameter找不到,不添加hidden又不能按照模板进行加载多个类似的,只能在需要导出的parameter上添加default属性,让该参数可以刷新出来:

  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值