{"id":1867,"date":"2021-09-24T00:02:31","date_gmt":"2021-09-23T22:02:31","guid":{"rendered":"https:\/\/my.stargazer.at\/?p=1867"},"modified":"2021-09-24T00:02:31","modified_gmt":"2021-09-23T22:02:31","slug":"building-the-kernel-with-clang-messing-around","status":"publish","type":"post","link":"https:\/\/my.stargazer.at\/de\/2021\/09\/24\/building-the-kernel-with-clang-messing-around\/","title":{"rendered":"Kernel mit clang bauen: Erste Gehversuche"},"content":{"rendered":"<p>Der Linux Kernel ist schon ein sch\u00f6nes St\u00fcck Programmierkunst, mit dessen Bau ich mich eigentlich recht wohl f\u00fchle. So sicher, dass ich inzwischen meine eigenen Debian Pakete schn\u00fcre. H\u00f6chste Zeit also, ein bisschen was Umzubauen um die Sache interessanter zu gestalten. Wie w\u00e4re es mit clang und LTO? Das einzige Problem dabei ist gute Doku &#8211; also selbst schreiben.<\/p>\n<p>Um den Kernel \u00fcberhaupt mit LTO zu bauen, sollte die Config mit folgenden Optionen versehen sein:<\/p>\n<p># CONFIG_STACKPROTECTOR is not set<br \/>\nCONFIG_LTO=y<br \/>\nCONFIG_LTO_CLANG=y<br \/>\nCONFIG_ARCH_SUPPORTS_LTO_CLANG=y<br \/>\nCONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y<br \/>\nCONFIG_HAS_LTO_CLANG=y<br \/>\n# CONFIG_LTO_NONE is not set<br \/>\nCONFIG_LTO_CLANG_FULL=y<br \/>\n# CONFIG_LTO_CLANG_THIN is not set<\/p>\n<p>Compiling w\u00e4re 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\u00fcr update-alternatives:<\/p>\n<p>update-alternatives \\<br \/>\n        &#8211;verbose \\<br \/>\n        &#8211;install \/usr\/bin\/llvm-config       llvm-config      \/usr\/bin\/llvm-config-11 100 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-ar           llvm-ar          \/usr\/bin\/llvm-ar-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-as           llvm-as          \/usr\/bin\/llvm-as-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-bcanalyzer   llvm-bcanalyzer  \/usr\/bin\/llvm-bcanalyzer-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-cov          llvm-cov         \/usr\/bin\/llvm-cov-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-diff         llvm-diff        \/usr\/bin\/llvm-diff-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-dis          llvm-dis         \/usr\/bin\/llvm-dis-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-dwarfdump    llvm-dwarfdump   \/usr\/bin\/llvm-dwarfdump-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-extract      llvm-extract     \/usr\/bin\/llvm-extract-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-link         llvm-link        \/usr\/bin\/llvm-link-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-mc           llvm-mc          \/usr\/bin\/llvm-mc-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-nm           llvm-nm          \/usr\/bin\/llvm-nm-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-objdump      llvm-objdump     \/usr\/bin\/llvm-objdump-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-ranlib       llvm-ranlib      \/usr\/bin\/llvm-ranlib-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-readobj      llvm-readobj     \/usr\/bin\/llvm-readobj-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-rtdyld       llvm-rtdyld      \/usr\/bin\/llvm-rtdyld-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-size         llvm-size        \/usr\/bin\/llvm-size-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-stress       llvm-stress      \/usr\/bin\/llvm-stress-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-symbolizer   llvm-symbolizer  \/usr\/bin\/llvm-symbolizer-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-tblgen       llvm-tblgen      \/usr\/bin\/llvm-tblgen-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-objcopy      llvm-objcopy     \/usr\/bin\/llvm-objcopy-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/llvm-strip        llvm-strip       \/usr\/bin\/llvm-strip-11<\/p>\n<p>update-alternatives \\<br \/>\n        &#8211;verbose \\<br \/>\n        &#8211;install \/usr\/bin\/clang                 clang                 \/usr\/bin\/clang-11 100 \\<br \/>\n        &#8211;slave   \/usr\/bin\/clang++               clang++               \/usr\/bin\/clang++-11  \\<br \/>\n        &#8211;slave   \/usr\/bin\/asan_symbolize        asan_symbolize        \/usr\/bin\/asan_symbolize-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/clang-cpp             clang-cpp             \/usr\/bin\/clang-cpp-11 \\<br \/>\n        &#8211;slave   \/usr\/bin\/ld.lld                ld.lld                \/usr\/bin\/ld.lld-11<\/p>\n<p>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 &#8211; 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&#8230;<\/p>","protected":false},"excerpt":{"rendered":"<p>Der Linux Kernel ist schon ein sch\u00f6nes St\u00fcck Programmierkunst, mit dessen Bau ich mich eigentlich recht wohl f\u00fchle. So sicher, dass ich inzwischen meine eigenen Debian Pakete schn\u00fcre. H\u00f6chste Zeit also, ein bisschen was Umzubauen um die Sache interessanter zu gestalten. Wie w\u00e4re es mit clang und LTO? Das einzige Problem dabei ist gute Doku &#8211; also selbst [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":1868,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[800,577,401,801],"class_list":["post-1867","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it-related-stuff","tag-clang","tag-debian","tag-kernel","tag-llvm"],"_links":{"self":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/posts\/1867","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/comments?post=1867"}],"version-history":[{"count":0,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/posts\/1867\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/media\/1868"}],"wp:attachment":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/media?parent=1867"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/categories?post=1867"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/tags?post=1867"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}