12.2 查看符号表

在讨论调试程序的时候说过可执行文件和目标文件可以包含一个符号表(查看第5章[编译调试])。这个符号表储存了函数和变量的内存地址,可以使用nm命令查看符号表:

$ nm a.out

08048334 t Letext

08049498 ? _DYNAMIC

08049570 ? GLOBAL_OFFSET_TABLE

........

080483f0 T main

08049590 b object.11

0804948c d p.3

U printf@GLIBC_2.0

符号表的内容显示main函数的十六进制地址是080483f。大多数符号提供给编译器和操作系统使用。第二列中的’T’标记指明这个函数定义在目标文件中,’U’标记指明这个函数没有定义(应该在链接其他目标文件时解决)。Nm命令输出信息的全部解释可以在GNU Binutils手册中找到。

Nm命令的常见用法是检查库文件中是否定义了某个具体函数,通过查看第二列有’T’标记的函数名。