未被LC_SYMTAB引用的nm输出符号来源及复现疑问
解析系统
nm输出的特殊符号来源 你遇到的这些特殊符号,其实是系统nm工具额外解析了Mach-O文件里的非符号表信息,以及处理了苹果的符号脱敏机制导致的,下面分两部分详细解释:
一、Objective-C方法符号(如-[_TtC8sharingd19SDAirDropHandlerIPA canHandleTransfer])
这些带_Tt前缀的符号是Objective-C类与方法元数据组合生成的符号,系统nm会主动解析Mach-O里的Objective-C Runtime相关段(比如__objc_class、__objc_methname、__objc_methlist等),而非仅依赖LC_SYMTAB符号表:
_TtC是Objective-C的类型编码前缀,代表“Class”,后面的数字是类名的长度,接着是具体类名(比如8sharingd就是长度为8的sharingd,19SDAirDropHandlerIPA是长度19的类名)。- 系统
nm会把类名和对应的方法名(从__objc_methname段读取)拼接成-[类名 方法名]的标准Objective-C方法符号格式,而这些完整的符号字符串并不会直接存放在LC_SYMTAB引用的符号表中——这就是你看到字符串表只有零散片段的原因。
二、<redacted function xxx>符号
这类符号是苹果对系统二进制文件做的符号脱敏(Redaction)处理:
- 系统自带的二进制(比如
sharingd)会被苹果移除部分敏感符号的字符串,但LC_DYSYMTAB(动态符号表加载命令)里的符号计数等元信息仍会保留。 - 系统
nm检测到“符号表计数存在但对应字符串缺失”的情况时,会自动生成<redacted function xxx>这类占位符,提示用户该位置原本存在符号但已被脱敏,所以你在Mach-O文件里完全找不到这些符号的痕迹。
对应你确认的三点补充说明
- 字符串表的零散部分:正是组成Objective-C类名、方法名的独立字符串,
nm通过解析Objective-C Runtime的结构体(比如objc_method)将它们拼接成完整的方法符号。 <redacted>符号不存在:因为它们是nm自己生成的占位符,并非文件里原本就有的符号数据。- 未被
LC_SYMTAB引用:这些符号要么来自Objective-C的元数据段,要么是nm根据LC_DYSYMTAB的信息推断生成的,自然不会出现在LC_SYMTAB指向的符号表中。
如果要在你的自定义nm实现里复现这些行为,需要:
- 增加对Objective-C Runtime相关段和结构体的解析逻辑,拼接生成类/方法符号。
- 对比
LC_SYMTAB和LC_DYSYMTAB的符号数量,处理符号缺失的情况,生成脱敏占位符。
内容的提问来源于stack exchange,提问作者GrandChaman
相关产品推荐
相关产品推荐

