【Linux】nm命令|查看动态库包含的函数符号
admin
2024-05-19 16:41:55
0

目录

0、前言

1、nm简介

2、nm命令用法和参数说明

3、nm用法和结果说明

4、nm 提示 no symbol 的问题(strip)


0、前言

下文1-3 摘抄自:Linux nm命令详解_https://blog.csdn.net/qq_36393978/article/details/124104635

1、nm简介

nm来源于name的简写。

该命令用来列出指定文件中的符号信息(如常用的函数名、变量等,以及这些符号存储的区域)。nm缺省情况下报告十进制符号表示法下的数字值。

2、nm命令用法和参数说明


nm命令可选参数如下:

nm [-A|-o|--print-file-name] [-a|--debug-syms]
   [-B|--format=bsd] [-C|--demangle[=style]]
   [-D|--dynamic] [-fformat|--format=format]
   [-g|--extern-only] [-h|--help]
   [-l|--line-numbers] [--inlines]
   [-n|-v|--numeric-sort]
   [-P|--portability] [-p|--no-sort]
   [-r|--reverse-sort] [-S|--print-size]
   [-s|--print-armap] [-t radix|--radix=radix]
   [-u|--undefined-only] [-V|--version]
   [-X 32_64] [--defined-only] [--no-demangle]
   [--plugin name]
   [--no-recurse-limit|--recurse-limit]]
   [--size-sort] [--special-syms]
   [--synthetic] [--with-symbol-versions] [--target=bfdname]
   [objfile...]

参数说明:

-A/-o/–print-file-name: 在输出时加上文件名;
-a/–debug-syms: 输出所有符号,包含debugger-only symbols;
-B/–format=bsd: BSD码显示,兼容MIPS nm;
-C/–demangle: 将低级符号名解析为用户级名字,可以使得C++函数名更具可读性;
-D/–dynamic: 显示动态符号。该选项只对动态目标(如特定类型的共享库)有意义;
-f format/–format=format 使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd
-g/–extern-only: 只显示外部符号;
-l/–line-numbers: 对于每个符号,使用debug信息找到文件名和行号;
-n/-v/–numeric-sort: 按符号对应地址的顺序排序,而非按符号名字字符顺序排序;
-P/–portability: 按照POSIX2.0标准格式输出,等同于使用 -f posix;
-p/–no-sort: 按照目标文件中遇到的符号顺序显示,不排序;
-r/–reverse-sort: 反转排序;
-s/–print-armap: 当列出库成员符号时,包含索引。索引的内容:模块和其包含名字的映射;
-u/–undefined-only: 只显示未定义符号;
–defined-only: 只显示定义了的符号。

3、nm用法和结果说明

$ nm  a.out


0000000000004010 B __bss_start
0000000000004010 b completed.8061
                 w __cxa_finalize@@GLIBC_2.2.5
0000000000004000 D __data_start
0000000000004000 W data_start
00000000000010d0 t deregister_tm_clones
0000000000001140 t __do_global_dtors_aux
0000000000003db0 d __do_global_dtors_aux_fini_array_entry
0000000000004008 D __dso_handle
0000000000003db8 d _DYNAMIC
0000000000004010 D _edata
0000000000004018 B _end
0000000000001378 T _fini
0000000000001180 t frame_dummy
0000000000003da8 d __frame_dummy_init_array_entry
00000000000021e4 r __FRAME_END__
0000000000001189 T func
0000000000001198 T func1
0000000000003fa8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
000000000000204c r __GNU_EH_FRAME_HDR
0000000000001000 t _init
0000000000003db0 d __init_array_end
0000000000003da8 d __init_array_start
0000000000002000 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000001370 T __libc_csu_fini
0000000000001300 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
00000000000011a8 T main
                 U printf@@GLIBC_2.2.5
                 U puts@@GLIBC_2.2.5
0000000000001100 t register_tm_clones
                 U __stack_chk_fail@@GLIBC_2.4
00000000000010a0 T _start
0000000000004010 D __TMC_END__
 

结果说明 :

符号值-----------------符号----类型-符号名

0000000000001370 T __libc_csu_fini

nm 显示内容:

• 符号值,由选项选择的基数(见下文),或默认为十六进制,如:0000000000001370

• 符号类型,如:T 。至少使用以下类型;其他的也取决于对象文件格式。如果是小写,符号通常是本地的;如果是大写,则符号是全局的(外部的)。然而,对于特殊的全局符号(“u”、“v”和“w”)显示了一些小写符号

符号类型有如下类型:

