当前位置:  开发笔记 > 运维 > 正文

加载具有不同版本的多个共享库

如何解决《加载具有不同版本的多个共享库》经验,为你挑选了1个好方法。

我在Linux上有一个可执行文件加载libfoo.so.1(即a SONAME)作为其依赖项之一(通过另一个共享库).它还链接到另一个系统库,而该系统库又链接到系统版本libfoo.so.2.其结果是, libfoo.so.1libfoo.so.2执行期间被加载,和这应该从库版本1调用函数代码结束调用从一个较新的系统库(二进制不相容)功能与第2版,因为一些符号保持不变.结果通常是堆栈粉碎和随后的段错误.

现在,链接旧版本的库是一个封闭源的第三方库,我无法控制libfoo它编译的版本.假设,剩下的唯一选择是重建当前链接的一堆系统库以libfoo.so.2进行链接libfoo.so.1.

有没有办法避免使用链接到旧版本的本地副本替换系统库libfoo?我可以加载两个库并让代码调用正确的符号版本吗?所以我需要一些特殊的符号级版本控制?



1> 小智..:

您可以做一些版本脚本技巧:

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.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有