使用gdb从vmlinux二进制查看r8169_main.c设备驱动代码的方法
Linux内核驱动相关GDB操作与vmlinux文件定位方法
一、GDB查看r8169_main.c源码的操作命令
前提:内核编译时已开启CONFIG_DEBUG_INFO=y配置,vmlinux中包含完整调试符号且源码路径未变更。
- 启动GDB加载未压缩内核镜像:
gdb ./vmlinux - 查看完整r8169_main.c源码:执行
list r8169_main.c:1,后续可连续输入list或按回车滚动查看剩余内容 - 定位__init相关代码:r8169驱动的入口初始化函数为
rtl8169_init,执行list rtl8169_init即可直接查看对应代码段;也可通过list r8169_main.c:<行号>指定查看对应行附近的代码 - 定位probe中断例程代码:r8169的probe函数为
rtl8169_probe,执行list rtl8169_probe即可查看对应实现 - 若不清楚具体函数名,可先执行
info functions rtl8169*过滤所有r8169相关的函数符号,再按需查看对应源码
二、从vmlinux二进制定位特定设备驱动C文件名的方法
已知驱动对应符号/函数名的场景
- GDB内查询:加载vmlinux后执行
info source <符号名>,例如info source rtl8169_probe,输出结果中会直接显示对应C文件的完整路径与名称 - 无需启动GDB的离线查询:使用readelf工具解析调试信息,执行
readelf -w vmlinux | grep -B2 -A2 "rtl8169_probe",输出中的DW_AT_name字段即为对应的源文件名
仅知道驱动类型、不清楚具体符号的场景
- 先过滤相关驱动符号:执行
readelf -s vmlinux | grep -i r8169,筛选出所有r8169驱动相关的符号 - 再通过上述符号查询方法,获取对应C文件名
- 若内核开启完整DWARF调试信息,也可直接执行
objdump --dwarf=info vmlinux | grep -E "(DW_AT_name|DW_AT_comp_dir)" | grep -B1 -A1 r8169,直接筛选出对应驱动的源文件信息
注意:以上所有操作均依赖内核编译时开启的调试符号配置,无调试符号的 stripped 版本vmlinux无法完成源码关联与文件名查询。
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

