gpt4 book ai didi

linux - 如何从我的 DLL/so 中剥离依赖于第 3 方的 DLL/so 中的符号?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:03 29 4
gpt4 key购买 nike

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

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

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

主要是,我需要一个 Linux 上的解决方案,但了解如何在 OSX 和/或 Windows 上解决问题也会对以后有所帮助。

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

最佳答案

... some apps link against B for their own reasons ... In other words, I don't want an app linking against A to ever directly resolve against B's symbols.

想一想:如果您阻止该应用链接到 B 的符号,该应用将如何满足“它自己链接到 B 的原因”?

你的问题(如前所述)是自相矛盾的。

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

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

  1. 针对 libB.a 的链接,以及
  2. 将 B 的符号隐藏在 libA.so 中,因此它们不会被导出。这是最容易实现的 linker version script .

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

关于linux - 如何从我的 DLL/so 中剥离依赖于第 3 方的 DLL/so 中的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10644319/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com