内核模块的依赖是装载时的大问题。大部分时候可以通过 Modules.deps 或者 Modules.order 进行依赖模块的自动加载。但是有时候可能没有这些依赖配置(例如树外编译),以及其加载过程不透明(不知道到底是哪个符号依赖于哪个模块)。
modtree
对树外编译模块依赖写了一个简单的脚本,仓库地址:
https://github.com/Eknight-Eutopia/mod_tree
效果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| msm-kgsl ├── socinfo │ └── smem ├── llcc-qcom │ └── socinfo │ └── smem ├── qcom-dcvs │ └── dcvs-fp │ ├── qcom-rpmh │ │ ├── qcom-ipc-logging │ │ │ └── minidump │ │ │ ├── debug-symbol │ │ │ └── smem │ │ └── cmd-db │ └── cmd-db ├── governor-msm-adreno-tz │ └── qcom-scm ├── qcom-scm ├── cmd-db ├── msm-performance │ ├── qcom-pmu-lib │ │ ├── qcom-scmi-client │ │ └── qcom-llcc-pmu │ └── sched-walt │ └── socinfo │ └── smem ├── qcom-aoss │ └── qcom-ipc-logging │ └── minidump │ ├── debug-symbol │ └── smem ├── mem-buf-dev │ └── secure-buffer │ └── qcom-scm ├── qcom-iommu-util │ └── qcom-scm ├── clk-qcom │ ├── gdsc-regulator │ │ ├── proxy-consumer │ │ └── debug-regulator │ └── icc-clk ├── secure-buffer │ └── qcom-scm ├── mdt-loader │ └── qcom-scm ├── minidump │ ├── debug-symbol │ └── smem ├── qcom-va-minidump │ └── minidump │ ├── debug-symbol │ └── smem └── coresight
|
modgraph
基于neo4j来构造一个简单的模块依赖图,其中以目标模块为根节点,其存在自己的符号以及外部依赖的符号。外部符号有一部分是内核导出,另一部分则是由依赖的模块导出。
基于目标模块获取其依赖树,将每一个模块都作为一个节点,获取其导出符号以及未定义符号,符号也定义为节点。构造以下关系:
- 模块依赖于其他模块则会指向其他模块,关系为Depends_on;
- 模块指向自身模块导出符号,关系为Exports;
- 模块指向未定义符号,关系为Uses;
- 模块指向其他模块的导出符号,关系为Resolved_to;
从而构建一个 内核模块的具体符号依赖图,实现仓库为:modgraph
实现效果图为: