在做 cuda-oxide 时翻 PTX 编译产物经常会用到 nm 看符号——记一下输出里每个字母代表什么。
nm 输出的每个符号前都会带一个字母,表示这个符号所在的段(Section)及其属性。
常用符号类型
| 类型 | 全称 | 含义 | 示例 |
|---|---|---|---|
| T | Text | 代码段中的全局函数 | T helloworld |
| t | text | 代码段中的局部函数(static) | t helper |
| D | Data | 已初始化的全局变量(数据段) | D global_var |
| d | data | 已初始化的局部变量(static) | d local_static |
| R | Read-only | 只读数据段中的全局常量 | R kConst |
| r | read-only | 只读数据段中的局部常量(static) | r kLocal |
| B | BSS | 未初始化或零初始化的全局变量 | B buffer |
| b | bss | 未初始化或零初始化的局部静态变量 | b local_buf |
| U | Undefined | 未定义符号(需要从其他库链接) | U printf |
| N | No type | 调试符号,不是实际代码/数据 | N $d |
快速记忆
大小写 = 可见性:
- 大写(T/D/R/B)→ 全局符号
- 小写(t/d/r/b)→ 局部(static)符号
字母 = 段:
T→ Text(代码)D→ Data(数据)R→ Read-only(只读)B→ BSS(零初始化)U→ Undefined(未定义)N→ 调试符号
一个例子
0000000001d2c820 T __rustc_codegen_backend ← 全局函数(代码段)
U free ← 需要从 libc 等库链接
T:符号在这个库里有定义,是全局函数U:符号在这个库里没有定义,需要链接其他库(比如free来自libc.so)
评论区
评论功能即将上线, 敬请期待。