17

微软创建了他们的 windows 和 MFC DLL 库等。一个开源开发者编写了一个新的 MFC 应用程序并将源代码作为 GPL 发布。该应用程序必须与 MS DLL/库链接才能在 Windows 中运行,但我认为没有人可以争辩说我们现在有权强制微软的 GPL 他们的 DLL。

这是否意味着 GPL 许可证真的取决于首先“创建”哪个? 如果首先创建专有库(例如 Windows DLL),在没有链接的情况下发布,并且任何 GPL 代码,然后一个 GPL 程序与之链接,则 GPL 程序无法将专有库转换为 GPL,尽管专有代码是“链接”与 GPL 代码。

如果是这种情况,像 NVidia 或 RealNetworks 这样的公司可以做以下事情吗?假设他们喜欢将专有的 HDDecoding 媒体解码引擎库保密,但他们也想“利用”开源 GPL 代码来展示他们的硬件。

  1. 他们创建了一个专有库来进行媒体解码并发布一些示例代码。
  2. 有人(开源开发)创建了链接到这个专有库的“插件”,用于 GPL 代码,例如 XBMC、Mplayer 或 VLC。
  3. 他们是否可以争辩说,由于他们首先创建了专有库(就像 MS 首先创建所有 DLL),与其专有代码链接的 GPL 程序不会将它们转换为 GPL 代码。

理论上可以说,创建与 NVidia 专有媒体解码器库链接的 GPL vlc.exe 文件的开源开发人员违反了 GPL 许可。

这是否意味着在 Windows 中运行的所有 GPL 程序,例如 VLC、git、cygwin 等都违反了 GPL 许可证,因为它们肯定需要与专有的 Microsoft Windows 库链接才能运行。

案例2:这有什么问题:

NVidia 可以创建一个隐藏最新图形功能的新硬件抽象库。他们还用这个库创建了一个 FreeBSD 驱动程序,并发布了 BSD 驱动程序的源代码,而不是库源代码。

某人(Linux 开发人员)可以实现与此库链接的 linux 驱动程序,以创建适用于 Linux 的 NVidia 图形驱动程序。但是由于 NVidia 没有这样做,他们可以在启用“Linux 支持”的同时保持库源“隐藏”。

这肯定违反了 GPL 的精神。

这是否意味着在 Windows/Mac/Iphone/PSP3 中运行任何使用 GPL 源创建的 exe 也违反了 GPL 精神?

4

5 回答 5

9

来自 GNU GPL 常见问题解答:

我可以在为非自由程序编写插件时应用 GPL 吗?

如果程序使用fork和exec调用插件,那么插件是独立的程序,所以主程序的license对它们没有要求。所以插件可以使用GPL,没有特殊要求。

如果程序动态链接插件,它们之间进行函数调用并共享数据结构,我们认为它们形成了一个单独的程序,必须将其视为主程序和插件的扩展。这意味着 GPL 涵盖的插件与非自由主程序的组合将违反 GPL。但是,您可以通过在插件许可证中添加例外来解决该法律问题,允许将其与非自由主程序链接。

另请参阅我正在编写使用非自由库的自由软件的问题。

和:

如果我在 GPL 软件中使用不兼容 GPL 的库,会出现什么法律问题?

两个版本的 GPL 都有其 copyleft 的异常,通常称为系统库异常。如果您要使用的与 GPL 不兼容的库符合系统库的标准,那么您不必做任何特别的事情来使用它们;为整个程序分发源代码的要求不包括这些库,即使您分发包含它们的链接可执行文件。

什么是“系统库”的标准因 GPL 的不同版本而异。GPLv3 在第 1 节中明确定义了“系统库”,以将其从“对应源”的定义中排除。GPLv2 在第 3 节的结尾处说了以下内容:

但是,作为一个特殊的例外,分发的源代码不需要包含任何通常与运行可执行文件的操作系统的主要组件(编译器、内核等)一起分发的东西(以源代码或二进制形式),除非该组件本身附带可执行文件。

...

于 2009-12-06T10:04:58.587 回答
6

您对 GPL 限制生效的方式存在根本性的误解。您的第一个示例包含在“系统库豁免”中 - 但即使不是,它也不会产生您假设的效果。

GPL 规定,如果您分发 GPL 程序或其衍生程序,您还必须根据 GPL 等效条款(向您分发程序/衍生程序的人)提供程序或衍生程序的源代码。

这意味着,如果我分发您的 GPL 程序与某些 Microsoft 代码链接,我必须提供整个蜡球的源代码,否则可能会因侵犯版权而被您起诉。请注意,只要 Microsoft 是第三方,这不会对他们施加任何限制(当然!)。如果我无法访问 Microsoft 的代码(这很可能),那么我无法在不违反您的许可的情况下分发该衍生作品。

于 2009-12-06T11:39:33.867 回答
1

简单地说,就是你不能在与 GPL 不兼容的代码或库之上应用GPL并分发已编译的组合作品,除非你应用链接异常

链接异常为您提供了一种分发包含非自由位的已编译可执行文件的方法,而无需特殊权限即可以源格式分发程序。

当然,这个例外取决于允许您分发与其链接的程序(尤其是静态链接的程序)的非自由库。

所以,回答你的第一个问题,不..这不是“鸡或蛋”的场景。我的建议是,当面临必须编写异常的可能性时,最好选择限制较少的许可证,例如 Apache 或 3 条款 BSD 许可证。

其次,不,您不能仅仅将 GPL 应用到您的代码中,以更改您碰巧链接到的东西的许可证。再次,我们回到链接异常,这是您的责任。

spriritGPL 生活在一个没有专有软件之类的世界中。RMS 已多次将此作为最终目标。剩下的就是那些想要在非自由平台上分发自由软件的人必须解决的实际问题。

这是 Linux(如在内核中)仅保留 GPL v2 的最大原因之一。

于 2009-12-07T02:56:42.977 回答
0

IANAL,但创建的顺序并不重要。如果链接两个二进制文件会违反 GPL,那么 GPL 不允许这样做,无论哪个是先创建的。

正如 Michael Burr 所引用的,案例 1 由系统库异常处理。请注意,它与时间无关——如果不是系统库异常,那么在 Windows 98 上运行 2003 年编写的 GPL 代码(该代码在 GPL 代码之前编写)就像它一样违反 GPL将在 Vista 上运行它(它是在 GPL 代码之后编写的)。

我同意案例 2 违反了 GPL 的精神,但是,正如 GPL 使用的术语,NVidia 驱动程序没有与 Linux 内核“链接”,因为它是作为模块加载的。您将无法分发带有静态链接到其中的非免费 NVidia 二进制文件的 Linux 内核,但是这些天谁分发静态链接的内核呢?

于 2009-12-06T10:56:24.137 回答
0

您不能通过链接到其他程序许可证来更改它们,永远不会。如果您的许可证不允许链接到非开源程序,您必须更改您的许可证或停止链接到这些程序。如果其他程序链接到您的程序,情况会有所不同。在这种情况下,他们必须更改许可证或停止链接到您的程序。

于 2009-12-06T11:55:50.357 回答