静态链接GLIBC和专有软件许可证

3

我对开源和许可证的基本理解存在问题。请有人能否澄清下面情况的一些问题。如果这些问题太基础了,请原谅。

  1. 我正在编写专有软件,其中计划使用一些开源库。我还需要glibc和C编译器,但不想使用操作系统中的默认gcc工具链,因此使用crosstools-ng构建了自己的工具链。

  2. 现在,在ct-ng中,我猜测libstdc++库会被静态链接(这是用于c++的,我认为在大多数情况下不会使用它),但是根据我的工具链配置,我的libc是否是静态链接还是动态链接?如果是这种情况,考虑到glibc是LGPL,并且我可以将其链接到我的专有软件中,这种静态链接是否会对我的许可证造成任何问题?我的软件仍然可以闭源吗?还是必须释放已编译的对象?

我的工具链配置如下,从中能否指出glibc是静态链接还是动态链接?

Target: x86_64-some-linux-gnu
Configured with: /home/balravin/tools/platform/x86/src/gnu/gcc/4.4.7/.build/src/gcc-4.4.7/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=x86_64-some-linux-gnu --prefix=/home/balravin/tools/platform/x86/obj/gnu/gcc/4.4.7/x86_64-some-linux-gnu --with-sysroot=/home/balravin/tools/platform/x86/obj/gnu/gcc/4.4.7/x86_64-some-linux-gnu/x86_64-some-linux-gnu/sysroot --enable-languages=c,c++,fortran --with-pkgversion='crosstool-NG 1.15.3' --disable-sjlj-exceptions --enable-__cxa_atexit --enable-libmudflap --enable-libgomp --enable-libssp --with-gmp=/home/balravin/tools/platform/x86/src/gnu/gcc/4.4.7/.build/x86_64-some-linux-gnu/buildtools --with-mpfr=/home/balravin/tools/platform/x86/src/gnu/gcc/4.4.7/.build/x86_64-some-linux-gnu/buildtools --with-ppl=/home/balravin/tools/platform/x86/src/gnu/gcc/4.4.7/.build/x86_64-some-linux-gnu/buildtools --with-cloog=/home/balravin/tools/platform/x86/src/gnu/gcc/4.4.7/.build/x86_64-some-linux-gnu/buildtools --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --with-long-double-128 --disable-multilib --with-local-prefix=/home/balravin/tools/platform/x86/obj/gnu/gcc/4.4.7/x86_64-some-linux-gnu/x86_64-some-linux-gnu/sysroot --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.4.7 (crosstool-NG 1.15.3) 

如果您感兴趣,我已经在Area51上创建了一个与开源相关的网站提案:http://area51.stackexchange.com/proposals/58715/open-source-licensing?referrer=8PFLrZ3ydnhFtbu7jPSDPA2 - Kurt Pattyn
4
我投票关闭这个问题,因为它涉及许可或法律问题,而不是编程或软件开发。有关详细信息,请参见此处,并查看更多帮助/关于话题。 - Kevin Brown-Silva
1个回答

12

有许多法律和技术原因要使libc.so动态链接。

在法律方面,GNU libc的LGPL许可证要求您允许用户增强其libc;因此,如果您销售一个静态链接的专有软件(这是一种技术上不好的想法),您需要为用户提供重新链接到更好的libc版本的手段;具体而言,您可能还需要提供您软件的*.o对象。

在技术方面,动态链接libc.so几乎是所有间接利用libdl.sold.so(即使用动态链接)的功能所必需的,特别是NSS相关函数(如getpwentgetaddrinfo等,参见nsswitch.conf(5)nss(5))。此外,动态链接libc更加高效(RAM几乎由使用libc.so的所有进程共享,可执行文件大小更小;最重要的是,升级libc.so更容易)。
顺便问一下,您的公司是否考虑过让您的Linux软件免费(就像言论自由一样)?它确实有许多优点,许多公司正在选择开源路线。

非常感谢您的回复。我刚刚对我的问题做了一些修正。只有libstdc ++被静态链接。然而,我理解您的回答当涉及到静态链接libc时,因为您说我应该考虑发布对象/动态链接,以便我的软件用户可以重新编译使用更新的libc。开放部分Linux软件源代码是我正在考虑的事情(当然,除了开源库外,这本来就是开源的),但不是全部源代码,其中将包含一些专有代码。 - devgp
LGPL 仍然要求您方便升级任何您链接的 LGPL-ed 库。 - Basile Starynkevitch
动态链接并不总是最好的选择。当你使用MinGW编写软件,在Windows下编译和运行时,它往往会抱怨缺少libc库。如果你编写一个不需要自己目录的小型技术程序(例如BIOS更新程序),则首选是静态编译libc库。 - Hi-Angel
1
在回答中可能值得提到的是,如果libc存在任何错误或安全漏洞,静态链接它的软件将需要由软件供应商重新链接和重新发布。动态链接它的软件将自动利用操作系统供应商提供的libc更新。 - nobody
我想知道内置的libc函数在这里适用于哪些情况?我的意思是,对于小于8192字节的大小,gcc会用内置代码替换memcpy。这样就没有办法升级库了。这实际上就像静态链接memcpy一样。 - Z boson
1
@Zboson 那段代码实际上并不是来自glibc,因此没有法律问题(gcc有一个许可证例外,用于当您的程序包含libgcc代码时)。 - user253751

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接