如何读取 nm 输出?
How to read nm output?
那是我的代码:
int const const_global_init = 2;
int const const_global;
int global_init = 4;
int global;
static int static_global_init = 3;
static int static_global;
static int static_function(){
return 2;
}
double function_with_param(int a){
static int static_local_init = 3;
static int static_local;
return 2.2;
}
int main(){
}
我生成 main.o
并且我尝试理解 nm
输出。在我使用 nm main.o --printfile-name -a
之后,我得到了这个输出:
main.o:0000000000000000 b .bss
main.o:0000000000000000 n .comment
main.o:0000000000000004 C const_global
main.o:0000000000000000 R const_global_init
main.o:0000000000000000 d .data
main.o:0000000000000000 r .eh_frame
main.o:000000000000000b T function_with_param
main.o:0000000000000004 C global
main.o:0000000000000000 D global_init
main.o:0000000000000027 T main
main.o:0000000000000000 a main.c
main.o:0000000000000000 n .note.GNU-stack
main.o:0000000000000000 r .rodata
main.o:0000000000000000 t static_function
main.o:0000000000000000 b static_global
main.o:0000000000000004 d static_global_init
main.o:0000000000000004 b static_local.1733
main.o:0000000000000008 d static_local_init.1732
main.o:0000000000000000 t .text
我看懂了第二和第三列,但是我真的不知道第一列是什么,是地址还是大小?我知道一些关于 .bbs
、.comment
、.data
和 .text
段的想法,但它是什么 .eh_frame
、.note.GNU-stack
和 .rodata
?
... i really dont know what is in the first column, whether it is the address or size?
我的本地联机帮助页(来自 man nm
)说
DESCRIPTION
GNU nm lists the symbols from object files objfile.... If no object files are listed as arguments, nm assumes the file a.out.
For each symbol, nm shows:
· The symbol value, in the radix selected by options (see below), or hexadecimal by default.
即第一列是符号的'value'。要理解这意味着什么,了解一些有关 ELF 和运行时链接器的知识会很有帮助,但通常它只是相关部分的偏移量。
了解一些关于 ELF 的知识也有助于解决其他问题:man elf
告诉我们 .rodata
部分是只读数据(即:硬编码到程序中的常量值永远不会改变. 字符串文字可能会放在这里)。
.eh_frame
用于异常处理和其他调用堆栈帧元数据(对 eh_frame
的搜索第一个匹配项是 this question)。
那是我的代码:
int const const_global_init = 2;
int const const_global;
int global_init = 4;
int global;
static int static_global_init = 3;
static int static_global;
static int static_function(){
return 2;
}
double function_with_param(int a){
static int static_local_init = 3;
static int static_local;
return 2.2;
}
int main(){
}
我生成 main.o
并且我尝试理解 nm
输出。在我使用 nm main.o --printfile-name -a
之后,我得到了这个输出:
main.o:0000000000000000 b .bss
main.o:0000000000000000 n .comment
main.o:0000000000000004 C const_global
main.o:0000000000000000 R const_global_init
main.o:0000000000000000 d .data
main.o:0000000000000000 r .eh_frame
main.o:000000000000000b T function_with_param
main.o:0000000000000004 C global
main.o:0000000000000000 D global_init
main.o:0000000000000027 T main
main.o:0000000000000000 a main.c
main.o:0000000000000000 n .note.GNU-stack
main.o:0000000000000000 r .rodata
main.o:0000000000000000 t static_function
main.o:0000000000000000 b static_global
main.o:0000000000000004 d static_global_init
main.o:0000000000000004 b static_local.1733
main.o:0000000000000008 d static_local_init.1732
main.o:0000000000000000 t .text
我看懂了第二和第三列,但是我真的不知道第一列是什么,是地址还是大小?我知道一些关于 .bbs
、.comment
、.data
和 .text
段的想法,但它是什么 .eh_frame
、.note.GNU-stack
和 .rodata
?
... i really dont know what is in the first column, whether it is the address or size?
我的本地联机帮助页(来自 man nm
)说
DESCRIPTION
GNU nm lists the symbols from object files objfile.... If no object files are listed as arguments, nm assumes the file a.out.
For each symbol, nm shows:
· The symbol value, in the radix selected by options (see below), or hexadecimal by default.
即第一列是符号的'value'。要理解这意味着什么,了解一些有关 ELF 和运行时链接器的知识会很有帮助,但通常它只是相关部分的偏移量。
了解一些关于 ELF 的知识也有助于解决其他问题:man elf
告诉我们 .rodata
部分是只读数据(即:硬编码到程序中的常量值永远不会改变. 字符串文字可能会放在这里)。
.eh_frame
用于异常处理和其他调用堆栈帧元数据(对 eh_frame
的搜索第一个匹配项是 this question)。