我有 2 个共享对象库,例如libA.so
和libB.so
。我有一个可执行文件,它从这两个库中调用函数,例如funcA()
来自libA
和funcB()
来自libB
。
不幸的是,libA
和都libB
具有一些使用相同符号名称的其他函数,例如libA
具有函数f1()
和f2()
并且libB
还具有函数f1()
和。请注意,libA和libB之间的和的f2()
实现完全不同,它们只是同名而已。f1()
f2()
可执行代码从来不会直接调用f1()
或f2()
,当然libA
应该只调用它的f1()
& f2()
,并且libB
应该只调用它的f1()
和f2()
。
但是,似乎出了点问题,我在运行可执行文件时遇到了段错误。
我对此有一个解决方案,即在构建libA
和时使用“version.script” libB
,这样只公开外部 API 函数(即名为“func*”的函数),即以下脚本...
{
global: func*;
local: *;
};
...并-Wl,--version-script=version.script
在与 gcc 链接时使用。
这是可行的,但它确实给我带来了麻烦,因为我必须使用第三方工具链,这使得使用此 version.script 方法变得复杂(即 hacky)。
libA
有没有更好/其他的方法?(注意,我确实有和的源代码libB
,因此可以更改符号名称,但不喜欢,因为此代码是由第三方工具自动生成的,而且我并不想进入并编辑所有名称。当然,真正的代码不仅仅是和,f1()
而是f2()
数百个类似名称的符号)。
另外,我想了解问题的根本原因?我假设libA
(或libB
)对应该调用哪个f1()
或感到“困惑” f2()
,但为什么——由于libA
和libB
都是单独编译的——我怀疑这与共享对象库有关?
以防万一...库和可执行文件的源代码是 C,并使用 gcc 进行编译和链接,这是在 Linux 上。