selective focus photography of computer code monitor display

Kernel mit clang bauen: Erste Gehversuche

Der Linux Kernel ist schon ein schönes Stück Programmierkunst, mit dessen Bau ich mich eigentlich recht wohl fühle. So sicher, dass ich inzwischen meine eigenen Debian Pakete schnüre. Höchste Zeit also, ein bisschen was Umzubauen um die Sache interessanter zu gestalten. Wie wäre es mit clang und LTO? Das einzige Problem dabei ist gute Doku – also selbst schreiben.

Um den Kernel überhaupt mit LTO zu bauen, sollte die Config mit folgenden Optionen versehen sein:

# CONFIG_STACKPROTECTOR is not set
CONFIG_LTO=y
CONFIG_LTO_CLANG=y
CONFIG_ARCH_SUPPORTS_LTO_CLANG=y
CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y
CONFIG_HAS_LTO_CLANG=y
# CONFIG_LTO_NONE is not set
CONFIG_LTO_CLANG_FULL=y
# CONFIG_LTO_CLANG_THIN is not set

Compiling wäre ziemlich einfach, sobald wir die clang-11 Binaries (debian buster default) mit Symlinks in den Griff kriegen, damit sie von den Scripts auch gefunden werden. Ein Job für update-alternatives:

update-alternatives \
–verbose \
–install /usr/bin/llvm-config llvm-config /usr/bin/llvm-config-11 100 \
–slave /usr/bin/llvm-ar llvm-ar /usr/bin/llvm-ar-11 \
–slave /usr/bin/llvm-as llvm-as /usr/bin/llvm-as-11 \
–slave /usr/bin/llvm-bcanalyzer llvm-bcanalyzer /usr/bin/llvm-bcanalyzer-11 \
–slave /usr/bin/llvm-cov llvm-cov /usr/bin/llvm-cov-11 \
–slave /usr/bin/llvm-diff llvm-diff /usr/bin/llvm-diff-11 \
–slave /usr/bin/llvm-dis llvm-dis /usr/bin/llvm-dis-11 \
–slave /usr/bin/llvm-dwarfdump llvm-dwarfdump /usr/bin/llvm-dwarfdump-11 \
–slave /usr/bin/llvm-extract llvm-extract /usr/bin/llvm-extract-11 \
–slave /usr/bin/llvm-link llvm-link /usr/bin/llvm-link-11 \
–slave /usr/bin/llvm-mc llvm-mc /usr/bin/llvm-mc-11 \
–slave /usr/bin/llvm-nm llvm-nm /usr/bin/llvm-nm-11 \
–slave /usr/bin/llvm-objdump llvm-objdump /usr/bin/llvm-objdump-11 \
–slave /usr/bin/llvm-ranlib llvm-ranlib /usr/bin/llvm-ranlib-11 \
–slave /usr/bin/llvm-readobj llvm-readobj /usr/bin/llvm-readobj-11 \
–slave /usr/bin/llvm-rtdyld llvm-rtdyld /usr/bin/llvm-rtdyld-11 \
–slave /usr/bin/llvm-size llvm-size /usr/bin/llvm-size-11 \
–slave /usr/bin/llvm-stress llvm-stress /usr/bin/llvm-stress-11 \
–slave /usr/bin/llvm-symbolizer llvm-symbolizer /usr/bin/llvm-symbolizer-11 \
–slave /usr/bin/llvm-tblgen llvm-tblgen /usr/bin/llvm-tblgen-11 \
–slave /usr/bin/llvm-objcopy llvm-objcopy /usr/bin/llvm-objcopy-11 \
–slave /usr/bin/llvm-strip llvm-strip /usr/bin/llvm-strip-11

update-alternatives \
–verbose \
–install /usr/bin/clang clang /usr/bin/clang-11 100 \
–slave /usr/bin/clang++ clang++ /usr/bin/clang++-11 \
–slave /usr/bin/asan_symbolize asan_symbolize /usr/bin/asan_symbolize-11 \
–slave /usr/bin/clang-cpp clang-cpp /usr/bin/clang-cpp-11 \
–slave /usr/bin/ld.lld ld.lld /usr/bin/ld.lld-11

Nachdem das alles erledigt ist, kann man ans Compilen denken: make LLVM=1 LLVM_IAS=1 CC=clang HOSTCC=clang LD=ld.lld -j5 deb-pkg – aber Vorsicht: LTO wird einiges an RAM brauchen um seine Arbeit zu verrichten. Was Ergebnis betrifft, wie die Kernels performen oder wie stabil sie sind, kann ich noch nicht sagen. Aber Tests werden das in der Zukunft zeigen…

Author:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert