zoukankan      html  css  js  c++  java
  • nm命令介绍

    一、参考文章

      网址1:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/nm.html

      参考2: man nm

      参考3:《linux编程一站式学习》第20章 链接详解 的例20.1

    二、功能

      nm 命令显示关于指定 File 中符号的信息,文件可以是对象文件、可执行文件或对象文件库。如果文件没有包含符号信息,nm 命令报告该情况,但不把它解释为出错条件。(list symbols from object files)

    三、截图

      

      

    四、符号说明

    对于每一个符号来说,其类型如果是小写的,则表明该符号是local的;大写则表明该符号是global(external)的。

    • A 该符号的值是绝对的,在以后的链接过程中,不允许进行改变。这样的符号值,常常出现在中断向量表中,例如用符号来表示各个中断向量函数在中断向量表中的位置。
    • B 该符号的值出现在非初始化数据段(bss)中。例如,在一个文件中定义全局static int test。则该符号test的类型为b,位于bss section中。其值表示该符号在bss段中的偏移。一般而言,bss段分配于RAM中。
    • C 该符号为common。common 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就是一个只读数据区的符号。
      • 值得注意的是,如果在一个函数中定义const char *test = “abc”, const char test_int = 3。使用nm都不会得到符号信息,但是字符串”abc”分配于只读存储器中,test在rodata section中,大小为4。
    • S 符号位于非初始化数据区,用于small object。
    • T 该符号位于代码区text section。
    • U 该符号在当前文件中是未定义的,即该符号的定义在别的文件中。
      例如,当前文件调用另一个文件中定义的函数,在这个被调用的函数在当前就是未定义的;但是在定义它的文件中类型是T。但是对于全局变量来说,在定义它的文件中,其符号类型为C,在使用它的文件中,其类型为U。
    • V 该符号是一个weak object。
    • W The symbol is a weak symbol that has not been specifically tagged as a weak object symbol.
    • ? 该符号类型没有定义

    库或对象名 如果您指定了 -A 选项,则 nm 命令只报告与该文件有关的或者库或者对象名。

    五、选项说明

    • -a或–debug-syms:显示所有的符号,包括debugger-only symbols。
    • -B:等同于–format=bsd,用来兼容MIPS的nm。
    • -C或–demangle:将低级符号名解析(demangle)成用户级名字。这样可以使得C++函数名具有可读性。
    • –no-demangle:默认的选项,不需要将低级符号名解析成用户级名。
    • -D或–dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。
    • -f format:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。
    • -g或–extern-only:仅显示外部符号。
    • -n、-v或–numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。
    • -p或–no-sort:按目标文件中遇到的符号顺序显示,不排序。
    • -P或–portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。
    • -s或–print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。
    • -r或–reverse-sort:反转排序的顺序(例如,升序变为降序)。
    • –size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。
    • –target=bfdname:指定一个目标代码的格式,而非使用系统的默认格式。
    • -u或–undefined-only:仅显示没有定义的符号(那些外部符号)。
    • –defined-only:仅显示定义的符号。
    • -l或–line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。
    • -V或–version:显示nm的版本号。
    • –help:显示nm的选项。
  • 相关阅读:
    Oracle 用 sqlprompt 修改 sqlplus 提示符
    Oracle cursor pin S wait on X 等待事件 说明
    Oracle 利用 rowid 提升 update 性能
    Oracle 从缓存里面查找真实的执行计划
    Linux 进程状态 说明
    Oracle 用户 对 表空间 配额(quota ) 说明
    Upon startup of Linux database get ORA27102: out of memory LinuxX86_64 Error: 28: No space left on device
    异常宕机 Ora00600 [Kccpb_sanity_check_2] 错误解决方法
    Oracle ORA04031 错误 说明
    Oracle Shared pool 详解
  • 原文地址:https://www.cnblogs.com/shanyu20/p/10953583.html
Copyright © 2011-2022 走看看