3

我正在查看一些 x86_64 代码与 Apple 的otool. 这是反汇编的示例,由以下内容输出otool

0000000100055de4    movq    $0x00000000,%rax

只有该偏移量中的最后 4 个字节00055de4, 表示该指令的文件地址。我可以打开一个十六进制编辑器并导航到那里0x55de4movq指令就在那里。

但是,我注意到 gdb 仅在地址中包含所有 8 个字节时才有效,包括神秘的1. break *0x0000000100055de4按预期工作,而break *0x00055de4从不触发。

我分析过的每个 64 位二进制文​​件都otool显示了这种模式。它显然不适用于 32 位地址。

那么,如果是实际地址,0x55de4为什么要使用?otoolgdb0x0000000100055de4

4

1 回答 1

1

__PAGEZERO,64 位 Mach-O 二进制文件中的第一个加载命令,指定虚拟内存中的段大小为 0x100000000。

$ otool -lV二进制

command 0
      cmd LC_SEGMENT_64
  cmdsize 72
  segname __PAGEZERO
   vmaddr 0x0000000000000000
   vmsize 0x0000000100000000

当你这样做时,break *0x00055de4你的断点最终会出现在这段零中,这就解释了为什么它永远不会被命中。0x0000000100055de4是加载到虚拟内存时指令的地址(在二进制文件中的 0x55de4 处)。

对于 32 位二进制文​​件,__PAGEZERO 大小为 0x1000,这解释了为什么该模式不适用。

于 2014-03-28T16:07:46.707 回答