Linux 命令(1)—— nm 命令

本文详细介绍了nm命令的使用方法,包括其基本功能、命令选项、常用示例及输出结果的解读。nm命令主要用于查看文件中的符号信息,适用于库文件、目标文件和可执行文件等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、命令简介

nm是names的缩写, nm命令主要是用来查看文件中的符号信息。可以查看的文件包括:库文件、目标文件(main.o)、可执行文件等。

二、使用方法

nm [-option] file      ##	如果未指定文件名,默认为a.out。

三、命令选项

[-a|--debug-syms]		##	这将会把调试符号也列出来。默认状态下调试符号不会被列出。
[-g|--extern-only] 		##	只显示外部符号
[-B] [-C|--demangle[=style]] 
[-D|--dynamic] 
[-S|--print-size] 
[-s|--print-armap] 
[-A|-o|--print-file-name] 	##	列出符号名的时候同时显示来自于哪个文件,这在同时列出多个文件(比如一个链接库)的符号时比较有用
[-n|-v|--numeric-sort]		##	根据符号的地址来排序	默认是按符号名称的字母顺序排序的
[-p|--no-sort] 
[-r|--reverse-sort] [--size-sort] 
[-u|--undefined-only] 		##	只显示未定义的符号
[-t radix|--radix=radix] 	##	符号值得进制。d 十进制, o 八进制, x 十六进制.
[-P|--portability] 
[--target=bfdname] 
[-fformat|--format=format] 	 ##	 输出的格式,有"bsd","sysv" 或"posix"可选。默认是“bsd”
[--defined-only] 			##	只显示已定义的符号.
[-l|--line-numbers] 		##	列出符号在源代码中对应的行号	指定这个参数后,nm将利用调试信息找出文件名以及符号的行号。对于一个已定义符号,将会找出这个符号定义的行号,对于未定义符号,显示为空
[--no-demangle] 			##	demangle 的中文含义是“解构,还原函数”。符号解析(symbol demangling)
                            ##  mangle 的中文含义是“破坏,撕裂”。在编译过程中,会破坏原来的格式,变为一种不利于人类阅读的格式。该过程即为“mangle”。
[-V|--version] 
[-X 32_64] 
[--help]  
[objfile...]  

四、常用示例

## 1、查看动态库中是否包含 FuncA 函数
nm lib_tst.so | grep -i "FuncA"

五、其它

1、输出结果:

              U dyld_stub_binder
                 U _objc_storeStrong
                 U _objc_retainAutoreleasedReturnValue
                 U _objc_retain
                 U _objc_release
                 U _objc_msgSend
                 U _objc_autoreleaseReturnValue
0000000000007cf8 T _checkName
                 U __objc_empty_cache
                 U ___CFConstantStringClassReference
00000000000084d8 S _OBJC_METACLASS_$_WillExistModel
                 U _OBJC_METACLASS_$_NSObject
00000000000083e8 S _OBJC_METACLASS_$_Module1
0000000000008438 S _OBJC_METACLASS_$_ExistModel3
0000000000008398 S _OBJC_METACLASS_$_ExistModel2
0000000000008488 S _OBJC_METACLASS_$_ExistModel1
0000000000008500 S _OBJC_CLASS_$_WillExistModel
                 U _OBJC_CLASS_$_NSString
                 U _OBJC_CLASS_$_NSObject
0000000000008410 S _OBJC_CLASS_$_Module1
0000000000008460 S _OBJC_CLASS_$_ExistModel3
00000000000083c0 S _OBJC_CLASS_$_ExistModel2
00000000000084b0 S _OBJC_CLASS_$_ExistModel1
                 U _NSStringFromSelector
0000000000007f80 S _MTG_Module1VersionString
0000000000007fb0 S _MTG_Module1VersionNumber
0000000000007d54 t -[Module1 moduleStyle1:]

  nm命令的输出包含三个部分:

  1. 符号值。默认显示十六进制,也可以指定其它进制;
  2. 符号类型。小写表示是本地符号,大写表示全局符号(external);
  3. 符号名称。

2、符号类型:

A:  符号值是绝对的。在进一步的连接中,不会被改变。
B:  符号位于未初始化数据段(known as BSS).
C:  共用(common)符号. 共用符号是未初始化的数据。在连接时,多个共用符号可能采用一个同样的名字,如果这个符号在某个地方被定义,共用符号被认为是未定义的引用.
D:  已初始化数据段的符号
G:  已初始化数据段中的小目标(small objective)符号. 一些目标文件格式允许更有效的访问小目标数据,比如一个全局的int变量相对于一个大的全局数组。
I:  其他符号的直接应用,这是GNU扩展的,很少用了.
N:  调试符号.
R:  只读数据段符号.
S:  未初始化数据段中的小目标(small object)符号.
T:  代码段的符号.
U:  未定义符号.
V:  弱对象(weak object)符号. 当一个已定义的弱符号被连接到一个普通定义符号,普通定义符号可以正常使用,当一个未定义的弱对象被连接到一个未定义的符号,弱符号的值为0.
W:  一个没有被指定一个弱对象符号的弱符号(weak symbol)。
-:  a.out目标文件中的刺符号(stabs symbol). 这种情况下,打印的下一个值是其他字段,描述字段,和类型。刺符号用于保留调试信息.
?:  未知符号类型,或者目标文件特有的符号类型.

### PyCharm 打开文件显示全的解决方案 当遇到PyCharm打开文件显示全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值