栈展开:从DWARF调用帧信息到栈展开器的实现
1. 解析与封装调用帧信息
首先,我们会解析 .eh_frame_hdr 部分,然后将数据封装在 sdb::call_frame_information 对象中。在 sdb::dwarf 的构造函数里调用 parse_call_frame_information 函数来初始化 CIE 映射:
sdb::dwarf::dwarf(const sdb::elf& parent) : elf_(&parent) {
compile_units_ = parse_compile_units(*this, parent);
cfi_ = parse_call_frame_information(*this);
}
2. DWARF调用帧信息概述
DWARF 调用帧信息本质上是一个巨大的表格。表格的每一行列出一个程序计数器值,该行中的规则告诉你当程序计数器的值处于该行地址与下一行程序计数器值(或者在表格最后一行的情况下,是匹配的 FDE 所代表范围的末尾)之间的非包含范围时,如何展开当前栈帧。表格行编码了两件事:当前栈帧开始时的规范帧地址(CFA),以及将寄存器恢复到当前函数立即返回给调用者时它们应有的值的规则。
例如,考虑以下构成函数序言的四条指令:
1149: endbr64
114d:
超级会员免费看
订阅专栏 解锁全文
764

被折叠的 条评论
为什么被折叠?



