首页 > 解决方案 > Swift 标准库中如何使用元数据符号?

问题描述

当向 Swift 编译器提供一个空文件时,它只会生成几个相当明显的符号:

echo '' > test.swift
swiftc -c -parse-as-library -o test.o ./test.swift
nm test.o

打印这个:

0000000000000000 S ___swift_reflection_version
0000000000000002 s l_llvm.swift_module_hash

但是当我们尝试将这个空文件编译为 Swift 标准库时,会自动添加更多名称难以理解的符号:

swiftc -c -parse-as-library -parse-stdlib -module-name Swift -o test.o ./test.swift
nm test.o

打印这个:

000000000000006c s _$SBBMB
0000000000000030 s _$SBOMB
0000000000000044 s _$SBbMB
000000000000001c s _$SBoMB
0000000000000058 s _$SBpMB
0000000000000094 s _$SypXpMB
0000000000000080 s _$SyyXfMB
00000000000000a8 S ___swift_reflection_version
000000000000000c S _symbolic BB
0000000000000003 S _symbolic BO
0000000000000006 S _symbolic Bb
0000000000000000 S _symbolic Bo
0000000000000009 S _symbolic Bp
0000000000000014 S _symbolic ypXp
000000000000000f S _symbolic yyXf
00000000000000aa s l_llvm.swift_module_hash

进一步搜索会导致Swift 运行时文档,该文档在“标准元数据”标题中列出了非常相似的符号:

Swift 运行时导出内置类型的标准元数据对象以及标准值见证表,可以由具有通用布局属性的类型自由采用。请注意,与面向公众的类型不同,运行时不保证内置类型到元数据对象的 1:1 映射,并且将重用元数据对象来表示具有相同布局特征的内置。

根据该解释,下面是更长的符号列表:

000000000004faa8 S __TMBB
000000000004fab8 S __TMBO
000000000004f9f8 S __TMBb
000000000004f9c8 S __TMBi128_
000000000004f998 S __TMBi16_
000000000004f9d8 S __TMBi256_
000000000004f9a8 S __TMBi32_
000000000004f9b8 S __TMBi64_
000000000004f988 S __TMBi8_
000000000004f9e8 S __TMBo
000000000004fac8 S __TMT_
000000000004f568 S __TWVBO
000000000004f4b0 S __TWVBb
000000000004f0a8 S __TWVBi128_
000000000004eec8 S __TWVBi16_
000000000004f148 S __TWVBi256_
000000000004ef68 S __TWVBi32_
000000000004f008 S __TWVBi64_
000000000004ee28 S __TWVBi8_
000000000004f1e8 S __TWVBo
000000000004f778 S __TWVFT_T_
000000000004f3f8 S __TWVMBo
000000000004f8e8 S __TWVT_
000000000004f830 S __TWVXfT_T_
000000000004f620 S __TWVXoBO
000000000004f2a0 S __TWVXoBo
000000000004f6d8 S __TWVXwGSqBO_
000000000004f358 S __TWVXwGSqBo_

这仍然不能解释每个符号的含义,它们是如何使用的以及为什么它们有这些短名称?有人能找到更多关于这些符号的公共文档吗?为什么在将空文件编译为 Swift 标准库时只包含其中一些符号?

标签: swiftmetadatallvmexecutablenm

解决方案


推荐阅读