Android Kernel 源码环境
2022-12-24 18:0:5 Author: 看雪学苑(查看原文) 阅读量:45 收藏


本文为看雪论坛优秀文章

看雪论坛作者ID:Ssage泓清


前言

本篇将会搭建一个完美的Linux Kernel及其内核模块的源码阅读开发环境。
当我们开始研究Android Kernel,想要优雅的阅读源码好像是一件费劲的事情。
因为Kernel源码实在是太庞大了,打开一个c文件,想要详细的研究研究,甚至上手写两句代码,即没有高亮提示,也没有代码跳转。在这种情况下,想要理清楚内核源码,相当不易。
用CLion?貌似不太行。
Kernel的构建体系是make而不是类似于LLVM的CMake。Clion直接打开Kernel源码是无法被CLion解析的。
用Source Insight?貌似不是非常完美。
对于Kernel源码来说,很多函数symbols一样,只是适用于不同架构罢了。Source Insight在跳转的时候,全源引索,并不会帮我们加以区分。诸如此类的问题,Source Insight还有很多...强迫症患者表示很难受~
用VsCode?貌似更不行?
VsCode对C/C++代码的高亮提示,依托于C/C++ Extension Pack这个插件,我不清楚别人体验如何,至少对我来说,这个插件有多烂,我都不想多做评价....


浅谈代码索引

CLion对代码索引的功能 貌似就是通过clangd实现的。
make ## 原编译命令 --> 不生成compile_commands.jsonbear make ## 使用bear --> 生成compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS True)
这里特别提一嘴,对于mk体系编译的的项目 
mk脚本,其本质上是make,但是对于安卓的来说,生成编译描述文件非常简单。
官方有文档(https://developer.android.com/ndk/guides/ndk-build#json)提供命令。
ndk-build GEN_COMPILE_COMMANDS_DB=true ## 构建的时候顺便生成compile_commands.json

敲定方案

毫无疑问 Kernel的源码大多是c文件,以及少部分的汇编文件,设备树文件......
Kernel正好是make体系,理论上是可以用Bear的。由于我做教程的时候,已经把内核编译结束了,实在不想重新编译内核,理论上选哪个都一样,我们只是要个编译描述文件罢。


开始动手

## 这里选择common-android12-5.10分支repo init -u https://android.googlesource.com/kernel/manifest -b common-android12-5.10
  repo sync
BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
cd common # 进入内核源码根目录# clone vscode-linux-kernel项目到.vscode文件夹# 该文件夹为vscode配置文件夹 类似于.ideagit clone --depth=1 https://github.com/amezin/vscode-linux-kernel.git .vscode
python .vscode/generate_compdb.py -O ../out/android12-5.10/common/ls -al | grep compile_commands.json# -rw-r--r--   1 kali kali 8888862 Nov 30 01:07 compile_commands.json

对于Out-of-tree编译的内核模块 

详细见原项目地址的Out-of-tree module development (https://github.com/amezin/vscode-linux-kernel#out-of-tree-module-development)

这一套代码解析方案也完美的适用于Out-of-tree的内核模块

{    "files.associations": {        "iostream": "cpp",        "intrinsics.h": "c",        "ostream": "cpp",        "vector": "cpp"    },    "editor.formatOnPaste": true,    "editor.formatOnSave": true,    "editor.formatOnType": true,    // 关闭 C/C++ Extension Pack 插件的提示 防止其与clangd冲突    "C_Cpp.errorSquiggles": "Disabled",    "C_Cpp.intelliSenseEngineFallback": "Disabled",    "C_Cpp.intelliSenseEngine": "Disabled",    "C_Cpp.autocomplete": "Disabled", // So you don't get autocomplete from both extensions.    // 指向clangd路径    "clangd.path": "/tmp/NDK/ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64/bin/clangd",    "clangd.arguments": [        // compelie_commands.json 文件的目录位置        "--compile-commands-dir=${workspaceFolder}/",        // 让 Clangd 生成更详细的日志        "--log=verbose",        // 输出的 JSON 文件更美观        "--pretty",        // 全局补全        "--all-scopes-completion",        // 建议风格:打包(重载函数只会给出一个建议)相反可以设置为detailed        "--completion-style=bundled",        // 跨文件重命名变量        "--cross-file-rename",        // 允许补充头文件        "--header-insertion=iwyu",        // 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分        "--header-insertion-decorators",        // 在后台自动分析文件 基于 complie_commands        "--background-index",        // 启用 Clang-Tidy 以提供「静态检查」        "--clang-tidy",        // Clang-Tidy 静态检查的参数,指出按照哪些规则进行静态检查        // 参数后部分的*表示通配符        // 在参数前加入-,如-modernize-use-trailing-return-type,将会禁用某一规则        "--clang-tidy-checks=cppcoreguidelines-*,performance-*,bugprone-*,portability-*,modernize-*,google-*",        // 默认格式化风格: 谷歌开源项目代码指南        "--fallback-style=file",        // 同时开启的任务数量        "-j=2",        // pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能)        "--pch-storage=disk",        // 启用这项时,补全函数时,将会给参数提供占位符        // 我选择禁用        "--function-arg-placeholders=false"    ],}
左边会出现.cache缓存目录,里面不断缓存着整个内核源码的index索引。
左下角有一个indexing,意味着clangd解析整个源码的进度。
当indexing解析结束后,打开内核源码的任意c文件,都可以自由的跳转头文件,跳转到函数定义和实现,智能提示函数和结构体等等。就和用IDE写代码一样,非常丝滑舒服。
所有的索引都在一秒不到内可以完成,而且也不会高额占用机器性能。
甚至他还会结合编译的config,对未开启的config代码块不高亮显示:

做一些润滑

CompileFlags:    Add: [-Wno-declaration-after-, -Wno-int-conversion, -Wno-all] Diagnostics:    ClangTidy:        Remove: bugprone-sizeof-expression

看雪ID:Ssage泓清

https://bbs.pediy.com/user-home-942658.htm

*本文由看雪论坛 Ssage泓清 原创,转载请注明来自看雪社区

# 往期推荐

1.CVE-2022-21882提权漏洞学习笔记

2.wibu证书 - 初探

3.win10 1909逆向之APIC中断和实验

4.EMET下EAF机制分析以及模拟实现

5.sql注入学习分享

6.V8 Array.prototype.concat函数出现过的issues和他们的POC们

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458489228&idx=1&sn=3d2363d934b8ba6ded71d5913103d45c&chksm=b18ea10686f9281029f9b4b16b5955ed4e2e71aef3627b0421d41ae6dc2688453e23eb6ee375#rd
如有侵权请联系:admin#unsafe.sh