深入学习 Linux nm 命令,精准地检测编译后的程序(linux下nm命令)
Linux系统应用广泛,而系统上有很多值得深入学习的优质工具,其中包括 nm 命令,其全称为 symbol table management,具有极强的精准度。它可以在编译后的程序中,根据传递参数模糊检测、读取或直接列出程序定义的符号表信息。我们可以通过nm命令,检测我们的程序有哪些符号表信息,这些信息会帮助我们的更好的理解和调试程序,通常支持如下符号:
U:表示未定义的符号
D:表示可以从内存导出的符号
R:表示只读取的符号
T:表示global初始化(在程序启动时初始化)的符号
A:表示global未初始化的符号
B:表示bsS符号
C:表示编译器特殊的签名符号
好了准备工作完成后,我们就可以深入学习使用 nm 命令了。它的使用方式比较简单,直接在终端输入如下代码:
# nm [程序文件]
如果程序文件参数正确,此代码执行后,会显示出该程序定义的符号表信息,详细信息包括:
编程类型
符号名
地址
符号描述
如果想更加精准地检测编译后的程序,可以在上面命令后面加上:– defines 或 — externs 选项,这样就只会输出定义和外部符号表信息,得到更加精准更加及时的检测结果。
此外,nm还可以支持正则表达式搜索,可以搜索程序中某个特定的符号表信息,代码如下:
# nm [程序文件] | grep [正则表达式]
例如:
# nm [程序文件] | grep ‘main‘
我们通过精准的搜索功能,可以快速查找出 main 函数是由哪一部分源码定义的,以及它的符号信息是什么。
由上可见,Linux nm 命令是一个强大精准的程序检测工具,它可以在查找、精准检测编译后的程序中,精准地搜索出定义符号信息。如果对其更多特性有兴趣,可以通过man或–help参数查看它的所有帮助信息。