Linux动态库符号导出和屏蔽

        导出一般不是个问题,因为默认情况下是全部导出的,但是,主程序、多个动态库之间存在同名符号怎么办?一般是使用已经存在的,也就是主程序的或已经加载的动态库的。

        这就产生了问题:此种情形大部分情况下我们希望动态库用的是动态库里面自己的,而不是主程序或别的动态库的(因为我们写动态库的时候根本不知道别人有什么)。

        因此必须做到:
1,优先调用动态库自己的符号
2,只导出必要的符号

        以下几个方法的正确组合能保证正确的符号导出和使用:

1,生成动态库时
-Wl,-Bsymbolic 优先使用内部符号,避免调用了其它模块的同名符号

2,编译.o时
-fvisibility=hidden 默认不导出符号,避免暴露内部符号

3,代码
#pragma GCC visibility push(hidden) 隐藏下面的所有符号
#pragma GCC visibility push(default) 导出下面的所有符号
#pragma GCC visibility pop 还原符号

4,单独控制:
__attribute__ ((visibility ("default"))) 用在函数和变量前,导出一个符号,也可用于类和成员

如何查看动态库的符号:

readelf -a libXXXX.so | grep OBJECT
 

你可能感兴趣的:(软件开发,linux,开发语言)