DwarfCie
Description
Decoded CIE record (the parts we care about). Strings point into the section bytes and are valid for the parsed DwarfCfi’s lifetime.
Usage example (Cross-references)
Usage examples (Cross-references)
- In
Dwarf.h:152:
const u8 *initial_instructions;
u64 initial_instructions_size;
} DwarfCie;
///
- In
Dwarf.h:169:
} DwarfFde;
typedef Vec(DwarfCie) DwarfCies;
typedef Vec(DwarfFde) DwarfFdes;- In
Dwarf.h:224:
/// TAGS: Parser, DWARF, CFI, Lookup
///
const DwarfCie *DwarfCfiFindCie(const DwarfCfi *self, u64 cie_offset);
///
// ---------------------------------------------------------------------------
static bool parse_cie(BufIter *body, u64 cie_offset, DwarfCie *out) {
MemSet(out, 0, sizeof(*out));
out->offset = cie_offset; out->cie_offset = cie_offset;
const DwarfCie *cie = DwarfCfiFindCie(cfi, cie_offset);
if (!cie)
return false; if (id == cie_id) {
u64 cie_offset = (u64)(rec_start - section_data);
DwarfCie cie;
// Body iter starts just after the id field (since parse_cie
// doesn't re-read id) and spans the remainder of the record.
}
const DwarfCie *DwarfCfiFindCie(const DwarfCfi *self, u64 cie_offset) {
if (!self)
return NULL; } CfiVm;
static void cfi_vm_init(CfiVm *vm, const DwarfCie *cie, u64 fde_pc_begin, u8 ra_reg) {
MemSet(vm, 0, sizeof(*vm));
vm->row.return_address_register = ra_reg; return false;
}
const DwarfCie *cie = DwarfCfiFindCie(cfi, fde->cie_offset);
if (!cie)
return false; DwarfCfi cfi;
if (DwarfCfiBuildFromElf(&cfi, &elf, base)) {
const DwarfCie *cie = DwarfCfiFindCie(&cfi, 0);
ok = cie != NULL && cie->version == 1 && cie->has_augmentation == 1 && cie->offset == 0 &&
cie->fde_pointer_encoding == 0x03 && cfi.eh_frame_addr == EH_SECTION_VADDR;
Last updated on