Linux kernel module symbols relocation

本文探讨了Linux内核模块如何处理对内核函数及其他模块函数的调用。通过readelf命令分析了.ko文件,指出在加载模块时,kernel的load_module函数及其相关子函数如simplify_symbols、apply_relocations等处理了符号重定位,确保模块能正确调用所需函数。在地址替换完成后,新加载的模块如同内置模块一样工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

尝试回答两个问题:

1. Module如何解决kernel的函数调用问题

2. Module如何解决使用到其它module的函数调用问题


*.ko是个ELF文件,本质上与跑在user space的APP一样. 从Module编译结果看起:

执行指令: readelf -a usb_wwan.ko,摘录部分与本主题有关系:

00002104  0001801c R_ARM_CALL        00000000   printk
0000210c  00018b1c R_ARM_CALL        00001014   usb_serial_get_by_inde

 与printk不一样, usb_serial_get_by_inde来自于usbserial.ko,但是二者在usb_wwan.ko并无值得关注的差别,也就是说此刻,usb_wwan.ko并没区分它所调用的函数来自于何方


那加载usb_wwan.ko的时候,kernel做了些什么事情呢?

load_module干的活太多,我们还是只关注relocation相关细节, simplify_symbols()完成了symbols的处理,看具体细节

load_module() --> simplify_symbols()

case SHN_UNDEF:
			ksym = resolve_symbol_wait(mod, info, name);
SHN_UNDEF处理了kernel及其他模块的符号,go on...

simplify_symbols() -

### 如何使用 `crash` 工具加载内核模块符号 为了通过 `crash` 工具加载内核模块符号,可以按照以下方法操作: #### 使用 `mod` 命令加载模块符号 在 `crash` 工具中,可以通过 `mod` 命令来手动加载指定的调试信息文件。以下是具体命令格式及其解释: ```bash crash> mod -s <module_name> <path_to_debug_info> ``` 其中 `<module_name>` 是目标内核模块的名字,而 `<path_to_debug_info>` 则是指向该模块对应的 `.ko.debug` 文件路径。 例如,在实际应用中可能如下所示[^2]: ```bash crash> mod -s igb /usr/lib/debug/lib/modules/2.6.18-164.el5/kernel/drivers/net/igb/igb.ko.debug ``` 对于其他模块同样适用此方式。比如加载 `virtio_blk` 模块时可执行下面这条语句[^3]: ```bash crash> mod -s virtio_blk /cores/retrace/repos/kernel/x86_64/usr/lib/debug/lib/modules/3.10.0-693.2.2.el7.x86_64/kernel/drivers/block/virtio_blk.ko.debug ``` #### 设置 CRASH_MODULE_PATH 环境变量 当存在大量不同版本或类型的模块需要分析时,可通过设置环境变量 `CRASH_MODULE_PATH` 来简化流程。一旦设置了这个变量,则 `/lib/modules/` 默认目录会被替代成为新的搜索位置用于查找模块对象文件[^4]。 假设已经定义好了一个包含所需所有 .ko 调试文件的位置(如 `/custom/path/to/modules`),那么只需提前导出该变量即可让后续所有的 crash session 自动利用这些资源: ```bash export CRASH_MODULE_PATH=/custom/path/to/modules ``` 之后启动任何基于 arm64 架构或者其他架构支持上述特性的 crash sessions 时候都会自动采用新设定好的路径去寻找匹配的模块数据源而不必每次都单独指定了。 --- ### 总结 综上所述,无论是直接运用 `mod -s` 手工导入单个特定模块还是借助配置全局可用的 `CRASH_MODULE_PATH` 变量批量处理多模块场景下都可以有效完成任务需求即成功加载对应kernel module symbols供进一步诊断研究之用。 ```python # 示例 Python脚本模拟部分逻辑 (仅作演示用途) import os def set_crash_module_path(path): """Set the environment variable for crash tool.""" os.environ['CRASH_MODULE_PATH'] = path set_crash_module_path("/custom/path/to/modules") print(f"Environment Variable Set: {os.getenv('CRASH_MODULE_PATH')}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值