GCC之CFI
CFI(calling frame info)的作用是出现异常时stack的回滚(unwind)
而回滚的过程是一级级CFA往上回退,直到异常被catch。
DWARF4标准的section 6.4:
The call frame is identified by an address on the stack. We refer to this address as the Canonical Frame Address orCFA. Typically, the CFA is defined to be the value of the stack pointer at the call site in the previous frame (which may be different from its value on entry to the current frame).
即CFA定义为执行call xxx时SP(stack pointer)所指向的地址。
pushl %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8
表示执行完pushl %ebp后SP与CFA偏了8字节(4字节return address,4字节ebp)
movl %esp, %ebp.cfi_def_cfa_register 5
表示执行完movl %esp, %ebp后cfa_register不再是esp,而是ebp
leave.cfi_restore 5.cfi_def_cfa 4, 4
表示执行完leave后ebp的值已经恢复到初始状态,并且CFA的计算方式应该是esp+4
其中寄存器对应的数字是架构相关的,详细参考xxx_map_dwarf_register:
参考:
Dwarf2 Exception Handler HOWTO
都是英文版的,可以下载谷歌浏览器,查看时翻译,正确率很高够用。
转自:
https://blog.csdn.net/jtli_embeddedcv/article/details/9321253
GCC之CFI的更多相关文章
- GCC栈溢出保护
逆向过elf程序都知道,GCC的canary,x86_64下从fs:0x28偏移处获取,32位下从gs:0x14偏移处获取.但知道canary如何产生,为什么在这里取的人比较少. 下面以x86_64平 ...
- VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%
1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...
- GCC学习(1)之MinGW使用
GCC学习(1)之MinGW使用 因为后续打算分享一些有关GCC的使用心得的文章,就把此篇当作一个小预热,依此来了解下使用GNU工具链(gcc.gdb.make等)在脱离IDE的情况下如何开发以及涉及 ...
- 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码
不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...
- [异常解决] How to build a gcc toolchain for nRF51 on linux (very detailed!!!)
1.Install gcc-arm-none-eabi https://devzone.nordicsemi.com/tutorials/7/This link shows that developm ...
- CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
---恢复内容开始--- CentOS 6.6 升级GCC G++ (当前最新GCC/G++版本为v6.1.0) 没有便捷方式, yum update.... yum install 或者 添加y ...
- GCC 预处理、编译、汇编、链接..
1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ...
- 用gcc进行程序的编译
在Linux系统上,一个档案能不能被执行看的是有没有可执行的那个权限(x),不过,Linux系统上真正认识的可执行文件其实是二进制文件(binary program),例如/usr/bin/passw ...
- gcc/linux内核中likely、unlikely和__attribute__(section(""))属性
查看linux内核源码,你会发现有很多if (likely(""))...及if (unlikely(""))...语句,这些语句其实是编译器的一种优化方式,具 ...
随机推荐
- Microsoft Azure Overview
Day1 Overview 1. Cloud - Internet scaling / Internet connects / Resource pool 2. Why the cloud? Rap ...
- 魔术矩阵Java代码
//该魔术矩阵默认从右上角45度递增 //@漫流——595128841在qq点com //import java.util.Arrays; //用于打印API函数 public class 魔方矩阵 ...
- zencart后台订单详细页显示产品图片和链接
方法一: 找到admin/order.php 大约491行 for ($i=0, $n=sizeof($order->products); $i<$n; $i++) { 与 if (iss ...
- linux线程的实现(转)
原文:https://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一 ...
- PrimeFaces ab function
The PrimeFaces.ab function is a shortcut function for PrimeFaces.ajax.AjaxRequest. //ajax shortcut a ...
- u-boot log_init函数分析
log_init, int log_init(void){ struct log_driver *drv = ll_entry_start(struct log_driver, log_driv ...
- javaweb 项目编码格式设置
- JAVA中的23种设计模式
http://blog.csdn.net/chmask/article/details/2631485 http://www.cnblogs.com/hnrainll/archive/2011/12/ ...
- java——HttpClient 代理模式发送Http Https
在setProxy()方法中设置代理IP后可以将url中的域名换成这个代理IP. http很简单,但是https这样会报错. 问题:如何使用代理发送https请求? 客户端发送https请求之前会先向 ...
- python 面向对象_3
析构函数:实例被销毁时候自动调用的方法,(例如关闭数据库,可以将关闭数据库的代码写到析构函数里) class Person: def __init__(self): print('构造函数') def ...