Skip to content

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)
        }
    
        DwarfCfi cfi;
        bool     built = DwarfCfiBuildFromElf(&cfi, &elf, base);
        bool     ok    = false;
            ++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
        DwarfFdes  fdes;
        u64        eh_frame_addr;
    } DwarfCfi;
    
    ///
    /// TAGS: Parser, DWARF, CFI
    ///
    bool DwarfCfiBuildFromElf(DwarfCfi *out, const ElfFile *elf, Allocator *alloc);
    
    ///
    /// `vaddr` (file-relative). Returns NULL if no FDE covers the address.
    ///
    const DwarfFde *DwarfCfiFindFde(const DwarfCfi *self, u64 vaddr);
    
    ///
    /// 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);
    const DwarfCie *DwarfCfiFindCie(const DwarfCfi *self, u64 cie_offset);
    
    void DwarfCfiDeinit(DwarfCfi *self);
    
    // ---------------------------------------------------------------------------
    /// TAGS: Parser, DWARF, CFI, Unwind
    ///
    bool DwarfCfiBuildRow(const DwarfCfi *cfi, const DwarfFde *fde, u64 target_pc, DwarfUnwindRow *out);
    
    // ===========================================================================
Last updated on