Compilation Database

によるカーネル開発支援

compile_commands.json

[
    {
        "arguments": [
            "/___NETBSD_SRC___/objdir.amd64/tooldir.Linux-x86_64/bin/x86_64--netbsd-gcc",
            "-c",
            "-O2",
            "-fno-omit-frame-pointer",
            "-fstack-protector",
            "-std=gnu99",
            "-Werror",
            "-Wall",
            "-Wno-main",
            "-Wno-format-zero-length",
            "-Wextra",
            "--sysroot=/___NETBSD_SRC___/objdir.amd64/destdir.amd64",
            "-Damd64",
            "-Dx86_64",
            "-I.",
            "-I/___NETBSD_SRC___/sys/../common/include",
            "-I/___NETBSD_SRC___/sys/arch",
            "-I/___NETBSD_SRC___/sys",
            "-nostdinc",
            "-DDIAGNOSTIC",
            "-D_KERNEL",
            "-D_KERNEL_OPT",
            "-o",
            "kern_exec.o",
            "../../../../../../sys/kern/kern_exec.c"
        ],
        "directory": "/___NETBSD_SRC___/objdir.amd64/sys/arch/amd64/compile/GENERIC",
        "file": "../../../../../../sys/kern/kern_exec.c"
    },

Wataru Ashihara

(wataash)

http://bit.ly/2Y5cIzn
http://bit.ly/2Y5cIzn

が、linux kernelのソース手元にねぇ〜

という事が多々

  • git cloneするのはしんどすぎる
  • って感じでwebで読むことありますよね
    • その後やっぱりwebブラウザだけだとしんどくなってgit cloneするまでがお約束
https://elixir.bootlin.com/linux/v5.2/source/fs/exec.c​
http://bit.ly/2Y5cIzn

linux kernelをbrowsingできるサイト

(demo)

http://bit.ly/2Y5cIzn

woboq codebrowserがなんでこんなに正確か

  • clang + compilation database の力を借りている

http://bit.ly/2Y5cIzn

他のOSでもwoboq codebrowser見たい…

http://bit.ly/2Y5cIzn

テキストエディタでも使える

  • というかweb browsingよりもこっちがメイン

  • clangdが必要

    • https://clang.llvm.org/extra/clangd/Installation.html

    • BSDの人はpkgsrcなのでめっちゃ時間かかります… :P

    • clangdがLanguage Server Protocolを喋る

http://bit.ly/2Y5cIzn
git clone https://github.com/mit-pdos/xv6-public.git
cd xv6-public/
# compile_commands.json は作っておきました
wget https://wataash.github.io/xv6-woboq/compile_commands.json
# compiledbに対応したてきとうなエディタで開く

xv6でためす

kernel source readingでのctagsのつらさ

  • まともにコードジャンプできないことが多々ある

    • 同じシンボルが大量にあって一意に特定できない

    • #ifdefは理解できない

    • 大量のHACK

    • マクロ芸

http://bit.ly/2Y5cIzn

(demo)

compiledbめっちゃ便利!!が…

  • 個人的にはOSのコード読むときは
    cscopes・ctagsで我慢することが多い

    • 小さいプログラムなら気軽にビルドして
      compile_commands.jsonを作成できるが、
      OSのビルドはやってられない

      • ビルド時間が長すぎる、コケる

        • これはOSじゃなくても
          大規模プログラム一般に言える

      • そのカーネルをビルドするにはそのカーネルが必要…

        • ビルドの環境構築からやらないといけない

        • (minixとかNetBSDはクロスコンパイルできて幸せ)

    • ということで、compile_commands.jsonを作成するCIを作ってます

      • 各種OSにコミットがあると、自動でpull & build、compile_commands.jsonを作成、githubにpush

        • 今月、来月中くらいには公開したい…

http://bit.ly/2Y5cIzn

まとめ

  • kernelソースは巨大・複雑で静的解析が大変

    • 正確な解析を行うにはコンパイル時情報が必要;その手段の一つがLLVM compilation database

  • 各種OSをwoboq-codebrowserで見れるよう試行中

    • とりあえずxr6とNetBSDだけできた

  • kernelののcompilation databaseを作るのは大変

    • 各種OSの最新コミットのcompilation databaseを作成して公開するものを作成中

http://bit.ly/2Y5cIzn

Compilation Database によるカーネル開発支援

By wataash

Compilation Database によるカーネル開発支援

第15回 カーネル/VM探検隊@東京 発表資料 https://kernelvm15.peatix.com/view LLVM JSON Compilation Database Format Specification (compiledb, compile_commands.json) をkernel開発で使うはなし https://clang.llvm.org/docs/JSONCompilationDatabase.html https://slides.com/wataash/kernel-compiledb http://bit.ly/2Y5cIzn

  • 1,333