我正在尝试为包含在 dSYM 文件中的 mach-o 文件编写一个简单的解析器。当我在十六进制编辑器(TextWrangler 上的 Hex Fiend 或 Hex 转储)上打开文件时。我看到这样的东西。
CEFAEDFE 0C000000 0B000000 0A000000 07000000 3C0D0000
00000000 1B000000 18000000 A04EF320 E8603B93 AB88123C
06AC3E9B ...
第一个值CEFAEDFE
只是FEEDFACE
倒数,即MH_MAGIC
数字。实际上,这是MH_CIGMA
因为它是倒退的。这让我觉得其余的信息是小端的:首先是最低有效字节。在 的情况下0xFEEDFACE
,最低有效字节是0xCE
,这是我上面示例中的第一个字节,然后是其余字节。
所以我继续检查其余的整数(4 个字节)。在重新排列它们以使其格式正确后(即 0C000000 变为 0000000C),我们有:
0000000C 是 CPU 类型,即 CPU_TYPE_ARM
0000000B 是 CPU 子类型,即 CPU_SUBTYPE_ARM_V7S
0000000A 是 MH_DSYM 的文件类型
00000007 是加载命令的数量
00000D3C 是加载命令占用的字节数
00000000 是标志(没有标志)
0000001B是加载命令LC_UUID,表示这个LC包含UUID
00000018 加载命令的大小,即 0x18 = 24 字节(命令 [4 字节] + 大小 [4 字节] + UUID [16 字节])
现在这就是它变得奇怪的地方,也是我的问题所在。
由于信息是小端的,我认为 UUID(以下 16 个字节)应该像这样“向后”重新排列:9B3EAC06-3C1288AB-933B60E8-20F34EA0。但是,当我dwarfdump
用来获取 UUID ( dwarfdump --uuid TestApp.app.dSYM/
) 时,我得到了这个:
UUID: A04EF320-E860-3B93-AB88-123C06AC3E9B (armv7s) TestApp.app.dSYM/Contents/Resources/DWARF/TestApp
为什么这是大端顺序?为什么它的打印dwarfdump
顺序与我在 Hex Fiend 中看到的字节顺序相同?
我错过了什么?
提前感谢您的帮助或建议。