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できるサイト
-
git.kernel.org
-
GitHub
-
googlesource
-
LXR (1994-)
-
タグジャンプ可能
-
http://lxr.linux.no (現在は見れない)
-
http://tomoyo.osdn.jp/cgi-bin/lxr/source/fs/exec.c#L1879?v=linux-5.2
-
-
elixir (2017-)
-
inspired by LXR
-
https://elixir.bootlin.com/linux/v5.2/source/fs/exec.c#L1879
-
-
woboq (2012-)
-
compilation databaseを使った正確なジャンプ
(demo)
http://bit.ly/2Y5cIzn
woboq codebrowserがなんでこんなに正確か
-
clang + compilation database の力を借りている

http://bit.ly/2Y5cIzn
他のOSでもwoboq codebrowser見たい…
-
つくりました!
-
NetBSD: https://netbsd-woboq.github.io/netbsd/netbsd/
-
2019/07/20 12:20 現在、まだindex.html見れず…
-
https://netbsd-woboq.github.io/netbsd/sys/kern/kern_exec.c.html
とか直接指定すると見れる
-
-
FreeBSD: まにあいませんでした
-
OpenBSD: まにあいませんでした
-
DragonFlyBSD: まにあいませんでした
-
Minix: まにあいませんでした
-
Illumos: まにあいませんでした
-
Plan 9: まにあいませんでした
-
絶賛ビルド中
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