DwarfCfi
Description
Parsed .eh_frame index. CIEs are de-duplicated; FDEs each point at their CIE by offset. eh_frame_base is the runtime address that pc-relative encodings in .eh_frame are relative to (= the section’s load address); we record the file-relative form, so DwarfCfi-consuming callers should pass already-file-relative PCs.
Usage example (Cross-references)
Usage examples (Cross-references)
- In
Dwarf.c:113:
}
DwarfCfi cfi;
bool built = DwarfCfiBuildFromElf(&cfi, &elf, base);
bool ok = false;- In
Backtrace.c:658:
++emitted;
const DwarfCfi *cfi = NULL;
const DwarfFde *fde = NULL;
u64 module_base = 0; SymbolResolver *self,
void *runtime_addr,
const DwarfCfi **out_cfi,
const DwarfFde **out_fde,
u64 *out_module_base const u8 *body_start,
u64 cie_offset,
const DwarfCfi *cfi,
const u8 *section_data,
u64 section_addr, // ---------------------------------------------------------------------------
bool DwarfCfiBuildFromElf(DwarfCfi *out, const ElfFile *elf, Allocator *alloc) {
if (!out || !elf || !alloc) {
LOG_ERROR("DwarfCfiBuildFromElf: NULL argument"); }
const DwarfCie *DwarfCfiFindCie(const DwarfCfi *self, u64 cie_offset) {
if (!self)
return NULL; }
const DwarfFde *DwarfCfiFindFde(const DwarfCfi *self, u64 vaddr) {
if (!self)
return NULL; }
void DwarfCfiDeinit(DwarfCfi *self) {
if (!self)
return; }
bool DwarfCfiBuildRow(const DwarfCfi *cfi, const DwarfFde *fde, u64 target_pc, DwarfUnwindRow *out) {
if (!cfi || !fde || !out)
return false; bool sidecar_dwarf_ok;
// Lazily-parsed .eh_frame for the CFI-based unwinder.
DwarfCfi cfi;
bool cfi_built;
bool cfi_ok; SymbolResolver *self,
void *runtime_addr,
const DwarfCfi **out_cfi,
const DwarfFde **out_fde,
u64 *out_module_base- In
Dwarf.h:176:
DwarfFdes fdes;
u64 eh_frame_addr;
} DwarfCfi;
///
- In
Dwarf.h:191:
/// TAGS: Parser, DWARF, CFI
///
bool DwarfCfiBuildFromElf(DwarfCfi *out, const ElfFile *elf, Allocator *alloc);
///
- In
Dwarf.h:197:
/// `vaddr` (file-relative). Returns NULL if no FDE covers the address.
///
const DwarfFde *DwarfCfiFindFde(const DwarfCfi *self, u64 vaddr);
///
- In
Dwarf.h:202:
/// Find a CIE by its `.eh_frame` offset (used to link FDE -> CIE).
///
const DwarfCie *DwarfCfiFindCie(const DwarfCfi *self, u64 cie_offset);
void DwarfCfiDeinit(DwarfCfi *self);- In
Dwarf.h:204:
const DwarfCie *DwarfCfiFindCie(const DwarfCfi *self, u64 cie_offset);
void DwarfCfiDeinit(DwarfCfi *self);
// ---------------------------------------------------------------------------
- In
Dwarf.h:275:
/// TAGS: Parser, DWARF, CFI, Unwind
///
bool DwarfCfiBuildRow(const DwarfCfi *cfi, const DwarfFde *fde, u64 target_pc, DwarfUnwindRow *out);
// ===========================================================================
Last updated on