符号    描述
A         符号的值是绝对值,不会通过进一步的链接而改变。
B/b      符号在 BSS 数据段中。本节通常包含零初始化或未初始化的数据,尽管确切的行为取决于系统。
C        这个符号很常见。常用符号是未初始化的数据。链接时,多个常用符号可能以相同的名称出现。如果符号在任何地方定义,则常用符号被视为未定义的引用。
D/d    符号在初始化数据段中。
G/g    符号在小对象的初始化数据段中。一些目标文件格式允许更有效地访问小型数据对象,例如全局int变量,而不是大型全局数组。
i    对于PE格式文件,这表示符号位于特定于实现的部分中 DLL。对于ELF格式文件,这表明该符号是一个间接函数。这是一个GNU对标准ELF 符号类型集的扩展。它表示一个符号,如果被一个重定位不计算其地址,而是必须在运行时调用。运行时然后执行将返回要在重定位中使用的值。
I    该符号是对另一个符号的间接引用。
N    该符号是调试符号。
n    符号在只读数据段中。
p    符号在堆栈展开部分中。
R/r    该符号位于只读数据段中。
S/s    该符号在小对象的未初始化或零初始化数据段中。
T/t    符号在文本(代码)部分。
U    符号未定义。
u    该符号是唯一的全局符号。这是标准ELF符号集的GNU扩展绑定。对于这样的符号,动态链接器将确保在整个过程中只有一个具有此名称和类型的符号正在使用中。
V/v    符号是弱对象。当弱定义符号与正常定义符号链接时,使用正常定义的符号没有错误。当一个弱的未定义符号被链接并且该符号没有定义,弱符号的值变为零,没有错误。在某些系统上,大写表示已指定默认值。
W/w    该符号是一个弱符号,没有被专门标记为弱对象符号。当一个弱定义符号与正常定义符号链接,正常定义符号与没有错误。当一个弱的未定义符号被链接并且该符号未定义时,符号以系统特定的方式确定,没有错误。在某些系统上,大写表示已指定默认值。
-    该符号是a.out目标文件中的stabs符号。在这种情况下,打印的下一个值是stabs other字段、stabs desc字段和stab类型。刺符号用于保持调试信息。
?    符号类型未知,或目标文件格式为sp

4、nm 提示 no symbol 的问题(strip)

(摘自:https://blog.csdn.net/cjsycyl/article/details/37929971)

动态链接库文件是elf(Executable and Linkable Format)文件的一种,有两个符号表,“.symtab”和“.dynsym”。

“.dynsym”只保留“.symtab”中的全局符号(global symbols )。命令strip可以去掉elf文件中“.symtab”,但不会去掉“.dynsym”。

/lib里的共享对象库.so文件在使用nm时提示no symbol是因为被strip了。

所以需要查看动态符号表“.dynsym”,加上-D:

usr@usrpc:~$nm -Do /lib/*.so.*  类似的命令还有:readelf --symbols  *.so.* objdump -T *.so.*


 


 

相关内容

热门资讯

2025不夜重庆生活节暨丰都南... 仙境南天湖·度假新天地!7月11日晚,万众期待的2025不夜重庆生活节暨丰都南天湖第七届避暑音乐季在...
村上春树的1Q84目前有两本,... 村上春树的1Q84目前有两本,一共打算出几本?听说有第三本,打算一起买,就是不清楚到底有几本还有,书...
老挝中国文化中心举办首届“周末... 老挝中国文化中心12日举办“周末美食雅集”中国美食品鉴体验活动,老挝民众在中国烹饪技师指导下开启一场...
假如一个行星距地球一光年,那么... 假如一个行星距地球一光年,那么我们用望远镜看到的是这个星球一年前的状态.着么说对吗正确。光在宇宙中“...
郭敬明,韩寒,有什么书 郭敬明,韩寒,有什么书比较好看的,适合中学生适合中学生的话幻城/小时代 还不错韩寒的书都很现实不修...
求炼体术 基本的入门锻炼就行 求炼体术 基本的入门锻炼就行楼主来错地方了,现在知道乌烟瘴气,在这求练体术难啊,你不如去一些武术网站...
一览英才网的可信度高不高? 一览英才网的可信度高不高?都是假的,在上面求职都没人看,但是那个职位每隔半个月更新一次,估计是从别的...
中国历史阶段划分依据 中国历史阶段划分依据夏到1840古代1840-1949 近现代1949-今 当代
欧也妮的爱情和婚姻故事 欧也妮的爱情和婚姻故事只要大概经过就可以了~葛朗台吗?他好像吝啬的没有爱情会垂青他哎~~ouyeni...
猪猪侠之变身小英雄下一部是啥 猪猪侠之变身小英雄下一部是啥您好,猪猪侠之变身小英雄的下一部是猪猪侠之变身战队猪猪侠之变身战队猪猪侠...
中开头的成语接龙 中开头的成语接龙中庸之道 道不相谋 谋夫孔多 多方百计 计功行封 封豕长蛇 蛇口蜂针针头削铁 铁打心...
为什么红薯放久了甜? 为什么红薯放久了甜?刚购买回来的红薯通常比较新鲜,红薯表皮还有很多的水分,经过几天的晾晒以后,可以将...
求源范完结王道文,长文,短文,... 求源范完结王道文,长文,短文,甜文,虐文,新文都可以亲,源范的我不是很多哈,都发给你了,算是交流交流...
快穿系统:男神攻略手册 作者奂... 快穿系统:男神攻略手册 作者奂楚剑临宇 作者: 没落的雨鸽 简介: 万古之时,剑气可冲破九霄。剑气呼...
书的故事读后感小学生四年级两百... 书的故事读后感小学生四年级两百字以上书的故事读后感小学生四年级两百字以上《书的故事》是苏联作家伊林写...
卖东北饭包挣钱吗 卖东北饭包挣钱吗挣钱。1、特色美味。东北饭包的特色在于饭团内包裹的是肉馅和蔬菜等配料,口感丰富,营养...
古装武侠电视剧大全 古装武侠电视剧大全里面有一把剑叫辟魔剑神雕侠侣(古天乐版),张无忌,天龙八部(林志颖版)《风云争霸》...
"游览一些名胜古迹&... "游览一些名胜古迹"的英文怎么说?visit some places of interest,som...
现代教育的基本原则是什么? 现代教育的基本原则是什么?理论联系实际原则。把教学和生活、间接经验和直接经验、观点和材料结合起来。九...
幻城里雪后为什么有两个 幻城里雪后为什么有两个一个正的一个副的一个大一个小《幻城》中龚蓓苾 饰演的 冰后,是冰王的妻子,相当...