nm

nm命令显示关于指定文件中符号的信息,文件可以是对象文件、可执行文件或对象文件库。如果文件没有包含符号信息,nm命令报告该情况,但不把它解释为出错条件。nm命令缺省情况下报告十进制符号表示法下的数字值。

语法

Usage: nm [option(s)] [file(s)]

参数

-a, --debug-syms:显示所有的符号,包括debugger-only symbols
-A, --print-file-name:每行或者显示完整路径名或者显示对象库名。
-B,--format=bsd:在 Berkeley 软件分发 (BSD) 格式中显示输出:
-C, --demangle[=STYLE]:将低级符号名解析(demangle)成用户级名字。这样可以使得C++函数名具有可读性。
--no-demangle:默认的选项,不需要将低级符号名解析成用户级名。
-D, --dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。
--defined-only:仅显示定义的符号。
-e:只显示静态的和外部的(全局)符号。
-f, --format=FORMAT:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。
-g, --extern-only:仅显示外部符号。
-l, --line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。
-n, --numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。
-o:Same as -A
-p, --no-sort:按目标文件中遇到的符号顺序显示,不排序。
-P, --portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。
-r, --reverse-sort:反转排序的顺序(例如,升序变为降序)。
-s, --print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些??榘男┟值挠成洹?br> --size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。
--target=BFDNAME:指定一个目标代码的格式,而非使用系统的默认格式。
-u, --undefined-only:仅显示没有定义的符号(那些外部符号)。
-h, --help:帮助信息
-V, --version:版本信息

符号说明

对于每一个符号来说,其类型如果是小写的,则表明该符号是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中。
  • 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.
  • ? 该符号类型没有定义。

使用

1.寻找特殊标识
有时会碰到一个编译了但没有链接的代码,那是因为它缺失了标识符;这种情况,可以用nm和objdump、readelf命令来查看程序的符号表;所有这些命令做的工作基本一样;
比如连接器报错有未定义的标识符;大多数情况下,会发生在库的缺失或企图链接一个错误版本的库的时候;浏览目标代码来寻找一个特殊标识符的引用:

nm -uCA *.o

-u选项限制了每个目标文件中未定义标识符的输出。-A选项用于显示每个标识符的文件名信息;对于C++代码,常用的还有-C选项,它也为解码这些标识符;

objdump、readelf命令可以完成同样的任务。等效命令为:objdump -t,readelf -s

2.列出 a.out 对象文件的静态和外部符

nm -e a.out
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • 一 常用脚本 1 打包脚本 脚本如下,下面附上ar 和 ranlib命令参考(命令来自于网络) 2 更新静态库 使...
    火星来的农民阅读 12,804评论 0 4
  • nm命令 这个命令列出目标文件的符号。如果没有指定目标文件,默认是a.out。 命令参数 输出格式 nm命令的输出...
    visual_阅读 5,480评论 0 3
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,791评论 0 27
  • 一、简介 目前ios制作对外输出的动态库,静态库越来越方便,伴随而来的问题也也越来越少,本次就打包Framewor...
    piao152阅读 7,265评论 0 4
  • 能享受最好的,也能承受最坏的。阳光下像个孩子,风雨里像个大人。知世故而不世故,会讲究也能讲。未必同意对方的观点,但...
    金鹰女神阅读 304评论 0 0