为 Linux 内核的一部分生成 AST

问题描述 投票:0回答:1

问题陈述

几天来,我一直在尝试为 Linux 内核文件系统的一部分生成抽象语法树(AST),但无法让它工作。我能够

make
内核,但是当我尝试生成AST时,我受到数百个错误和警告的困扰,抱怨重新定义的宏、缺少
typedef
、双下划线、缺少分号等。所有语法东西。

我尝试过的

  • 我尝试在 https://github.com/torvalds/linux 克隆 linux 存储库,并直接从 https://www.kernel.org/下载源代码。
  • 我尝试过使用
    clang
    gcc
    astgen
    pyparser
    joern-frontend
    sparse
    - 最有希望的是
    clang
  • 我尝试在原始代码上运行
    clang -Xclang -ast-dump -fsyntax-only linux/fs/fuse/xattr.c
    (例如)以及配置和运行
    make
    之后,同样的错误。
  • 我已经在我的 Mac 以及运行 Ubuntu 16.0.4 的 Linux VM 上尝试过此操作。
  • 我已经在 Linux 的
    rpi
    版本上尝试过这个(https://github.com/raspberrypi)。
  • 我尝试过分别或一起将标头包含到本地
    linux/include
    目录、
    linux-headers-$(uname -r)/include
    目录和
    linux-headers-$(uname -r)-generic
    目录中。

以下是一些可重复的步骤来展示我的意思:

  • 打开我的运行 Ubuntu 且存储空间大于 100GB 的 Linux 虚拟机
  • 运行
    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)
  • 在linux目录下运行
    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
,没有骰子。我感觉很卡住。

任何人都可以就我所缺少的内容向我提供任何指示(双关语)吗?不知道还能尝试什么。另外,这超出了我的专业领域 - 如果我错过了一个步骤或做了一些愚蠢的事情,请告诉我。

c linux linux-kernel clang abstract-syntax-tree
1个回答
0
投票

对于未来的人:

答案是我忘记了那封信

K
!我最终做的是:

  1. 从头开始下载 Linux 源代码。
  2. 运行
    make allnoconfig
    (您可以从
    make help
    中选择最适合您的配置)。
  3. 在 TLD
     运行 
    make KCFLAGS="-fdump-tree-all-graph" 。这将创建
    .dot
    文件,稍后可以在 GraphViz 等外部工具中查看。 不要忘记 K!您可以在 https://gcc.gnu.org/onlinedocs/gcc/Developer-Options.html.
  4. 查看其他标志选项

为了确保正确保存

.dot
文件(每个原始文件可能有数百个
.dot
文件,处于不同的编译级别),您可以尝试通过运行
dot -Tpdf <dot_file_name>.dot -o <output_file_name>.pdf
将它们转换为pdf。然后您可以打开 PDF 并查看结果 - 您还可以将其转换为 PNG、JSON 等。有关更多选项,请参阅 https://graphviz.org/docs/outputs/。没有一个
.dot
文件比其他文件“更好”使用,但您可以选择编号较小的文件(在编译过程的早期)、最小的文件、最大的文件等。

© www.soinside.com 2019 - 2024. All rights reserved.