【问题标题】:How to strip symbols from a 3rd party dependent DLL/so from my DLL/so?如何从我的 DLL/so 中删除依赖于第 3 方的 DLL/so 的符号?
【发布时间】:2012-05-17 22:24:15
【问题描述】:

假设我的软件项目 A 作为共享库 (libA.so) 发布。 A 使用第 3 方库 B,它在我构建 libA.so 时将其链接为共享库。 (虽然我很乐意使用 libB.a 而不是 libB.so,如果这是解决方案的一部分。) B 由 A 使用,但严格来说,链接到 A 的应用程序不需要看到任何B 的符号,它不是 A 的公共 API 的一部分。

好的,问题来了:一些应用程序出于自身原因链接到 B,以及链接到 A,如果 B 的版本(应用程序使用的版本和 A 在构建时链接的版本)没有匹配时,符号冲突时会出现随机崩溃。

如何使 B 的所有符号根据 A 的需要进行解析,但不导出为 libA.so 中的可见符号?换句话说,我不希望链接 A 的应用程序直接解析 B 的符号。这可能吗?

首先,我需要 Linux 上的解决方案,但知道如何在 OSX 和/或 Windows 上解决问题也会有所帮助。

我了解如何限制 A 本身中符号的可见性(不一定是 A 的公共 API 的一部分),但我该如何为依赖库 B 执行此操作?

【问题讨论】:

    标签: linux gcc linker


    【解决方案1】:

    ...一些应用程序出于自身原因链接到 B... 换句话说,我不希望链接 A 的应用直接解析 B 的符号。

    想一想:如果你阻止应用链接到 B 的符号,那么应用如何满足“它自己链接到 B 的理由”?

    您的问题(如上所述)是自相矛盾的。

    现在,用于链接同一可执行文件的不同部分的多个版本的 B 显然是个问题。

    我知道的唯一解决方案是让您“隐藏”您完全使用 B 的事实。这样做的方法是:

    1. 链接到libB.a,并且
    2. libA.so 中隐藏B 的符号,因此它们不会被导出。 使用linker version script 最容易做到这一点。

    请注意,如果libB.a 分布在例如GPL,将其副本放入 libA.so 可能要求您满足 libBs 许可条款。谨慎行事并咨询您的律师。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      相关资源
      最近更新 更多