我在 Linux 上有一个可执行文件,它加载libfoo.so.1
(即 a SONAME
)作为其依赖项之一(通过另一个共享库)。它还链接到另一个系统库,而后者又链接到系统版本libfoo.so.2
. 结果,两者 libfoo.so.1
都在执行期间被加载,并且libfoo.so.2
本应从版本 1 的库中调用函数的代码最终会从版本 2 的较新系统库中调用(二进制不兼容)函数,因为某些符号保持不变。结果通常是堆栈粉碎和随后的段错误。
现在,链接到旧版本的库是一个封闭源代码的第三方库,我无法控制libfoo
它编译的版本。假设剩下的唯一选择是重建一堆当前链接到的系统库libfoo.so.2
以链接到libfoo.so.1
.
有没有办法避免用链接到旧的本地副本替换系统库libfoo
?我可以加载这两个库并让代码调用正确版本的符号吗?所以我需要一些特殊的符号级版本控制?