引用我在
/t/195045 上发布的话来:
其实GPL中有一个漏洞是可以利用的。而且这一个漏洞早就被无数人利用了。这句话说起来比较拗口:GPL授权要求(再)发布包含/使用GPL代码的软件的人/组织将完整的使用了GPL的程序的代码以GPL发布。
上面那句话太难理解,我这里给个例子,假如说有个GPL程序,如果我为这个程序开发了一个插件,,那么我是可以*单独*以任何协议发布这个插件,而让用户自己去完成“安装插件”这个步骤的。法律上将,真正发布了完整系统的(GPL授权的程序 + 插件)是用户自己,而GPL规定需要向发布者索取代码,这就意味着用户自己需要向自己索取代码。这个就是个死锁了。
这个典型的应用就是针对linux kernel发布的专有内核模块。比如n卡的驱动程序。另外还有一个典型应用就是gccgo(
https://golang.org/doc/install/gccgo )。gccgo是为gcc开发的go语言编译器前端,而gccgo本身是BSD授权的;而gcc是GPL授权。所以gccgo是单独发布的。原文:Although the frontend itself is under a BSD-style license, gccgo is normally used as part of GCC and is then covered by the GNU General Public License
法律意义上说,gccgo单独发布的代码是BSD授权。但是一旦用户自己(或者发行版的打包人员)把gccgo和gcc扔在一起,gccgo瞬间就变成了GPL授权了。
<snip>
GPL中明确定义了什么是“使用”。一个网站可以用很多GPL的程序,但并不意味着整个网站都被GPL感染了。MySQL也是GPL授权,但并不意味着运行MySQL的网站就都被迫需要用GPL。软件如果没有发布,是不存在许可证问题的。
<snip>
除了GPL以外,还有其他许可证也是会感染“使用者”的,即copyleft类型许可证。但是不同许可证对“使用者”的定义不同。LGPL就不把使用共享库的用户认为是使用者。换句话说,如果我使用了一个LGPL的共享库,那么我可以不以LGPL许可证发布我的代码。但是如果我修改了LGPL授权的程序,我需要再分发。所以LGPL是比GPL更弱的许可证。还有一个AGPL,是比GPL更强的许可证。前面说了,如果我用GPL的程序通过网络对外提供服务,那么我是不会被GPL印象的。比如,我修改了MySQL的代码,并且使用修改后的MySQL对外提供数据库服务,那么我是不用把我修改后的MySQL以GPL授权的。简单说,我是MySQL的用户,我利用MySQL给我的用户提供服务,而这些用户并不直接是MySQL的用户。即,你用户的用户不是你的用户,所以GPL无法影响。AGPL则不同,它把用户的用户也归类为自己的用户。典型的AGPL程序就是MongoDB。如果我做了一个网站,修改了MongoDB,那么一旦我的网站有了用户,我则必须给这些用户提供我修改的MongoDB的代码。AGPL的传染性非常强,所以有些大公司都会禁止使用AGPL的软件。是的,MongoDB在一些公司是禁止使用的。