曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4354|回复: 0
打印 上一主题 下一主题

nm -- 列出文件中的符号

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-8-6 12:56:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
nm 命令列出目标文件中的符号。基本用法:
nm your_objectfile
如果不指定目标文件,那么 nm 尝试默认的文件名 a.out 。比如我们列出一个可执行文件的相关符号:
[beyes@beyes elf]$ nm testefl
080496a0 d _DYNAMIC
0804976c d _GLOBAL_OFFSET_TABLE_
08048558 R _IO_stdin_used
         w _Jv_RegisterClasses
08049690 d __CTOR_END__
0804968c d __CTOR_LIST__
08049698 D __DTOR_END__
08049694 d __DTOR_LIST__
08048688 r __FRAME_END__
0804969c d __JCR_END__
0804969c d __JCR_LIST__
08049790 A __bss_start
08049788 D __data_start
08048500 t __do_global_ctors_aux
08048370 t __do_global_dtors_aux
0804855c R __dso_handle
         w __gmon_start__
080484f2 T __i686.get_pc_thunk.bx
0804968c d __init_array_end
0804968c d __init_array_start
080484f0 T __libc_csu_fini
08048480 T __libc_csu_init
         U __libc_start_main@@GLIBC_2.0
08049790 A _edata
0804979c A _end
08048538 T _fini
08048554 R _fp_hw
080482b4 T _init
08048340 T _start
08049798 B c
08049790 b completed.5499
08049788 W data_start
08049794 b dtor_idx.5501
080483d0 t frame_dummy
08048414 T main
080483f4 T plusfunc
         U printf@@GLIBC_2.0
08048401 T printstring
         U puts@@GLIBC_2.0
0804978c D strp
上面输出中一共有 3 列,第 3 列表示相关符号,第 1 列是符号的虚拟地址,第 2 列表示的是该符号的类型。注意到,有两种符号,一种是大写,一种是小写。大写的表示该符号是全局性,或外部符号(global or externel);小写表示该符号该符号是本地性(local)的。

下面所述中,所说的节区是 section 的意思。

-A :表示该符号的值是个绝对值,在后面的链接中也不会被改变。

B 和 b 当查看可执行文件时,该类型符号处于未初始化数据区(比如 BSS)。例如,在程序中定义一个未初始化的全局变量,那么该变量的符号类型就是 B;如果这个全局变量前面经过 static 声明为静态全局变量的话,那么该变量的符号对应的类型就是 b 。

C : 该符号表示通用符号(common symbols)。通用符号表示未初始化数据。在链接时,可能会出现多个同名通用符号。当查看目标文件时,会看到被定位为全局变量的变量名就是属于这种符号。在用 gcc -S 来生成 c 文件的相应汇编文件时,会发现全局变量在汇编程序中是用 .comm 来声明的。

D 和 d :表示符号在已初始化的数据节区。如果一个被初始化了的全局变量名符号就属于该类型。

N : 表示该符号是一个调试符号。

R 和 r :表示该符号位于只读数据数据节区。

T 和 t : 表示该符号位于代码节区。

U :表示该符号未定义。

u :表示该符号是一个独一的全局符号。这是 GNU 对标准 ELF 符号绑定的一个扩展。对于这种符号,动态链接器将确保它在整个进程中它的名字以及类型都是唯一的。

V 和 v : 这种符号表示一个弱目标。当一个已定义的弱符号和一个普通的已定义符号链接时,普通的已定义符号并不会因此产生错误。当一个弱的未定义符号被链接时,那么也不会产生错误,而且该弱符号的值此时为 0。在某些系统里,大写 V 表示已经为该符号指定了默认值。

W 和 w :该符号是一个还未明确说明为弱对象符号。当一个已定义的弱符号和一个普通的已定义符号链接时,使用普通的已定义符号不会有问题。当一个弱的未定义符号链接时,该符号未定义,并且符号值由与系统相关的管理器指定,这也不会产生什么错误。在某些系统上,大写 W 表示已经指定了默认值。

G 和 g :对于小型目标来说,该符号位于已初始化数据节区。一些目标文件格式允许高校访问小型数据目标,比如一个全局 int 型变量,而不是一个大的全局数组。

i :对于 PE 格式文件,表示符号位于一个提供 DLL 实现的节区中。对于 ELF 格式,这表示该符号间接函数,这是 GNU 对标准 ELF 符号类型的一个扩展。

选项参数
-A, -o, --print-file-name :在每个符号面前添加文件名,表示该符号是在该文件中找到的。

-a, --debug-syms : 显示所有符号,包括调试符号。

-B : 和 --format=bsd 相同。

-D, --dynamic :显示动态符号而不是普通符号。该选项对于动态目标比较有用,如某种类型的共享库。

-f format , --format=format :使用后接参数 format 所指定的格式输出,这些格式可以是 "bsd", “sysv"  或 "posix" ,默认是 "bsd" 。

-g, --extern-only :仅显示外部符号。

--plugin name :加载由 name 指定的插件,用以支持额外的目标类型。该选项仅在工具链 built 时使用了 plugin 支持使能时才有效。

-l, --line-numbers :对于每一个符号,使用调试信息试图找到一个文件名和行号。对于一个已定义的符号,

-S, --print-size : 对于 "bsd" 风格的输出,打印符号的值和大小。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 07:32 , Processed in 0.059289 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表