GPL代码与专有库的链接是否取决于首先创建的?

时间:2009-12-06 09:13:48

标签: windows linux gpl freebsd nvidia

Microsoft创建他们的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代码。
  4. 理论上可以说,创建与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中运行使用GPLed源创建的任何exe也违反了GPL的精神?

5 个答案:

答案 0 :(得分:8)

来自GNU GPL FAQ:

  

Can I apply the GPL when writing a plug-in for a non-free program?

     

如果程序使用fork和exec来   调用插件,然后是插件   单独的程序,所以许可证   主程序没有要求   对他们来说所以你可以用GPL来表示   插件,并没有特别的   要求。

     

如果程序动态链接   插件,他们进行函数调用   相互之间共享数据   结构,我们相信它们形成了一个   单个程序,必须予以处理   作为主要的延伸   程序和插件。这意味着   GPL覆盖的那种组合   插件与非免费主程序   会违反GPL。但是,你   可以解决这个法律问题   为插件添加例外   许可,允许链接它   使用非免费主程序。

     

另见问题I am writing free software that uses a non-free library

  

What legal issues come up if I use GPL-incompatible libraries with GPL software?

     

GPL的两个版本都有   通常,他们的copyleft例外   称为系统库异常。   如果是GPL不兼容的库你   想要使用符合标准的   系统库,那你就没有了   做任何特别的事情来使用它们;该   分发源代码的要求   整个计划不包括   那些图书馆,即使你   分发链接的可执行文件   包含它们。

     

什么算作的标准   “系统库”各不相同   不同版本的GPL。 GPLv3的   明确定义“系统库”   在第1节中,将其排除在外   “对应来源”的定义。   GPLv2接近结束时说以下内容   第3节:

     但是,作为特殊例外,   分发的源代码不需要   包括通常的任何东西   分布式(在源头或   二进制形式)与主要组件   (编译器,内核等)的   操作系统上的   可执行文件运行,除非该组件   本身伴随着可执行文件。

     

...

答案 1 :(得分:5)

您对GPL限制的生效方式存在根本性的误解。你的第一个例子被“系统库豁免”所涵盖 - 但即使它没有,也不会产生你提出的效果。

GPL表示,如果您分发GPL程序或其衍生产品,您还必须根据GPL等效条款(向您分发程序/衍生产品的人员)提供程序或衍生产品的来源。

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

简单来说,这意味着您不能在非compatible with the GPL的代码或库之上应用GPL并分发已编译的组合作品,除非您应用linking exception

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

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

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

其次,不,您不能只是将GPL应用于您的代码,以便更改您碰巧链接的内容的许可。我们再次回到链接例外,这是您有责任提供的。

GPL的spririt生活在一个没有专有软件之类的世界。 RMS已经多次将此作为最终目标。对于那些想要在非自由平台上发布免费软件的人来说,必须要解决的是实用性

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