gnu工具
非常专业的问题,确实,仅靠 GNU 工具链(如 strings、nm、objdump、readelf)无法覆盖 .ko 文件所有层面的信息。如果你要深入查看一个 .ko 模块的“完整详细信息”,尤其是用于内核调试、逆向、运行时分析等场景,以下是全面的工具链和层级分析视角:
🧠 一份系统性方案:查看 .ko 模块全信息(从静态到动态)
| 级别 | 工具集 | 能力说明 | 示例命令或说明 |
|---|---|---|---|
| 🔹基本信息 | file, modinfo |
类型、vermagic、依赖模块、作者等 | modinfo foo.ko |
| 🔹字符串 | strings, grep |
查看源码中硬编码字符串、日志等 | strings foo.ko | grep -i debug |
| 🔹符号表 | nm, readelf, objdump |
导出符号、全局变量、函数地址 | nm foo.ko, readelf -s foo.ko |
| 🔹反汇编 | objdump, llvm-objdump |
汇编级分析 .text、.init 等段 |
objdump -D foo.ko |
| 🔹调试信息 | dwarfdump, eu-readelf, pahole |
若含 DWARF,查看结构体、行号映射 | dwarfdump foo.ko、pahole foo.ko |
| 🔹结构体字段 | pahole |
显示模块中结构体的完整字段 | pahole -C my_struct foo.ko |
| 🔹动态行为 | dmesg, insmod, kmod, /proc/modules |
查看加载后行为、初始化失败等 | dmesg, lsmod, cat /proc/modules |
| 🔹调试接口 | gdb, kprobe, ftrace, perf, bpftrace |
实时监控模块内部函数、变量变化 | perf probe, bpftrace -e 'kprobe:function { trace(...) }' |
| 🔹运行符号表 | /proc/kallsyms, /sys/module/ |
加载后可查看运行时符号、状态 | cat /proc/kallsyms | grep myfunc |
| 🔹模块参数 | /sys/module/<mod>/parameters/ |
查看模块参数、状态 | cat /sys/module/foo/parameters/* |
| 🔹依赖关系 | modinfo, depmod, lsmod |
查看依赖模块及加载顺序 | modinfo foo.ko, lsmod |
| 🔹ELF 详细分析 | elfutils(eu-*)工具集 |
高级 ELF 结构分析 | eu-readelf, eu-objdump |
| 🔹逆向分析 | Ghidra, IDA Pro, Binary Ninja |
图形化反汇编与控制流分析 | Ghidra 打开 .ko 分析结构体与函数调用 |
| 🔹内核源码关联 | CONFIG_DEBUG_INFO, make modules |
编译 .ko 时开启调试符号 |
CONFIG_DEBUG_INFO=y |
🧩 样例:查看结构体、字段、行号
如果你的 .ko 模块是调试编译带 DWARF 的,你可以这样查看结构体字段:
pahole foo.ko | grep my_struct
或者查看某函数的调试位置(行号、变量):
dwarfdump foo.ko | grep -A10 "DW_TAG_subprogram"
🛠 推荐工具安装指令(Debian/Ubuntu)
sudo apt install binutils elfutils dwarves pahole bpftrace linux-tools-$(uname -r) gdb
🚦 如果你觉得 GNU 工具不够全,推荐重点扩展这些:
| 类型 | 替代/补强工具 | 特别能力 |
|---|---|---|
| ELF 分析 | elfutils (eu-objdump, eu-readelf) |
支持 DWARF 更好 |
| 调试信息 | dwarfdump, pahole |
查看结构体/函数行号 |
| 动态探测 | perf, kprobe, ftrace, bpftrace |
实时追踪模块函数 |
| 控制流分析 | Ghidra, IDA, radare2 |
逆向/图形化分析 |
| tracepoint | trace-cmd, kernelshark |
图形化分析内核行为 |
| 自动分析脚本 | 自写 shell/python 脚本 | 一键串联以上工具 |
✅ 示例:一键分析脚本框架(bash)
#!/bin/bash
ko=$1
echo "====== [file] ======"
file "$ko"
echo "====== [modinfo] ======"
modinfo "$ko"
echo "====== [nm] ======"
nm -n "$ko" | head -20
echo "====== [strings] ======"
strings "$ko" | grep -i -E 'debug|log|version|usage' | head -20
echo "====== [readelf] ======"
readelf -h "$ko"
| 步骤 | 工具 | 作用 |
|---|---|---|
| 1️⃣ | readlink /proc/$pid/exe |
定位真实 ELF |
| 2️⃣ | file + ldd |
判断语言与链接方式 |
| 3️⃣ | readelf -h -S -r -s |
看符号/节表状态 |
| 4️⃣ | objdump -D -M intel |
反汇编 _start 流程 |
| 5️⃣ | readelf -x .init_array |
查 constructor 注册 |
| 6️⃣ | gdb -p <pid> |
动态查看堆栈与线程 |
| 7️⃣ | cat /proc/$pid/maps |
确认代码段与库映射 |
| 8️⃣ | perf top -p $pid |
确认循环热点(event loop) |
| 组别 | 工具 / 可执行 | 说明(用途) | 常用命令 / 典型子命令 / 备注 |
|---|---|---|---|
| 基础文件与文本处理(coreutils) | coreutils(包) |
UNIX 基本命令集合(文件/文本/目录/权限等) | ls, cp, mv, rm, ln, chmod, chown, cat, tac, tac, head, tail, cut, paste, sort, uniq, tr, wc, comm, split, cksum, md5sum, sha256sum, dirname, basename, date, sleep, seq, echo, printf |
| 二进制分析(binutils) | objdump |
反汇编、段/节查看 | objdump -d, objdump -D, objdump -t, objdump -R |
nm |
符号表(.symtab / .dynsym)查看 | nm -n, nm -D |
|
readelf |
ELF 头、节、段、符号、动态段查看(比 objdump 更专注 ELF) | readelf -h -S -l -s -r -x .init_array |
|
strings |
打印可打印字符串 | strings /path/to/bin |
|
addr2line / eu-addr2line |
地址->源文件:行(用在有调试符号时) | addr2line -e binary 0xADDR |
|
ar, ranlib, strip, size |
静态库/符号/剥离/大小 | ar rcs lib.a, strip binary, size binary |
|
| C/C++ 编译工具链(GCC 系列) | gcc / g++ / cc |
C/C++ 编译器前端 | gcc -g -O2, g++ -g |
ld (GNU ld) |
链接器(也可能用 gold/lld) |
链接脚本与入口控制 | |
as (GNU assembler) |
汇编器 | as file.s |
|
| 运行时 / libc / 动态链接 | ldd |
显示动态库依赖 | ldd /proc/<pid>/exe |
ldconfig / /usr/lib/debug (debug info) |
调试符号安装/查找 | readelf -n 查 Build-ID |
|
| 调试器与动态调试 | gdb |
用户态调试 / 动态 attach / backtrace | gdb -p PID, bt, thread apply all bt |
gdbserver |
远端调试服务 | gdbserver :1234 /path/bin |
|
| 构建系统 / 自动化 | make (GNU make) |
构建规则执行 | make, make -j |
autoconf / automake / libtool |
Autotools 系列,生成 configure/Makefile.in | ./configure, autoreconf |
|
cmake(非 GNU,但常见) |
现代构建系统(列出以便区分) | cmake . && make |
|
| 文本匹配 / 过滤 | grep (GNU grep) |
正则搜索 | grep -R, grep -P |
sed (GNU sed) |
流编辑 | sed -n '1,100p' |
|
awk / gawk |
文本处理/脚本 | awk '{print $1}' |
|
| 文件归档 / 压缩 | tar (GNU tar) |
打包与解包 | tar -cvf, tar -xzf |
gzip / gunzip |
压缩 | gzip file |
|
bzip2 / xz |
其它压缩格式 | xz -d file.xz |
|
| 比较 / 打补丁 | diff / diffutils |
比较文件 | diff -u a b |
patch |
应用补丁 | patch -p1 < fix.patch |
|
| 查找 / 文件定位 | find / locate (findutils) |
文件查找 | find / -name binary |
which, type (shell builtins/paths) |
命令路径 | which gcc |
|
| 过程/任务工具(procps/psmisc) | ps / top / kill / pgrep |
进程查看与管理 | ps aux, pgrep -f name, kill -9 PID |
| 系统级工具(util-linux) | mount, umount, nsenter, chroot 等 |
挂载/命名空间/环境管理 | nsenter -t PID -a bash |
| 性能与追踪(非纯 GNU,但常用) | perf (Linux perf) |
性能采样 / 火焰图 | perf top -p PID, perf record -p PID |
strace / ltrace |
系统调用 / 库调用跟踪 | strace -f -p PID |
|
systemtap / bcc / bpftrace |
内核 & eBPF 跟踪(高级) | bpftrace -e 'tracepoint:...' |
|
| 其它有用 GNU/类 GNU 工具 | xxd / hexdump |
十六进制查看 | xxd file |
tpl / gettext(国际化) |
本地化工具 | msgfmt 等 |
|
m4 |
宏处理(autotools 依赖) | m4 |
|
| 调试符号 / 源映射 | eu-readelf / eu-addr2line(elfutils) |
与 readelf/addr2line 类似(非 GNU binutils) | eu-readelf -n |
| 开发辅助 | git(非 GNU) |
版本控制(列出以便工具链完整) | git log, git bisect |
浙公网安备 33010602011771号