【发布时间】:2015-12-13 16:27:18
【问题描述】:
正在解析内存中已经加载的 Mach-O 二进制文件...
有时字符串表、符号表等是它们应该在的位置,有时它们是 0x1000 关闭。
例如,我可能运行我的程序并且baseOffset + cmd->symoff 是准确的。然后我会进行单元测试,baseOffset + cmd->symoff + 0x1000 是准确的。 baseOffset 始终有效并指向有效的马赫标头。
【问题讨论】:
正在解析内存中已经加载的 Mach-O 二进制文件...
有时字符串表、符号表等是它们应该在的位置,有时它们是 0x1000 关闭。
例如,我可能运行我的程序并且baseOffset + cmd->symoff 是准确的。然后我会进行单元测试,baseOffset + cmd->symoff + 0x1000 是准确的。 baseOffset 始终有效并指向有效的马赫标头。
【问题讨论】:
我是通过查看 dyld 源代码发现的...
不保证关闭 0x1000,但是,链接编辑偏移量是:
baseImageOffset + linkedit.vmaddr - linkedit.fileoff。大多数情况下,这个差值为 0,但有时不是。
这会影响 LC_FUNCTION_STARTS (cmd->dataoff) 和 LC_SYMTAB (cmd->stroff 和 cmd->symoff)
【讨论】:
_dyld_get_image_vmaddr_slide(如果是self,0),您将获得要应用的偏移量。作为参考,它可能超过 0x1000。原因很简单:.bss 在运行时被扩展,并且通常在你的 header 和你的 symtab / strtab 之间。我相信,确切的数量是展开后的.bss 的大小四舍五入到一页的倍数。