如何读取nm输出?

Ice*_*Ice 9 c linux nm

那是我的代码:

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(){
}
Run Code Online (Sandbox Code Playgroud)

我生成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
Run Code Online (Sandbox Code Playgroud)

我理解第二和第三列但是,我真的不知道第一列是什么,无论是地址还是大小?我知道somethink约.bbs,.comment,.data.text段但它是什么.eh_frame,.note.GNU-stack.rodata

Use*_*ess 6

...我真的不知道第一列是什么,是地址还是大小?

我的本地联机帮助页(来自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.
Run Code Online (Sandbox Code Playgroud)

也就是说,第一列是符号的“值”。要理解这意味着什么,了解一些有关 ELF 和运行时链接器的信息会很有帮助,但通常它只是相关部分的偏移量。

了解有关 ELF 的一些知识也有助于解决其他问题:man elf告诉我们该.rodata部分是只读数据(即:常量值硬编码到程序中,永远不会改变。字符串文字可能会放在此处)。

.eh_frame用于异常处理和其他调用堆栈帧元数据(用于搜索eh_frame具有这个问题作为第一命中)。