温馨提示×

nm和objdump反汇编区别

小樊
45
2026-10-12 06:20:22
栏目: 编程语言

nm 和 objdump 都是分析 ELF(或其他格式)目标文件 / 可执行文件的常用工具,但用途和侧重点完全不同。下面从“干什么”“看什么”“反汇编能力”几个角度说明区别。


一、nm:符号查看工具(不是反汇编)

作用

nm 用于查看目标文件中的符号表(symbol table)。

能看什么

  • 函数名、变量名
  • 符号类型(如 T 文本段、D 数据段、U 未定义)
  • 符号地址
  • 是否在静态/动态链接中存在

示例

nm a.out

输出示例:

0000000000401136 T main
                 U printf
0000000000404010 D global_var

特点

✅ 轻量、快速
❌ 不会反汇编代码
❌ 只显示符号,不显示指令


二、objdump:二进制分析 & 反汇编工具

作用

objdump 是 二进制文件分析与反汇编工具,可以查看:

  • 汇编代码(反汇编)
  • 段信息(section)
  • 重定位信息
  • 符号表(也可以)
  • 头部信息

反汇编示例

objdump -d a.out

输出示例:

0000000000401136 <main>:
  401136:   55                      push   %rbp
  401137:   48 89 e5                mov    %rsp,%rbp

常用选项

  • -d:反汇编可执行代码
  • -D:反汇编所有段
  • -S:源码+反汇编(需 -g 编译)
  • -t:显示符号(类似 nm)
  • -h:段头信息

三、核心区别对比

对比项 nm objdump
主要功能 查看符号 反汇编 & 二进制分析
是否反汇编 ❌ 否 ✅ 是
是否看汇编指令 ❌ 否 ✅ 是
是否看符号 ✅ 是 ✅ 是(-t)
输出复杂度 简单 复杂
调试用 查函数/变量 分析执行逻辑

四、什么时候用哪个?

用 nm 当:

  • 想知道有哪些函数 / 全局变量
  • 查符号是否导出 / 未定义
  • 快速定位链接错误(undefined reference)

用 objdump 当:

  • 想看汇编代码
  • 分析函数实现
  • 调试 crash / 逆向
  • 查看段布局、重定位

五、一句话总结

nm 看“有什么符号”,objdump 看“代码长什么样”。

如果你愿意,我也可以给你一个**实战例子(C → nm → objdump)**来对比。

0 踩