20191218 2021-2022-1-diocs-OpenEuler中C语言中的函数调用测试

在X86_64架构下实践2.4中的内容

环境:Kali Linux Debian 10.x 64
1. 32位GCC中的运行时堆栈使用情况

  • 编写main.c、sub.c
    OpenEuler中C语言中的函数调用测试

  • 编译运行
    OpenEuler中C语言中的函数调用测试
    OpenEuler中C语言中的函数调用测试

  • 使用gcc -m32 -g src/main.c src/sub.c -o test指令产生32位汇编,然后使用gdb test指令进入gdb调试器
    OpenEuler中C语言中的函数调用测试
    OpenEuler中C语言中的函数调用测试

  • 在main函数处设置断点,run
    OpenEuler中C语言中的函数调用测试

  • disass(disassemble)
    OpenEuler中C语言中的函数调用测试

  • i(info) r(registers)
    OpenEuler中C语言中的函数调用测试
    观察信息,可知在地址0x0x565561ce0x565561d1u和v被压入栈中
    OpenEuler中C语言中的函数调用测试
    于是u和v在栈中的地址为
    OpenEuler中C语言中的函数调用测试
    2. longjump

  • 编写代码,并编译运行
    OpenEuler中C语言中的函数调用测试

  • 运行结果
    OpenEuler中C语言中的函数调用测试

  • 分析堆栈变化
    生成调试文件
    OpenEuler中C语言中的函数调用测试
    进入gdb,设置断点并运行
    OpenEuler中C语言中的函数调用测试

  • diass
    OpenEuler中C语言中的函数调用测试

  • i r
    OpenEuler中C语言中的函数调用测试

3. 64位GCC中的运行时堆栈使用情况

  • 生成64位t.s汇编文件
    OpenEuler中C语言中的函数调用测试

  • 查看堆栈变化
    生成调试文件
    OpenEuler中C语言中的函数调用测试
    disass和i r
    OpenEuler中C语言中的函数调用测试
    OpenEuler中C语言中的函数调用测试
    OpenEuler中C语言中的函数调用测试

  • arm64架构逻辑框图

OpenEuler中C语言中的函数调用测试

ARM64平台上的栈帧寄存器是FP,它记录的是一个函数执行过程中的栈顶(FP=SP),并且把父函数的FP保存在堆栈的栈顶,以便于回溯

相关文章:

  • 2021-11-07
  • 2021-10-30
  • 2021-07-13
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-20
猜你喜欢
  • 2021-11-03
  • 2021-11-09
  • 2021-08-19
  • 2021-09-17
  • 2021-10-19
相关资源
相似解决方案