我有2个共享库彼此冲突,并与其他二进制文件链接。 为了更详细,我有这样的东西:
问题是,当我启动我的二进制文件时 ,由于双免费引起的内存损坏,我已经崩溃了:第一个来自protobuf.so ,第二个来自protobuf-lite.so (请参阅相关错误 )。
我没有访问top-lib2.so源代码,由于我的应用程序function,我无法将top-lib1.so与protobuf-lite.so链接。
所以我的问题是:如何处理呢?
由于这个崩溃,我不能离开这两个,我不能重新链接我的lib( top-lib1.so )与libprotobuf-lite.so ,我不能改变top-lib2.so 。
有什么办法可以重新链接top-lib2.so与libprotobuf.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
,你有其他的选择:
你可以将所有包含目标文件的top-lib1.so
链接到所有的top-lib1.so
链接中,并且隐藏所有libprotobuf
的符号(通过链接描述文件)。 如果你这样做的话, top-lib2.so
不能告诉它除了libprotobuf-lite.so
之外什么libprotobuf-lite.so
。
你可以用top-lib1.so
来做同样的top-lib1.so
– 即在里面隐藏 libprotobuf
。
您可以将libprotobuf.so
的副本与libprotobuf.so
-Wl,--default-symver
,这会将@@libprotobuf.so
版本附加到从libprotobuf.so
导出的每个符号,并避免导致问题的符号冲突。