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

我有2个共享库彼此冲突,并与其他二进制文件链接。 为了更详细,我有这样的东西:

  • top-lib1.solibprotobuf.so链接;
  • top-lib2.solibprotobuf-lite.so链接;
  • 二进制链接与top-lib1.sotop-lib2.so

问题是,当我启动我的二进制文件时 ,由于双免费引起的内存损坏,我已经崩溃了:第一个来自protobuf.so ,第二个来自protobuf-lite.so (请参阅相关错误 )。

我没有访问top-lib2.so源代码,由于我的应用程序function,我无法将top-lib1.soprotobuf-lite.so链接。

所以我的问题是:如何处理呢?

由于这个崩溃,我不能离开这两个,我不能重新链接我的lib( top-lib1.so )与libprotobuf-lite.so ,我不能改变top-lib2.so

有什么办法可以重新链接top-lib2.solibprotobuf.so没有来源? 或者还有其他的可能吗?

你有几个选择。

你提到的上游漏洞说“ libprotobuf.so拥有libprotobuf-lite.so所有的东西,还有更多”。 如果确实如此,一个可能的解决方案是二进制补丁top-lib2.so.dynamic部分引用libprotobuf.so而不是-lite.so 前者更短,所以只需用libprotobuf.so\0e.so覆盖字符串libprotobuf-lite.so libprotobuf.so\0e.so

如果你不想二进制补丁top-lib2.so ,你有其他的选择:

  1. 你可以将所有包含目标文件的top-lib1.so链接到所有的top-lib1.so链接中,并且隐藏所有libprotobuf的符号(通过链接描述文件)。 如果你这样做的话, top-lib2.so 不能告诉它除了libprotobuf-lite.so之外什么libprotobuf-lite.so

  2. 你可以用top-lib1.so来做同样的top-lib1.so – 即在里面隐藏 libprotobuf

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