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"
},
http://bit.ly/2Y5cIzn
http://bit.ly/2Y5cIzn
https://elixir.bootlin.com/linux/v5.2/source/fs/exec.c
http://bit.ly/2Y5cIzn
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
clang + compilation database の力を借りている
http://bit.ly/2Y5cIzn
つくりました!
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でためす
まともにコードジャンプできないことが多々ある
同じシンボルが大量にあって一意に特定できない
#ifdefは理解できない
大量のHACK
マクロ芸
http://bit.ly/2Y5cIzn
(demo)
個人的には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