热门问题
时间线
聊天
视角
nm (Unix)
来自维基百科,自由的百科全书
Remove ads
nm命令存在於多數後出版本的Unix及類似的操作系統中。nm被用來檢查二進制文件(包括庫,編譯後的目標模塊,共享目標文件,和獨立可執行文件)並顯示這些文件的內容,或存儲在其中的元信息,特別是符號表。來自nm的輸出區分各種符號類型。例如,在一個目標文件所提供的函數和它所需要的函數之間是有區別的。nm被用作調試的輔助工具,幫助解決名字衝突和C++名稱修飾引起的問題,和驗證工具鏈的其他部分。
GNU計劃在GNU Binutils包中提供了一個nm的實現。objdump -t
和readelf -s
也可以查看目標文件的符號表。
nm輸出樣例
下面的例子展示了變量和函數在全局、局部、外部、靜態、自動和初始化的不同情況下的不同符號類型。
/*
* 文件名: test.c
* 对于C代码如下编译:
* gcc -c test.c
*
* 文件名:test.cpp
* 对于C++代码如下编译:
* g++ -c test.cpp
*/
int global_var;
int global_var_init = 26;
static int static_var;
static int static_var_init = 25;
static int static_function()
{
return 0;
}
int global_function(int p)
{
static int local_static_var;
static int local_static_var_init=5;
local_static_var = p;
return local_static_var_init + local_static_var;
}
int global_function2()
{
int x;
int y;
return x+y;
}
#ifdef __cplusplus
extern "C" {
#endif
void non_mangled_function()
{
// I do nothing
}
#ifdef __cplusplus
}
#endif
int main(void)
{
global_var = 1;
static_var = 2;
return 0;
}
如果上述代碼使用了gcc C編譯器來編譯,nm -n
命令的輸出將把符號按其地址的數值來排序成如下這樣:
$ nm -n test.o
0000000000000000 B global_var
0000000000000000 D global_var_init
0000000000000000 t static_function
0000000000000004 b static_var
0000000000000004 d static_var_init
0000000000000008 b local_static_var.1
0000000000000008 d local_static_var_init.0
000000000000000f T global_function
0000000000000033 T global_function2
0000000000000045 T non_mangled_function
0000000000000050 T main
在使用了C++編譯器時,輸出是不同的:
$nm -n test.o
0000000000000000 B global_var
0000000000000000 D global_var_init
0000000000000000 t _ZL15static_functionv
0000000000000004 b _ZL10static_var
0000000000000004 d _ZL15static_var_init
0000000000000008 b _ZZ15global_functioniE16local_static_var
0000000000000008 d _ZZ15global_functioniE21local_static_var_init
000000000000000f T _Z15global_functioni
0000000000000033 T _Z16global_function2v
0000000000000045 T non_mangled_function
0000000000000050 T main
在二者輸出之間的不同還展示了通過在C++代碼中使用extern "C"
解決名稱修飾問題的一個例子。
Remove ads
參見
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads