我在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
?我可以加载两个库并让代码调用正确的符号版本吗?所以我需要一些特殊的符号级版本控制?
您可以做一些版本脚本技巧:
http://sunsite.ualberta.ca/Documentation/Gnu/binutils-2.9.1/html_node/ld_26.html
这可能需要您在lib周围编写一个包装器,该包装器引入libfoo.so.1,它明确地导出一些符号并将所有其他符号屏蔽为本地符号.例如:
MYSYMS {global:foo1; foo2的; 当地:*; };
当你链接那个包装器时使用它,如:
gcc -shared -Wl, - version-script,mysyms.map -o mylib wrapper.o -lfoo -L/path/to/foo.so.1
这应该使libfoo.so.1的符号在包装器本地,并且不能用于主exe.