wllvm使用笔记


实验环境

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

make menuconfig -> General setup -> 取消勾选"compile the kernel with warning as errors" -> 保存并退出

make CC=wllvm LLVM=1 -j4

extract-bc vmlinux

生成CFG

opt -dot-callgraph vmlinux.bc
dot -Tsvg vmlinux.bc.callgraph.dot -O

第一个命令遇到报错:

opt: unknown pass name ‘dot-callgraph’

通过查找资料发现是llvm的版本过低:

安装llvm-15:

sudo apt install llvm-15

重新生成:

opt-15 -dot-callgraph vmlinux.bc
dot -Tsvg vmlinux.bc.callgraph.dot -O

效果不是很好:

在实验室服务器遇到报错

首先就是一堆warning找不到报错(懒得爬楼),最后gg:

这个大概率是因为clang的路径是笔者编译llvm的路径(可能没编译完?):

只要把环境变量改一下就好了:

然后生成bc的时候遇到如下报错:

通过如下方法可以使得wllvm选用一个合适的低版本clang:

mkdir -p $HOME/llvm13/bin

ln -sf /usr/bin/clang-13 $HOME/llvm13/bin/clang
ln -sf /usr/bin/clang++-13 $HOME/llvm13/bin/clang++
ln -sf /usr/bin/llvm-link-13 $HOME/llvm13/bin/llvm-link
ln -sf /usr/bin/opt-13 $HOME/llvm13/bin/opt
ln -sf /usr/bin/llvm-ar-13 $HOME/llvm13/bin/llvm-ar
ln -sf /usr/bin/llvm-nm-13 $HOME/llvm13/bin/llvm-nm
export LLVM_COMPILER=clang
export PATH=$HOME/llvm13/bin:$PATH

最终可以成功生成vmlinux.bc:

分模块生成bc

首先config里得有netfilter哈😓

CONFIG_NETFILTER=y
CONFIG_NF_TABLES=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

有点小酷:

参考

https://blog.csdn.net/ckugua/article/details/129502143?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-9-129502143-blog-143534151.235^v43^pc_blog_bottom_relevance_base9&spm=1001.2101.3001.4242.6&utm_relevant_index=12

https://github.com/llvm/llvm-project/issues/54323


文章作者: q1ming
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 q1ming !
  目录