【发布时间】:2012-04-18 18:03:34
【问题描述】:
我有一个需要链接的闭源第 3 方共享库。不幸的是,第 3 方库的创建者并没有费心限制导出哪些符号并导出所有符号。第 3 方库在内部使用了我在代码中使用的流行库的不兼容版本,但导出了冲突的符号(google 的 protobuf 库)。当 protobuffer 库版本检查发现库的编译时和运行时版本不兼容时,这会导致运行时错误。我可以通过恢复到与第 3 方库中使用的版本相匹配的旧版本 protobufs 2.3 来解决问题。但是,protbuf 2.3 存在性能问题,导致我的应用程序无法使用它。我需要一种在我的代码中使用 protobuf 2.4 并让第 3 方库使用它自己的内部 v 2.3 的方法。
有没有办法生成一个新版本的 3rd 方库,它不会从仅给定 so 文件的内部使用的 protobuf v 2.3 库中导出符号?如果我有来源,那将是一个更容易的问题。像objcopy和strip这样的工具似乎并不能真正修改动态符号表。到目前为止,我唯一的想法是创建自己的 shim 库,通过将调用重定向到第 3 方库(也许用 dlopen 打开?),只导出我需要的符号。
有没有更好的解决方案?
【问题讨论】:
-
您使用哪种操作系统?
-
Linux (fedora, ubuntu)...我更喜欢负担得起的科学/分布式计算... ;-)
标签: c++ symbols dynamic-library