环境
经测试在以下环境上编译成功或编译失败:
- Ubuntu 2004 LTS(非虚拟机,真实系统),Ubuntu 2204 LTS(VMware虚拟机)环境上编译成功;
- Ubuntu 2004 LTS(Hyper-V系统),Ubuntu 2204 LTS(Hyper-V系统)环境上编译失败。
注意:
若编译环境是VMware虚拟机,则最好把源码包拷贝到Linux虚拟机的磁盘上(例如拷贝的/home
目录下)编译,而不是直接挂载Win10的磁盘,然后在挂载盘上编译。一是因为在挂载盘上编译慢,二是因为在挂载盘上解压后可能会导致有些文件的权限是???
,导致编译过程中无法访问文件,进而导致编译失败。
步骤
参考资料:
这里以“linux-5.10.83”源码为例,且以下操作都在**root**
用户下进行。
1、Ubuntu安装编译环境
apt install libncurses5-dev openssl libssl-dev build-essential openssl pkg-config libc6-dev bison flex libelf-dev zlibc minizip libidn11-dev libidn11 dwarves
2、下载“linux-5.10.83”源码并解压
3、净化源码
make mrproper
4、配置要进行编译的内核
cp /boot/config-`uname -r` ./.config
make menuconfig
依次点击“Load > (.config)OK > SAVE > (.config)OK > EXIT > EXIT”。
5、修改上一步生成的配置文件
vim .config
只修改其中的几个字段,修改后这几个字段的状态如下:
- CONFIG_MODULE_SIG_KEY=""
- CONFIG_SYSTEM_TRUSTED_KEYS=""
- CONFIG_SYSTEM_BLACKLIST_HASH_LIST=""(这个字段本来就是空的,若不是空的,则置为空)
- CONFIG_SYSTEM_REVOCATION_KEYS=""
即,把这几个字段都变成空的。这几个字段位置相近。
6、编译内核
make bzImage -j16 # -j16代表用16个线程同时编译,编译速度更快,线程数量根据处理器实际情况配置
编译完也不显示什么,直接就完了,编译完成后显示的状态:
7、编译模块
make modules -j16
编译完也不显示什么,直接就完了,编译完成后显示的状态:
8、生成compile_commands.json
./scripts/clang-tools/gen_compile_commands.py
9、参考如下文章用VSCode阅读Linux源码:《VSCode + WSL + clangd +CMake + CMake Tools搭建C++开发环境》
若源码是在服务器上编译的,可以把compile_commands.json
下载到本地的linux-5.10.83
源码目录中,然后把compile_commands.json
里边的路径替换成本地真实路径,一样可以用clangd解析。
因为compile_commands.json
是在服务上编译的,里边涉及到路径的字段肯定是服务器上的路径,下载后替换成本地路径即可。
compile_commands.json
是编译过程中生成的,记录了代码编译的详细过程,因此clangd解析这个文件就可以分析出代码之间的关系了。clangd分析只依赖compile_commands.json
文件,不依赖编译过程中的中间产物。
10、这里提供如下附件:
- linux-5.10.83.tar.gz:linux-5.10.83源码包
- linux-5.10.83-compiled.tar.gz:编译后的代码
- compile_commands.json.tar.gz:编译后生成的compile_commands.json