实验环境
Ubuntu-22.04
Ubuntu clang version 14.0.0-1ubuntu1.1
使用方法
环境准备
这里提前说明一下,不知道具体什么原因,笔者编译内核似乎要写一个特权文件,所以每次都要用root用户;🤔,所以下面步骤中要区分用户的都会加以说明;
安装wllvm:(区分用户)
pip3 install wllvm |
设置编译器:(区分用户)
export LLVM_COMPILER=clang |
安装ld.lld: (不区分用户)
sudo apt install lld |
编译内核
make CC=clang defconfig |
生成CFG
opt -dot-callgraph vmlinux.bc |
第一个命令遇到报错:
opt: unknown pass name ‘dot-callgraph’
通过查找资料发现是llvm的版本过低:
安装llvm-15:
sudo apt install llvm-15 |
重新生成:
opt-15 -dot-callgraph vmlinux.bc |
效果不是很好:
在实验室服务器遇到报错
首先就是一堆warning找不到报错(懒得爬楼),最后gg:
这个大概率是因为clang的路径是笔者编译llvm的路径(可能没编译完?):
只要把环境变量改一下就好了:
然后生成bc的时候遇到如下报错:
通过如下方法可以使得wllvm选用一个合适的低版本clang:
mkdir -p $HOME/llvm13/bin |
export LLVM_COMPILER=clang |
最终可以成功生成vmlinux.bc:
分模块生成bc
首先config里得有netfilter哈😓
CONFIG_NETFILTER=y |
然后编译完整内核吧:
make CC=wllvm LLVM=1 -j144 |
然后在net/netfilter/目录下就会生成很多.o文件:
然后用extract-bc生成bc文件:
extract-bc net/netfilter/nf_tables_api.o |
尝试生成CFG:
opt-15 -dot-callgraph net/netfilter/nf_tables_api.o.bc |
dot -Tsvg /home/qym/qym/source/linux-8bb7eca972ad531c9b149c0a51ab43a417385813/net/netfilter/nf_tables_api.o.bc.callgraph.dot -O |
有点小酷: