【问题标题】:compiling linux kernel with non-gcc使用非 gcc 编译 linux 内核
【发布时间】:2011-01-21 00:15:30
【问题描述】:

Linux 内核是为使用 gcc 编译而编写的,并且使用了许多小而丑的 gcc-hacks。 除了gcc还有哪些编译器可以编译linux内核?

可以使用的是英特尔编译器。内核编译需要什么最小版本?

还有一个 Tiny C 编译器,但它只能编译经过缩减和特殊编辑的内核版本。

是否有其他编译器能够构建内核?

【问题讨论】:

  • 我的第一个问题是......“为什么 gcc 不是一个选项?”我并不是说你不应该尝试做你正在做的事情,事实上,看到好奇心被放纵真是太好了。但是你正在潜入一个带着激光武器的鲨鱼池,所以我们大多数人可能想知道为什么。
  • @Tim Post,我想学习一下,用非gcc编译器编译linux内核有哪些问题。我使用一个实验性编译器,我必须改进它对 gnu 扩展的支持,这是编译 linux 内核所需的。来自 intel (linuxdna) 的补丁对我来说非常有趣。
  • gcc 生物舒适度的流行,无论 Linus 对 gcc 开发人员吹嘘多少,对你来说都是首要问题。我也对你的评论回复投了赞成票。看看像 ABS() 这样简单的东西,内核已经实现了自己的版本,同时避免了被明显的错误所困扰,这些错误需要数年时间才能流行起来。 Linux 不爱 gcc,反之亦然。他们只是碰巧一起工作得很好。祝你好运:)

标签: linux compiler-construction linux-kernel clang llvm


【解决方案1】:

目前正在将 LLVMLinux 补丁提交到 vanilla 内核(2013-2014)。

LLVMLinux 是 Linux 基金会的项目:http://llvm.linuxfoundation.org/ 以使 vanilla 内核能够使用 LLVM 构建。很多补丁都是由 LLVMLinux 项目负责人 Behan Webster 准备的。

2013 年 5 月有关于该项目的 LWN 文章 https://lwn.net/Articles/549203/“LFCS:LLVMLinux 项目”

LLVMLinux 项目的当前状态在页面http://llvm.linuxfoundation.org/index.php/Bugs#Linux_Kernel_Issues 进行跟踪

已经从内核中删除的东西(基本上是 gcc-isms): * 显式寄存器变量(非 C99) * VLAIS(非 C99 兼容的未记录的 GCC 功能“结构中的可变长度数组”)如 struct S { int array[N];} 甚至 struct S { int array[N]; int array_usb_gadget[M]; } 其中 N 和 M 是非常量函数参数 * 嵌套函数(GCC/Gnat 开发人员将 Ada 功能移植到 C 中;在 C99 中不允许使用) * 一些 gcc/gas 魔法,如特殊段或宏

要做的事情: * 使用内置的__builtin_constant_p 来实现像BUILD_BUG_ON(!__builtin_constant_p(offset)); 这样的可怕魔法

关于 LLVMLinux 的好消息是,在它的补丁之后,内核不仅可以使用 LLVM+clang 构建,而且更容易被其他非 GCC 编译器构建,因为该项目杀死的 C99 代码不像 VLAIS 那样由 usb gadget 创建作者,由 netfilter 黑客和加密子系统黑客;嵌套函数也被杀死。

【讨论】:

    【解决方案2】:

    简而言之,你不能,因为编写内核代码是为了利用 gcc 的编译器语义……而且内核和编译代码之间的关系非常紧密,即必须使用 gcc 编译。 ..由于 gcc 使用“ELF”(嵌入式链接格式)目标文件,内核必须使用目标代码格式构建。除非你可以修改它以与另一个编译器一起工作 - 它可能会编译但可能无法工作,因为 Windows 下的编译器会生成 PE 代码,可能会出现意想不到的结果,这意味着内核可能根本无法启动!

    【讨论】:

    • 除了windows pe之外还有很多操作系统和编译器。许多 unix 中都有 elf 编译器,也有很多用于 linux 的商业编译器(尤其是嵌入式平台)。许多编译器都使用 ELF,其中一些编译器支持部分 gcc 扩展。
    • 我命名了 2 个编译器,它们确实能够在过去的某个时间编译内核 - Intel CC 和 Tiny CC。我想在这里听到 linux 内核编译支持的当前状态。例如。 “Sun Pro 编译器”可以编译内核吗?
    • 有很多编译器可以产生ELF目标代码;这是不正确的。这不是为什么需要 GCC。
    • @Eric:很公平——你的评论得到了适当的注意,关键是从第一天开始 linux 就是使用 gnu 工具链构建的......
    • tommy,现在几乎整个 linux 2.6 分支都可以使用 Intel CC 构建。对于当前内核,此类构建的补丁小于 100 行。此外,LLVM 尝试构建内核,并且它的补丁相当小。 Gcc 不是最好的编译器,即使它不是一个好的编译器(有时)。
    【解决方案3】:

    过时的信息:您需要修补内核才能使用 Intel CC 进行编译 Download Linux kernel patch for Intel® Compiler

    有关更多链接和信息,另请参阅Is it possible to compile Linux kernel with something other than gcc

    最近的来源:http://forums.fedoraforum.org/showthread.php?p=1328718

    【讨论】:

    • 689327 的问题也有点过时了(差不多一年了)。是否有一些新信息甚至是内核的非 gcc 编译器列表?
    • 我想知道除 gcc、icc、tinycc 之外的任何编译器,它们都能够构建内核。
    • llvm with clang 从这个赛季开始就能够构建一个 linux 内核
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2010-10-15
    • 2016-02-08
    相关资源
    最近更新 更多