问题陈述
几天来,我一直在尝试为 Linux 内核文件系统的一部分生成抽象语法树(AST),但无法让它工作。我能够
make
内核,但是当我尝试生成AST时,我受到数百个错误和警告的困扰,抱怨重新定义的宏、缺少typedef
、双下划线、缺少分号等。所有语法东西。
我尝试过的
clang
、gcc
、astgen
、pyparser
、joern-frontend
、sparse
- 最有希望的是 clang
。clang -Xclang -ast-dump -fsyntax-only linux/fs/fuse/xattr.c
(例如)以及配置和运行make
之后,同样的错误。rpi
版本上尝试过这个(https://github.com/raspberrypi)。linux/include
目录、linux-headers-$(uname -r)/include
目录和 linux-headers-$(uname -r)-generic
目录中。以下是一些可重复的步骤来展示我的意思:
su
以 root
sudo apt-get install vim lld clang
sudo apt-get install vim libncurses-dev flex bison clang-12 lld-12 lldb-12 libssl-dev libelf-dev clang-format clang-tidy clang-tools clangd libc++-dev libc++1 libc++abi-dev libc++abi1 libclang-dev clibclang1 liblldb-dev libllvm-ocaml-dev libomp-dev libomp5 lld lldb llvm-dev llvm-runtime llvm python3-clang
apt remove clang lld
,然后运行ln -s /usr/bin/clang-12 /usr/bin/clang
和ln -s /usr/bin/lld-12 /usr/bin/ld.lld
(我收到一些关于clang-10已过时的错误,所以我链接了-12
)https://www.kernel.org
下载最新的稳定内核源代码并解压(对我来说,是6.8.3)make allnoconfig && make -j16 LLVM=1
inside(我尝试过make menuconfig
,但是安装花了一天时间,所以我停止了)。这个
make
没有错误。我没有运行 make install
,因为我实际上不想启动内核。
如果我尝试运行
clang -I <my-path>/linux/include -I <my-path>/linux/include/uapi -I /usr/src/linux-headers-$(uname -r)/include -I /usr/src/linux-headers-$(uname -r)-generic/include ... < a lot more includes w/ arch/x86, generated/uapi, etc > ... -Xclang -ast-dump fs/fuse/xattr.c
,我会收到数百个打字和语法错误。
我读过大量的 SO 帖子和
clang
文档,但没有一个起作用。我看到了 Clang 和 Linux kernel,OP 似乎解决了这个问题,但我无法在我的机器上复制它(它有点过时)。我还尝试在文件顶部包含 kconfig.h
,没有骰子。我感觉很卡住。
任何人都可以就我所缺少的内容向我提供任何指示(双关语)吗?不知道还能尝试什么。另外,这超出了我的专业领域 - 如果我错过了一个步骤或做了一些愚蠢的事情,请告诉我。
对于未来的人:
答案是我忘记了那封信
K
!我最终做的是:
make allnoconfig
(您可以从make help
中选择最适合您的配置)。运行
make KCFLAGS="-fdump-tree-all-graph"
。这将创建 .dot
文件,稍后可以在 GraphViz 等外部工具中查看。 不要忘记 K!您可以在 https://gcc.gnu.org/onlinedocs/gcc/Developer-Options.html.为了确保正确保存
.dot
文件(每个原始文件可能有数百个.dot
文件,处于不同的编译级别),您可以尝试通过运行dot -Tpdf <dot_file_name>.dot -o <output_file_name>.pdf
将它们转换为pdf。然后您可以打开 PDF 并查看结果 - 您还可以将其转换为 PNG、JSON 等。有关更多选项,请参阅 https://graphviz.org/docs/outputs/。没有一个 .dot
文件比其他文件“更好”使用,但您可以选择编号较小的文件(在编译过程的早期)、最小的文件、最大的文件等。