我有两个动态库,a.so和b.so.两个库都包含一个函数f(),每个库中都有不同的代码。从另一个函数ga()和gb()。
在每个库中调用此函数我还有一个可执行程序,使用dlopen()动态加载这两个库。该程序在某个时刻调用ga()和gb()。在每种情况下都会执行什么函数f()?
这是所有C代码,因此f()在a.so和b.so中应该是相同的符号。
答案 0 :(得分:0)
每种情况下执行什么函数f()?
取决于。
如果您使用的是类似UNIX的系统,并且在编译或链接a.so
和b.so
时没有使用任何特殊标记,并且f()
是全局的(即不一个static
函数),那么f
来自dlopen
的第一个共享库是RTLD_GLOBAL
将被调用的假设{{1} } {}在dlopen
中使用。
当您在编译时使用-fvisibility=hidden
或在链接时使用-Bsymbolic
或使用链接描述文件来限制f
或链接器版本脚本的可见性以分配不同时,此答案会更改两个实例的符号版本,或RTLD_LOCAL
,或...(我确信我错过了更多改变行为的方法)。