二进制链接到同一个包的不同共享库

时间:2015-12-16 23:19:24

标签: linux shared-libraries protocol-buffers dynamic-linking

我有2个相互冲突的共享库,以及与之相关的其他二进制文件。更详细一点,我有这样的事情:

  • top-lib1.so libprotobuf.so 相关联;
  • top-lib2.so libprotobuf-lite.so 相关联;
  • 二进制 top-lib1.so top-lib2.so 相关联。

问题在于,当我启动二进制时,由于双重免费导致的内存损坏导致崩溃:第一个来自 protobuf.so ,第二个来自 protobuf-lite.so (见related bug)。

我无法访问 top-lib2.so 来源,我无法将 top-lib1.so protobuf相关联-lite.so 由于我的应用功能。

因此我的问题是:如何处理它?<​​/ p>

由于此次崩溃我无法离开,我无法将我的lib( top-lib1.so )与 libprotobuf-lite.so重新关联,我无法更改 top-lib2.so

有没有办法在没有来源的情况下将 top-lib2.so libprotobuf.so 重新关联?还是有其他可能吗?

1 个答案:

答案 0 :(得分:3)

你有几个选择。

您提到的上游错误表明&#34; libprotobuf.so包含libprotobuf-lite.so所拥有的所有内容,以及更多&#34;。如果确实如此,一种可能的解决方案是将top-lib2.so的{​​{1}}部分二进制补丁引用.dynamic而不是libprotobuf.so。前者较短,因此只需用-lite.so覆盖字符串libprotobuf-lite.so即可。

如果您不想二进制补丁libprotobuf.so\0e.so,您还有其他选择:

  1. 您可以将包含目标文件所有top-lib2.so个的top-lib1.so链接到主二进制文件中并隐藏所有libprotobuf.so&# 39;其中的符号(通过链接描述文件)。如果您这样做,libprotobuf 无法告诉除了top-lib2.so之外还有其他任何内容。

  2. 您可以对libprotobuf-lite.so执行相同的操作 - 即隐藏 top-lib1.so

  3. 您可以将libprotobuf的副本与libprotobuf.so相关联,这会将-Wl,--default-symver版本附加到从@@libprotobuf.so导出的每个符号,并避免符号冲突首先导致问题。