【发布时间】:2015-12-16 23:19:23
【问题描述】:
我有 2 个相互冲突的共享库,以及链接到它们的其他二进制文件。更详细地说,我有这样的事情:
- top-lib1.so 与 libprotobuf.so 链接;
- top-lib2.so 与 libprotobuf-lite.so 链接;
- binary 与 top-lib1.so 和 top-lib2.so 链接。
问题是,当我启动我的 binary 时,由于双重释放导致的一些内存损坏而崩溃:第一个来自 protobuf.so,第二个来自 protobuf.so来自 protobuf-lite.so(参见 related bug)。
我无法访问 top-lib2.so 来源,也无法将 top-lib1.so 与 protobuf-lite.so 链接 由于我的应用功能。
因此我的问题是:如何处理?
由于这次崩溃,我无法同时离开,我无法将我的库 (top-lib1.so) 与 libprotobuf-lite.so 重新链接,我无法更改 top-lib2.so。
有没有办法在没有来源的情况下将 top-lib2.so 与 libprotobuf.so 重新链接?或者还有其他可能吗?
【问题讨论】:
-
通常依赖于其他共享库的共享库根本不链接它们的依赖项。这意味着您只需要将您的可执行文件与
libprotobuf.so链接起来,它就应该可以正常工作。你能运行ldd top-lib1.so和ldd top-lib2.so并告诉我们它们是否真的链接到任何一个protobuf 库吗?并向我们展示最终可执行文件的链接命令行。 -
@John Zwinck:
ldd top-lib2.so | grep proto: libprotobuf-lite.so.9 => /usr/lib/x86_64-linux-gnu/libprotobuf-lite.so.9 (0x00007fa17d190000);ldd top-lib1.so | grep proto: libprotobuf.so.9 => /usr/lib/x86_64-linux-gnu/libprotobuf.so.9 (0x00007f9431d94000); 最终可执行文件:g++ -o test test.cpp -ltop-lib2.so -ltop-lib1.so;ldd test | grep proto: libprotobuf.so.9 => /usr/lib/x86_64-linux-gnu/libprotobuf.so.9 (0x00007fe639b24000); libprotobuf-lite.so.9 => /usr/lib/x86_64-linux-gnu/libprotobuf-lite.so.9 (0x00007fe625b0a000) -
你的链接器命令行是什么?对于
top-lib1.so和可执行文件。
标签: linux shared-libraries protocol-buffers dynamic-linking