二进制链接到同一包的不同共享库
Binary linked against different shared libraries of the same package
我有 2 个相互冲突的共享库,其他二进制文件 link 反对它们。更详细地说,我有这样的东西:
- top-lib1.so linked with libprotobuf.so;
- top-lib2.so linked with libprotobuf-lite.so;
- binary linked with top-lib1.so and top-lib2.so.
问题是,当我启动我的 binary 时,由于双重释放引起的一些内存损坏,我崩溃了:第一个来自 protobuf.so,第二个来自 protobuf-lite.so(参见 related bug)。
我无法访问 top-lib2.so 来源,我也无法 link top-lib1.so 与 protobuf-lite.so 由于我的应用功能。
所以我的问题是:如何处理?
由于这次崩溃我不能同时离开,我不能重新link我的库(top-lib1.so)libprotobuf-lite.so,我改不了top-lib2.so.
有没有办法重新linktop-lib2.so和libprotobuf.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
,你还有其他选择:
你可以 link top-lib1.so
个目标文件 和 所有 libprotobuf.so
个目标文件二进制并隐藏其中所有 libprotobuf
的符号(通过 linker 脚本)。如果你这样做,top-lib2.so
无法告诉 除了它期望的 libprotobuf-lite.so
之外还有任何东西。
你可以对 top-lib1.so
做同样的事情——即 隐藏 libprotobuf
在里面。
您可以 link 您的 libprotobuf.so
副本与 -Wl,--default-symver
,这会将 @@libprotobuf.so
版本附加到从 [=10= 导出的每个符号], 并首先避免导致问题的符号冲突。
我有 2 个相互冲突的共享库,其他二进制文件 link 反对它们。更详细地说,我有这样的东西:
- top-lib1.so linked with libprotobuf.so;
- top-lib2.so linked with libprotobuf-lite.so;
- binary linked with top-lib1.so and top-lib2.so.
问题是,当我启动我的 binary 时,由于双重释放引起的一些内存损坏,我崩溃了:第一个来自 protobuf.so,第二个来自 protobuf-lite.so(参见 related bug)。
我无法访问 top-lib2.so 来源,我也无法 link top-lib1.so 与 protobuf-lite.so 由于我的应用功能。
所以我的问题是:如何处理?
由于这次崩溃我不能同时离开,我不能重新link我的库(top-lib1.so)libprotobuf-lite.so,我改不了top-lib2.so.
有没有办法重新linktop-lib2.so和libprotobuf.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
,你还有其他选择:
你可以 link
top-lib1.so
个目标文件 和 所有libprotobuf.so
个目标文件二进制并隐藏其中所有libprotobuf
的符号(通过 linker 脚本)。如果你这样做,top-lib2.so
无法告诉 除了它期望的libprotobuf-lite.so
之外还有任何东西。你可以对
top-lib1.so
做同样的事情——即 隐藏libprotobuf
在里面。您可以 link 您的
libprotobuf.so
副本与-Wl,--default-symver
,这会将@@libprotobuf.so
版本附加到从 [=10= 导出的每个符号], 并首先避免导致问题的符号冲突。