ARM64架构M1 Mac调试C文件时,GDB能否切换为x86指令集?
关于GDB在M1上切换汇编助记符的问题
不能直接将GDB显示的ARM64助记符切换为x86助记符,核心原因和说明如下:
- 你的M1 MacBook是ARM64架构,默认编译的C程序会生成ARM64机器码,GDB的反汇编结果必须与程序的目标架构匹配——ARM64机器码只能对应ARM64的汇编助记符,x86和ARM的指令集完全不兼容,不存在把ARM机器码转译成x86助记符的功能。
- GDB的反汇编逻辑是根据程序的Mach-O文件头识别架构,然后调用对应架构的反汇编器,没有设置可以强制切换成其他架构的助记符。
如果确实想调试显示x86汇编的程序,你可以:
- 编译时添加
-arch x86_64参数,生成x86_64架构的可执行文件(依赖Mac的Rosetta 2转译运行); - 使用支持x86_64的GDB版本调试该程序,此时反汇编就会显示x86的助记符。
你当前调试的ARM64程序反汇编结果:
(gdb) disas main Dump of assembler code for function main: 0x0000000100003f44 <+0>: sub sp, sp, #0x30 0x0000000100003f48 <+4>: stp x29, x30, [sp, #32] 0x0000000100003f4c <+8>: add x29, sp, #0x20 0x0000000100003f50 <+12>: mov w8, #0x0 // #0 0x0000000100003f54 <+16>: str w8, [sp, #12] 0x0000000100003f58 <+20>: stur wzr, [x29, #-4] 0x0000000100003f5c <+24>: mov w8, #0xf // #15 0x0000000100003f60 <+28>: stur w8, [x29, #-8] 0x0000000100003f64 <+32>: mov w8, #0xc // #12 0x0000000100003f68 <+36>: stur w8, [x29, #-12] 0x0000000100003f6c <+40>: ldur w8, [x29, #-8] 0x0000000100003f70 <+44>: ldur w9, [x29, #-12] 0x0000000100003f74 <+48>: add w8, w8, w9 0x0000000100003f78 <+52>: str w8, [sp, #16] 0x0000000100003f7c <+56>: ldr w9, [sp, #16] 0x0000000100003f80 <+60>: mov x8, x9 0x0000000100003f84 <+64>: mov x9, sp 0x0000000100003f88 <+68>: str x8, [x9] 0x0000000100003f8c <+72>: adrp x0, 0x100003000 0x0000000100003f90 <+76>: add x0, x0, #0xfb4 0x0000000100003f94 <+80>: bl 0x100003fa8 0x0000000100003f98 <+84>: ldr w0, [sp, #12] 0x0000000100003f9c <+88>: ldp x29, x30, [sp, #32] 0x0000000100003fa0 <+92>: add sp, sp, #0x30 0x0000000100003fa4 <+96>: ret End of assembler dump.
内容的提问来源于stack exchange,提问作者viigoor
相关产品推荐
相关产品推荐

