20191218 2021-2022-1-diocs-OpenEuler中C语言中的函数调用测试
在X86_64架构下实践2.4中的内容
环境:Kali Linux Debian 10.x 64
1. 32位GCC中的运行时堆栈使用情况
-
编写main.c、sub.c
-
编译运行
-
使用
gcc -m32 -g src/main.c src/sub.c -o test
指令产生32位汇编,然后使用gdb test
指令进入gdb调试器
-
在main函数处设置断点,run
-
disass(disassemble)
-
i(info) r(registers)
观察信息,可知在地址0x0x565561ce
和0x565561d1
u和v被压入栈中
于是u和v在栈中的地址为
2. longjump -
编写代码,并编译运行
-
运行结果
-
分析堆栈变化
生成调试文件
进入gdb,设置断点并运行
-
diass
-
i r
3. 64位GCC中的运行时堆栈使用情况
-
生成64位t.s汇编文件
-
查看堆栈变化
生成调试文件
disass和i r
-
arm64架构逻辑框图
ARM64平台上的栈帧寄存器是FP,它记录的是一个函数执行过程中的栈顶(FP=SP),并且把父函数的FP保存在堆栈的栈顶,以便于回溯