Prayer

在一般中寻求杰出
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  12bet12bet怎么样 :: 主页 :: 新漫笔 :: 联络 :: 聚合  :: 办理

nm指令中符号类型详解

Posted on 2019-04-10 14:28 Prayer 阅览(45) 谈论(0)  修改 保藏 引证 所属分类: LINUX/UNIX/AIX

nm指令介绍的许多,但大多不介绍其函数符号标志的意义。
最近在调试动态库经常用到,其顶用的最多的用法:
nm -A * |grep “aaa” | 12betfilt  // -A 为了显现文件, 12betfilt转换为可读风格,如同有个参数也能完成相似功用


其他内容收拾如下(原作者不知道):

nm用于列出方针文件的符号清单,假如没有指定方针文件,则默以为“a.out”。nm的格局如下:

nm [‘-a’|‘--debug-syms’] [‘-g’|‘--extern-only’]
         [‘-B’] [‘-C’|‘--demangle’[=style]] [‘-D’|‘--dynamic’]
         [‘-S’|‘--print-size’] [‘-s’|‘--print-armap’]
         [‘-A’|‘-o’|‘--print-file-name’][‘--special-syms’]
         [‘-n’|‘-v’|‘--numeric-sort’] [‘-p’|‘--no-sort’]
         [‘-r’|‘--reverse-sort’] [‘--size-sort’] [‘-u’|‘--undefined-only’]
         [‘-t’ radix|‘--radix=’radix] [‘-P’|‘--portability’]
         [‘--target=’bfdname] [‘-f’format|‘--format=’format]
         [‘--defined-only’] [‘-l’|‘--line-numbers’] [‘--no-demangle’]
        [‘-V’|‘--version’] [‘-X 32_64’] [‘--help’] [objfile...]
  
关于每一个符号,nm列出其值(the symbol value),类型(the symbol type)和其姓名(the symbol name)。
如下例:
  
     00000024 T cleanup_before_linux
     00000018 T cpu_init
     00000060 T dcache_disable
     00000054 T dcache_enable
     0000006c T dcache_status
     00000000 T do_reset
     0000003c T icache_disable
     00000030 T icache_enable
     00000048 T icache_status
 
上面的显现是运用nm cpu.o的输出,关于cleanup_before_linux这个符号来说,00000024是以16进制显现的其值,T为其类型,而cleanup_before_linux是其姓名。能够看出,上面显现的cleanup_before_linux这个symbol的值实际上是该函数在text section中的偏移。可是,每个符号的值的详细意义依其类型而异。当然,关于每个符号的值,其类型、其值以及它们所属的section是密切相关的。
下面阐明符号类型:关于每一个符号来说,其类型假如是小写的,则标明该符号是local的;大写则标明该符号是global(external)的。

符号
类型
阐明
A该符号的值是肯定的,在今后的链接过程中,不允许进行改动。这样的符号值,常常出现在中断向量表中,例如用符号来表明各个中断向量函数在中断向量表中的方位。
B该符号的值出现在非初始化数据段(bss)中。例如,在一个文件中界说大局static int test。则该符号test的类型为b,坐落bss section中。其值表明该符号在bss段中的偏移。一般来说,bss段分配于RAM
C该符号为commoncommon symbol是未初始话数据段。该符号没有包括于一个一般section中。只要在链接过程中才进行分配。符号的值表明该符号需求的字节数。例如在一个c文件中,界说int test,而且该符号在其他当地会被引证,则该符号类型即为C。不然其类型为B
D该符号坐落初始话数据段中。一般来说,分配到data section中。例如界说大局int baud_table[5] = {9600, 19200, 38400, 57600, 115200},则会分配于初始化数据段中
G该符号也坐落初始化数据段中。首要用于small object进步拜访small data object的一种方法。
I该符号是对另一个符号的直接引证。
N该符号是一个debugging符号。
R该符号坐落只读数据区。例如界说大局const int test[] = {123, 123};test便是一个只读数据区的符号。注意在cygwin下假如运用gcc直接编译成MZ格局时,源文件中的test对应_test,而且其符号类型为D,即初始化数据段中。可是假如运用m6812-elf-gcc这样的穿插编译东西,源文件中的test对应方针文件的test,即没有增加下划线,而且其符号类型为R。一般来说,坐落rodata section。值得注意的是,假如在一个函数中界说const char *test = “abc”, const char test_int = 3。运用nm都不会得到符号信息,可是字符串“abc”分配于只读存储器中,testrodata section中,巨细为4
S符号坐落非初始化数据区,用于small object
T该符号坐落代码区text section
U该符号在当时文件中是未界说的,即该符号的界说在其他文件中。例如,当时文件调用另一个文件中界说的函数,在这个被调用的函数在当时便是未界说的;可是在界说它的文件中类型是T。可是关于大局变量来说,在界说它的文件中,其符号类型为C,在运用它的文件中,其类型为U
V该符号是一个weak object
WThe symbol is a weak symbol that has not been specifically tagged as a weak object symbol.
-该符号是a.out格局文件中的stabs symbol
该符号类型没有界说