
Originally Posted by
airlied
Anyone who shops a prebuilt kernel distributes it, if you build a livecd and give it to your friend you have distributed the Linux kernel.
The debate on the nvidia driver and AFS stuff is borderline, since derived works aren't clearly defined, and generally only a court can decide, and they may take a completely different method of defining it than me or anyone else. Even kernel devs disagree on what constitutes a derived work, and some believe the nvidia driver definitely does.
People have stopped distros and live cd from shipping the nvidia driver on the same media, distros only ship the binary driver separate from the kernel, and cause the user to do the final linking which violates the GPL on that users machine. Also nvidia never distribute the binary driver with a linux kernel attached.
You'll notice for ARM systems most of the kernel drivers are open source for this reason, since they ship them all on one media.
Its not allowed to use the non _GPL symbols unless you are sure your work isn't a derived work, i.e. you have good lawyers who aren't just telling you what you want to hear.
Dave.
Dave, the act of linking does not violate the GPL. The act of distributing something that is linked does. Also, could you define what linking means in this context? As far as I have seen, nothing anyone would associate with a traditional linker seems to be done against the kernel binary until the module is loaded. I did a quick test with a Hello World module:
Code:
make -C /lib/modules/3.6.6/build SUBDIRS=/tmp/module modules
make[1]: Entering directory `/usr/src/linux-3.6.6'
test -e include/generated/autoconf.h -a -e include/config/auto.conf || ( \
echo >&2; \
echo >&2 " ERROR: Kernel configuration is invalid."; \
echo >&2 " include/generated/autoconf.h or include/config/auto.conf are missing.";\
echo >&2 " Run 'make oldconfig && make prepare' on kernel src to fix it."; \
echo >&2 ; \
/bin/false)
mkdir -p /tmp/module/.tmp_versions ; rm -f /tmp/module/.tmp_versions/*
make -f scripts/Makefile.build obj=/tmp/module
gcc -Wp,-MD,/tmp/module/.hello.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include -I/usr/src/linux-3.6.6/arch/x86/include -Iarch/x86/include/generated -Iinclude -include /usr/src/linux-3.6.6/include/linux/kconfig.h -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m64 -march=core2 -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_FXSAVEQ=1 -DCONFIG_AS_AVX=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -Wframe-larger-than=2048 -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -g -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(hello)" -D"KBUILD_MODNAME=KBUILD_STR(hello)" -c -o /tmp/module/hello.o /tmp/module/hello.c
if [ "-pg" = "-pg" ]; then if [ /tmp/module/hello.o != "scripts/mod/empty.o" ]; then /usr/src/linux-3.6.6/scripts/recordmcount "/tmp/module/hello.o"; fi; fi;
(cat /dev/null; echo kernel//tmp/module/hello.ko;) > /tmp/module/modules.order
make -f /usr/src/linux-3.6.6/scripts/Makefile.modpost
scripts/mod/modpost -i /usr/src/linux-3.6.6/Module.symvers -I /tmp/module/Module.symvers -o /tmp/module/Module.symvers -S -w -s
gcc -Wp,-MD,/tmp/module/.hello.mod.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include -I/usr/src/linux-3.6.6/arch/x86/include -Iarch/x86/include/generated -Iinclude -include /usr/src/linux-3.6.6/include/linux/kconfig.h -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m64 -march=core2 -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_FXSAVEQ=1 -DCONFIG_AS_AVX=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -Wframe-larger-than=2048 -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -g -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(hello.mod)" -D"KBUILD_MODNAME=KBUILD_STR(hello)" -DMODULE -c -o /tmp/module/hello.mod.o /tmp/module/hello.mod.c
ld -r -m elf_x86_64 -T /usr/src/linux-3.6.6/scripts/module-common.lds --build-id -o /tmp/module/hello.ko /tmp/module/hello.o /tmp/module/hello.mod.o
make[1]: Leaving directory `/usr/src/linux-3.6.6'
It looks like ld does linking, but the only thing of the kernel's that it appears to use is a little linker script, which is arguably part of the toolchain:
Code:
/*
* Common module linker script, always used when linking a module.
* Archs are free to supply their own linker scripts. ld will
* combine them automatically.
*/
SECTIONS {
/DISCARD/ : { *(.discard) }
__ksymtab : { *(SORT(___ksymtab+*)) }
__ksymtab_gpl : { *(SORT(___ksymtab_gpl+*)) }
__ksymtab_unused : { *(SORT(___ksymtab_unused+*)) }
__ksymtab_unused_gpl : { *(SORT(___ksymtab_unused_gpl+*)) }
__ksymtab_gpl_future : { *(SORT(___ksymtab_gpl_future+*)) }
__kcrctab : { *(SORT(___kcrctab+*)) }
__kcrctab_gpl : { *(SORT(___kcrctab_gpl+*)) }
__kcrctab_unused : { *(SORT(___kcrctab_unused+*)) }
__kcrctab_unused_gpl : { *(SORT(___kcrctab_unused_gpl+*)) }
__kcrctab_gpl_future : { *(SORT(___kcrctab_gpl_future+*)) }
}
I would also appreciate it if you would explain how we have an uproar concerning this particular vendor when we have heard relatively little complaint about the numerous other vendors that have been doing this far longer. To cite a specific example, anyone shipping Linux devices using broadcom hardware. If you would prefer, you could talk about this in the context of graphics. There are plenty of Android devices out there with binary graphics drivers being shipped with the kernel. Why is there no uproar over that? Are they not in violation?