# debug
可以使用 qemu 的 - g 指定端口
$ qemu-aarch64 -g 1234 -L /usr/aarch64-linux-gnu ./apollo |
然后使用 gdb-multiarch 进行调试,先指定架构,然后使用 remote 功能
在另外一个终端(上一个你也用不了)打开 gdb -multiarch
$ gdb-multiarch ./apollo -q |
然后连接到端口进行远程调试
gdb-peda$ set architecture aarch64 | |
The target architecture is assumed to be aarch64 | |
gdb-peda$ target remote localhost:1234 | |
Remote debugging using localhost:1234 |
# ARM
# RISC-V
name | ABI 助记符 | 用途 |
---|---|---|
x0 | zero | zero |
x1 | ra | 返回地址 |
x2 | sp | 栈指针 |
x3 | gp | 全局指针 |
x4 | tp | 线程指针 |
x5-x7 | t0-t2 | 临时寄存器 |
x8-x9 | s0-s1 | callee 保存的寄存器 |
x10-x17 | a0-a7 | 参数寄存器 |
x18-27 | s2-s11 | callee 保存的寄存器 |
x28-x31 | t3-t6 | 临时寄存器 |
在参数保存之后,通过 jal
指令跳转到函数开始执行。jal 指令的规范为:
jal ra, offset
将会把下一条指令 (pc+4) 地址存放到 ra 寄存器中,然后跳转到当前地址 + offset 位置开始执行。
在子函数中,将会把 ra 寄存器存放到栈上,在函数返回时从栈上恢复 ra 寄存器,这里也就 存在栈溢出的机会
。