fbpx
维基百科

nm (Unix)

nm命令存在于多数后出版本的Unix类似操作系统中。nm被用来检查二进制文件(包括,编译后的目标模块,共享目标文件,和独立可执行文件)并显示这些文件的内容,或存储在其中的元信息,特别是符号表。来自nm的输出区分各种符号类型。例如,在一个目标文件所提供的函数和它所需要的函数之间是有区别的。nm被用作调试的辅助工具,帮助解决名字冲突和C++名称修饰引起的问题,和验证工具链的其他部分。

nm
開發者AT&T贝尔实验室
首次发布1971年11月3日,​51年前​(1971-11-03
操作系统Unix类Unix
类型命令

GNU计划GNU Binutils包中提供了一个nm的实现。objdump -treadelf -s也可以查看目标文件的符号表。

nm输出样例 编辑

下面的例子展示了变量和函数在全局局部外部静态自动初始化的不同情况下的不同符号类型。

/*  * 文件名: test.c  * 对于C代码如下编译:   * gcc -c test.c  *  * 对于C++代码如下编译:  * g++ -c test.cpp  */ int global_var; int global_var_init = 26; static int static_var; static int static_var_init = 25; extern int extern_var; extern int extern_function(int); static int static_function(int x, int y) {  int local_automatic_var;  local_automatic_var = x + y;  return local_automatic_var; } int global_function(int p) {  static int local_static_var;  static int local_static_var_init=5;    local_static_var = static_function(local_static_var_init, p);   return local_static_var; } int main(int argc, char** argv) {  static_var = 1;  global_var = global_function(2);  extern_var = extern_function(3);  return 0; } #ifdef __cplusplus extern "C" #endif void non_mangled_function(void) {  // I do nothing } 

如果上述代码使用了gcc C编译器来编译,nm命令的输出将是如下这样:

$ nm test.o  U extern_function  U extern_var 000000000000001a T global_function  U _GLOBAL_OFFSET_TABLE_ 0000000000000004 C global_var 0000000000000000 D global_var_init 0000000000000004 b local_static_var.1970 0000000000000008 d local_static_var_init.1971 000000000000004c T main 0000000000000045 T non_mangled_function 0000000000000000 t static_function 0000000000000000 b static_var 0000000000000004 d static_var_init 

默认按符号字母序排序,其中,大写字母表示全局性,小写字母表示局部性;U表示此符号未定义,C表示此符号是公共的,T/t表示此符号在正文(代码)段中,D/d的表示此符号在初始化数据段中,B/b表示此符号在BSS数据段中。

在使用了C++编译器时,输出是不同的:

$ nm test.o  U extern_var  U _GLOBAL_OFFSET_TABLE_ 0000000000000000 B global_var 0000000000000000 D global_var_init 000000000000004c T main 0000000000000045 T non_mangled_function  U _Z15extern_functioni 000000000000001a T _Z15global_functioni 0000000000000004 b _ZL10static_var 0000000000000000 t _ZL15static_functionii 0000000000000004 d _ZL15static_var_init 0000000000000008 b _ZZ15global_functioniE16local_static_var 0000000000000008 d _ZZ15global_functioniE21local_static_var_init 

在二者输出之间的不同还展示了通过在C++代码中使用extern "C"解决名称修饰问题的一个例子。

参见 编辑

外部链接 编辑

unix, nm命令存在于多数后出版本的unix及类似的操作系统中, nm被用来检查二进制文件, 包括库, 编译后的目标模块, 共享目标文件, 和独立可执行文件, 并显示这些文件的内容, 或存储在其中的元信息, 特别是符号表, 来自nm的输出区分各种符号类型, 例如, 在一个目标文件所提供的函数和它所需要的函数之间是有区别的, nm被用作调试的辅助工具, 帮助解决名字冲突和c, 名称修饰引起的问题, 和验证工具链的其他部分, nm開發者at, t贝尔实验室首次发布1971年11月3日, 51年前, 1971, 操作. nm命令存在于多数后出版本的Unix及类似的操作系统中 nm被用来检查二进制文件 包括库 编译后的目标模块 共享目标文件 和独立可执行文件 并显示这些文件的内容 或存储在其中的元信息 特别是符号表 来自nm的输出区分各种符号类型 例如 在一个目标文件所提供的函数和它所需要的函数之间是有区别的 nm被用作调试的辅助工具 帮助解决名字冲突和C 名称修饰引起的问题 和验证工具链的其他部分 nm開發者AT amp T贝尔实验室首次发布1971年11月3日 51年前 1971 11 03 操作系统Unix和类Unix类型命令GNU计划在GNU Binutils包中提供了一个nm的实现 a href Objdump html title Objdump objdump a t和 a href Readelf html title Readelf readelf a s也可以查看目标文件的符号表 nm输出样例 编辑下面的例子展示了变量和函数在全局 局部 外部 静态 自动和初始化的不同情况下的不同符号类型 文件名 test c 对于C代码如下编译 gcc c test c 对于C 代码如下编译 g c test cpp int global var int global var init 26 static int static var static int static var init 25 extern int extern var extern int extern function int static int static function int x int y int local automatic var local automatic var x y return local automatic var int global function int p static int local static var static int local static var init 5 local static var static function local static var init p return local static var int main int argc char argv static var 1 global var global function 2 extern var extern function 3 return 0 ifdef cplusplus extern C endif void non mangled function void I do nothing 如果上述代码使用了gcc C编译器来编译 nm命令的输出将是如下这样 nm test o U extern function U extern var 000000000000001a T global function U GLOBAL OFFSET TABLE 0000000000000004 C global var 0000000000000000 D global var init 0000000000000004 b local static var 1970 0000000000000008 d local static var init 1971 000000000000004c T main 0000000000000045 T non mangled function 0000000000000000 t static function 0000000000000000 b static var 0000000000000004 d static var init 默认按符号字母序排序 其中 大写字母表示全局性 小写字母表示局部性 U表示此符号未定义 C表示此符号是公共的 T t表示此符号在正文 代码 段中 D d的表示此符号在初始化数据段中 B b表示此符号在BSS数据段中 在使用了C 编译器时 输出是不同的 nm test o U extern var U GLOBAL OFFSET TABLE 0000000000000000 B global var 0000000000000000 D global var init 000000000000004c T main 0000000000000045 T non mangled function U Z15extern functioni 000000000000001a T Z15global functioni 0000000000000004 b ZL10static var 0000000000000000 t ZL15static functionii 0000000000000004 d ZL15static var init 0000000000000008 b ZZ15global functioniE16local static var 0000000000000008 d ZZ15global functioniE21local static var init 在二者输出之间的不同还展示了通过在C 代码中使用extern C 解决名称修饰问题的一个例子 参见 编辑objdump readelf外部链接 编辑nm 写出一个目标文件的名字列表 命令与工具 Commands amp Utilities 参考 单一UNIX 规范第7期 由國際開放標準組織发布 取自 https zh wikipedia org w index php title Nm Unix amp oldid 76085917, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。