gpt4 book ai didi

macos - 为什么64位地址的前4个字节打印成0x00000001?

转载 作者:行者123 更新时间:2023-12-02 03:46:55 27 4
gpt4 key购买 nike

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

0000000100055de4    movq    $0x00000000,%rax

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

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

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

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

最佳答案

__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,这解释了为什么该模式不适用。

关于macos - 为什么64位地址的前4个字节打印成0x00000001?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16445302/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com