假设我的用户空间(包)是用gcc 4.7
和libc6 2.13
(Debian Wheezy)编译的
我可以在不同的开发环境下编译linux内核吗,例如gcc 6.3
和libc6 2.24
(即在Debian Stretch下)?
我知道与包不同,内核不与任何动态库链接。因此从理论上讲,它是在哪个gcc
和libc
它下编译的应该没有区别。
这是真的 ?当我这样做时,我会遇到麻烦吗?会不会是gcc
版本不同导致的不兼容?
另一方面,较新的gcc
有一些有趣的功能,更好的安全性。那么也许内核应该用最新的编译gcc
?
答案1
正如您所指出的,正在使用的 C 库对内核没有影响,内核不使用 C 库。 (存在间接影响,因为它用于构建内核在构建过程中使用的工具,但这极不可能影响最终结果。)
内核可以使用多种不同的编译器版本构建;根据其文档,它只需要 GCC 3.2 或更高版本。您还会发现内核可能需要一段时间才能正式支持最新版本的 GCC,而发行版内核使用它则需要更长的时间。例如,Debian Linux 内核包使用 GCC 6,甚至有专用包来提供正确的编译器版本(linux-compiler-gcc-6-x86
上amd64
和i386
)。用于内核的编译器和用于用户空间的编译器之间没有任何联系(也不一定需要为所有用户空间使用相同的编译器 - 使用 GCC 3 甚至 2 构建的旧程序仍然可以在现代系统上运行)。
较新的编译器版本确实提供了更多安全功能,但 GCC 6 对于内核中使用的大多数(如果不是全部)安全功能来说已经足够了。
答案2
您可以使用与用户空间包不同的工具链来编译内核吗?是的。
内核的核心原则之一是用户空间和内核的分离。两者之间有一个定义良好的接口——系统调用接口。只要用户空间程序尊重这一点,它们是否使用与内核相同的工具链进行编译并不重要。确实,许多程序甚至不是用C或汇编语言编写的,而是使用完全不同的编译器和运行时环境,例如运行在JVM上的Java程序。