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

Binary linked against different shared libraries of the same package

我有 2 个相互冲突的共享库,其他二进制文件 link 反对它们。更详细地说,我有这样的东西:

问题是,当我启动我的 binary 时,由于双重释放引起的一些内存损坏,我崩溃了:第一个来自 protobuf.so,第二个来自 protobuf-lite.so(参见 related bug)。

我无法访问 top-lib2.so 来源,我也无法 link top-lib1.soprotobuf-lite.so 由于我的应用功能。

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

由于这次崩溃我不能同时离开,我不能重新link我的库(top-lib1.solibprotobuf-lite.so,我改不了top-lib2.so.

有没有办法重新linktop-lib2.solibprotobuf.so没有消息来源?或者还有其他的可能吗?

你确实有几个选择。

您提到的上游错误指出“libprotobuf.so 拥有 libprotobuf-lite.so 的一切,甚至更多”。如果确实如此,一种可能的解决方案是对 top-lib2.so.dynamic 部分进行二进制修补以引用 libprotobuf.so 而不是 -lite.so。前者较短,因此只需用 libprotobuf.so[=17=]e.so 覆盖字符串 libprotobuf-lite.so 即可。

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

  1. 你可以 link top-lib1.so 个目标文件 所有 libprotobuf.so 个目标文件二进制并隐藏其中所有 libprotobuf 的符号(通过 linker 脚本)。如果你这样做,top-lib2.so 无法告诉 除了它期望的 libprotobuf-lite.so 之外还有任何东西。

  2. 你可以对 top-lib1.so 做同样的事情——即 隐藏 libprotobuf 在里面。

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