Linux内核文件系统AST生成失败求助:编译正常却语法错误频发
问题:无法为Linux内核文件系统生成AST
尝试多日为Linux内核文件系统生成Abstract Syntax Tree(AST)但始终失败。可以正常用make编译内核,但生成AST时会遭遇数百个语法类错误与警告,包括宏重定义、缺失typedef、双下划线问题、缺少分号等。
已尝试方案
- 从Linux官方仓库克隆源码,以及直接下载官方发布的源码包;
- 尝试使用
clang、gcc、astgen、pyparser、joern-frontend、sparse等工具,其中clang最具潜力; - 对原始代码及编译后的代码执行
clang -Xclang -ast-dump -fsyntax-only linux/fs/fuse/xattr.c,均出现相同错误; - 在Mac及运行Ubuntu 16.0.4的Linux虚拟机上进行尝试;
- 尝试树莓派版本的Linux内核源码;
- 单独或组合引入本地内核
include目录、系统linux-headers-$(uname -r)/include目录、linux-headers-$(uname -r)-generic目录的头文件。
可复现步骤
- 打开存储空间大于100GB的Ubuntu Linux虚拟机;
- 执行
su切换至root用户; - 执行
sudo apt-get install vim lld clang; - 安装一系列LLVM/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 libclang1 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版本); - 下载最新稳定版内核源码(使用的是6.8.3)并解压;
- 在内核目录中执行
make allnoconfig && make -j16 LLVM=1(曾尝试make menuconfig,但编译耗时超一天,故终止)。
上述步骤可成功编译内核,未执行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 ... <更多arch/x86、generated/uapi等目录> ... -Xclang -ast-dump fs/fuse/xattr.c时,仍出现数百个类型与语法错误。
查阅了大量技术帖子及clang文档,均未解决问题。曾参考过相关旧帖子,但无法在自己的机器上复现。尝试在文件顶部引入kconfig.h,也无效果。目前陷入困境,希望能得到相关建议,若有遗漏步骤或操作失误,也请指出。
内容的提问来源于stack exchange,提问作者v0rtex20k
相关产品推荐
相关产品推荐

