如何使用 Clang 编译 Linux 内核?

S.G*_*ami 2 compiling kernel compiler

出于好奇,我对使用clangzapcc编译器编译Linux 内核很感兴趣;一次一个。

我找不到要遵循的指南。只有 GCC 被用来编译 Linux 内核。

如何使用其他编译器编译 Linux 内核?

Ste*_*itt 11

内核构建允许您指定要使用的工具;例如,要指定 C 编译器,请设置CCHOSTCC变量:

make CC=clang HOSTCC=clang
Run Code Online (Sandbox Code Playgroud)

该构建预计只能使用 GCC 成功,但有人对使用 Clang感兴趣,并且已知它在某些情况下可以工作(某些 Android 内核是使用 Clang 构建的)。


S.G*_*ami 5

感谢斯蒂芬·基特的回答。可以使用 Clang 编译 Linux 内核。但你需要 Clang v9.0。

配置

如果您使用 Arch Linux,有一个很好的方法来 clang v9.0,而无需自己编译:

# Enable the testing repository (if not already enabled):
echo -e "[testing]\nInclude = /etc/pacman.d/mirrorlist" | sudo tee -a /etc/pacman.conf

# Update the database and install clang, llvm, llvm-libs
sudo pacman -Sy testing/clang testing/llvm testing/llvm-libs

# Check if you have clang-9:
clang --version
Run Code Online (Sandbox Code Playgroud)

注意:将来,如果额外的存储库添加了 clang 版本 9,您可以安装该.

获得 clang-9.0 后,从这里下载您选择的内核。

只需使用别名 make 编译内核即可:

alias make="make CC=clang HOSTCC=clang -j `nproc`"
Run Code Online (Sandbox Code Playgroud)

继续安装过程。

完成后,重新启动系统。然后输入:

cat /proc/version
Run Code Online (Sandbox Code Playgroud)

上面的代码将向您显示内核版本以及一些额外的详细信息。例如,我的 /proc/version 文件如下所示:

Linux version 5.4.0-rc1 (sourav@archlinux-pc) (clang version 9.0.0 (tags/RELEASE_900/final)) #1 SMP PREEMPT Sun Oct 6 18:02:41 IST 2019
Run Code Online (Sandbox Code Playgroud)

表现

我不知道这是否是真正的安慰剂,但它的运行速度比 GCC 编译版本要快一些。我还用 clang9 和 zapcc 编译了 Xonotic 等游戏,其中 clang-9 的性能优于 zapcc-7.0 和 gcc 9.1.0。

结论

我认为用 clang 9 编译内核是个好主意。但 zapcc 现在还不能这样做。根据 zapcc 7.0 版和 clang 8.0.1 版(我已经尝试过):

scripts/kconfig/conf  --syncconfig Kconfig
Compiler lacks asm-goto support.
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!