nm 符号类型速查

nm 输出每个符号前带一个字母,标记它所在段(Section)和可见性。

📚 系列 compiler · 第 1 篇

在做 cuda-oxide 时翻 PTX 编译产物经常会用到 nm 看符号——记一下输出里每个字母代表什么。

nm 输出的每个符号前都会带一个字母,表示这个符号所在的段(Section)及其属性。

常用符号类型

类型全称含义示例
TText代码段中的全局函数T helloworld
ttext代码段中的局部函数(static)t helper
DData已初始化的全局变量(数据段)D global_var
ddata已初始化的局部变量(static)d local_static
RRead-only只读数据段中的全局常量R kConst
rread-only只读数据段中的局部常量(static)r kLocal
BBSS未初始化或零初始化的全局变量B buffer
bbss未初始化或零初始化的局部静态变量b local_buf
UUndefined未定义符号(需要从其他库链接)U printf
NNo type调试符号,不是实际代码/数据N $d

快速记忆

大小写 = 可见性:

  • 大写(T/D/R/B)→ 全局符号
  • 小写(t/d/r/b)→ 局部(static)符号

字母 = 段:

  • TText(代码)
  • DData(数据)
  • RRead-only(只读)
  • BBSS(零初始化)
  • UUndefined(未定义)
  • N → 调试符号

一个例子

0000000001d2c820 T __rustc_codegen_backend  ← 全局函数(代码段)
                 U free                       ← 需要从 libc 等库链接
  • T:符号在这个库里有定义,是全局函数
  • U:符号在这个库里没有定义,需要链接其他库(比如 free 来自 libc.so)
评论区
评论功能即将上线, 敬请期待。