将空文件提供给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 runtime documentation,该标题在“标准元数据”标题中列出了非常相似的符号:
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标准库时,为什么只包括其中一些符号?