【问题标题】:Why are the first 4 bytes of 64-bit addresses printed as 0x00000001?为什么 64 位地址的前 4 个字节打印为 0x00000001?
【发布时间】:2013-05-08 16:09:00
【问题描述】:

我正在使用 Apple 的 otool 反汇编一些 x86_64 代码。这是otool输出的反汇编示例:

0000000100055de4    movq    $0x00000000,%rax

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

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

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

那么,如果0x55de4 是实际地址,为什么otoolgdb 使用0x0000000100055de4

【问题讨论】:

    标签: macos 64-bit offset memory-address otool


    【解决方案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-05-30
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 2018-03-12
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多