【问题标题】:A use of BSD-headers and linking with BSD-libraries in GCC project在 GCC 项目中使用 BSD 头文件并与 BSD 库链接
【发布时间】:2021-12-20 18:44:37
【问题描述】:

关于 GCC 和 GPL3 的一个问题。

是否可以在 GCC 项目(-fork) 中使用具有类似 BSD 许可证的库头文件?

假设有一个名为 A (libA) 的 BSD 库,它描述了一些 IR-A。 libA 有一个方法 compileModuleA。在工作时,此方法加载(dlopen)一些外部动态库B(通过文本配置文件中的路径和名称)并从动态库B调用另一个compileModuleB方法(dlsym)。

还有一个从 GIMPLE 到 IR-A 的翻译器和 GCC(-fork) 中的 compileModuleA 调用。 GCC 与 libA 链接并包含 libA-headers。

所以 libA 对 GCC 和 libB 项目及其标头一无所知。 libB 仅使用 libA 头文件并实现方法 compileModuleB。 GCC 只使用 libA 头文件。

GCC      libB
   \    /
    libA

那么 libA 可以在 BSD 许可证下,而 libB 在非开源许可证下吗?这种方案在 GPL3 下对 GCC 有效吗?


(第一个在stackoverflow上发布的问题。正确的方法是在stackexchange上发布或搜索。)

通过关注Can plugins for closed source software use GPL'd libraries?,让我们添加一些说明。

将 libB 替换为可执行的 toolB,libA 对 toolB 的 vfork/exec 的回调以及通过套接字发送的 IR-A(例如文本)。 toolB 解析 IR-A 文本(不与 libA 链接)并将其编译到目标汇编器并通过套接字将汇编器发送回。


(补充:) GCC-GPL 打印汇编器的文本。 Llvm-BSD 打印汇编程序的文本。所以对我来说,汇编程序是“开放”语言。汇编器的文本可以由 GCC-GPL 打印,然后由 llvm-as-BSD 翻译成目标代码(理论上)。为了可用性,从技术上讲,llvm-as 可以由 vfork/exec 调用,而汇编程序的文本/目标代码可以通过 socketpair 发送而无需临时文件。现在我认为这是一种合法的用法。例如,如果 GCC-GPL 打印 llvm-IR(通过内部 GPL 模块)并将 llvm-IR 发送到 llc,这也是合法的,不是吗?

从一开始我的错误是什么? (其中之一:)) Llvm-IR 被许多通道使用,它是一个“高级”IR(实际上它与 C 非常相似)。因此,在机器代码转换之前添加一个从 llvm-IR 到另一个 IR 的桥会提供一个功能编译器“库”。

相比之下,GIMPLE-IR 有不同的阶段(早期、中期、后期等)。而且大部分通用功能(降低)也适用于 RTL(也有不同的阶段)。这就是为什么我现在认为通过打印文本从(早期)-GIMPLE 到“extern”-IR 的桥梁在法律意义上是可能的。 (当然,在某些情况下这是非常艰苦的工作,但根本不是火箭科学。)但可能这样的方案只提供了一个 C/C++ 前端,没有很多重要的功能部分。

【问题讨论】:

  • 这是法律问题还是技术问题?对于技术问题,您可以给我发电子邮件(请参阅我的个人资料),但对于法律问题,您需要联系您的律师!这还取决于您是否销售软件或服务。法律问题取决于您所在的国家或法律制度
  • Василий Дмитриевич,спасибо Вам за отклик。据我了解,我的问题比技术更合法。我所在的组织在这个领域没有足够的合格律师。我通过在 llvm 的 fork 中添加一个从 llvm-IR 到一个非开源后端的翻译器来为一种架构移植 LLVM。因此,我想知道这种方案对于 gcc 是否合法?例如对于一个类似于 Dragonegg 的项目。
  • 事实上,我想即使翻译者的方案现在是合法的,它也不是 gcc 开发者想要的。因此,它可能在未来被关闭。另一方面,如果 gcc 使用 BSD 库(没有 gpl-forks),这很难做到,不是吗?
  • 在实践中,你会更好地与 GCC 社区合作

标签: gcc plugins licensing gpl


【解决方案1】:

我不太明白这个问题,所以如果我误解了某些内容,请在回复中纠正我。

如果有 BSD 许可下的 libA,并且有 BSD 许可下的 libB,并且 libA 或 libB 与 GCC 合并,您可以从 libA 和 libB 中获取您想要的所有代码,并在 BSD 许可下使用它。但是,如果您采用与例如合并的 GCC 代码。 libA,所有的工作都是 GPL 的,但你仍然可以提取 libA 代码并在 BSD 许可下使用它。

请注意,GCC 只能用作工具,而不是真正的库,因此将 GCC 与 libA 和 libB 一起使用来编译它们不会使它们成为 GPL,因为编译器的技术性质或由 GNU GPL 授予的特殊例外FSF(例如 g++)。

请注意,当您使用 GCC 库时,由 GCC 生成的汇编代码可能是 GPL 的,例如c++ 库等,但如果您使用其他许可下的外部库,则汇编代码不会被 GPL 编译

此帖子不是法律建议

【讨论】:

  • 我发现这个问题很难理解(我不知道编译器),我最初的想法和你一样,但这句话让我停顿了:“那么 libA 是否可以在 BSD-license 下, 并且 libB 是在非开源许可证下?”所以似乎有一个问题,这里描述的安排是否可以在不兼容 GPL 的许可下使用 libB 完成
  • libB 如果不随 GCC 一起分发,它可能处于非开源许可下,但它提供给用户的说明是“与 GCC 链接”,因为 GPL 要求分发修改版本,而不是 GPL 下的修改。 ** 这不是法律建议**
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 2013-05-20
  • 1970-01-01
  • 2016-03-16
相关资源
最近更新 更多