重复符号动态加载

时间:2017-02-18 13:54:46

标签: linker dlopen

我有两个动态库,a.so和b.so.两个库都包含一个函数f(),每个库中都有不同的代码。从另一个函数ga()和gb()。

在每个库中调用此函数

我还有一个可执行程序,使用dlopen()动态加载这两个库。该程序在某个时刻调用ga()和gb()。在每种情况下都会执行什么函数f()?

这是所有C代码,因此f()在a.so和b.so中应该是相同的符号。

1 个答案:

答案 0 :(得分:0)

  

每种情况下执行什么函数f()?

取决于

如果您使用的是类似UNIX的系统,并且在编译或链接a.sob.so时没有使用任何特殊标记,并且f()是全局的(即一个static函数),那么f来自dlopen的第一个共享库是RTLD_GLOBAL将被调用的假设{{1} } {}在dlopen中使用。

当您在编译时使用-fvisibility=hidden或在链接时使用-Bsymbolic或使用链接描述文件来限制f或链接器版本脚本的可见性以分配不同时,此答案会更改两个实例的符号版本,或RTLD_LOCAL,或...(我确信我错过了更多改变行为的方法)。