Skip to content
ElfResolveAddress

ElfResolveAddress

Description

Look up the symbol whose [value, value+size) range contains vaddr. Searches symbols first, then dynamic_symbols — so static (non-exported) functions resolve when .symtab is present.

vaddr is the file-relative virtual address — i.e. for a runtime pointer in a ET_DYN (PIE / shared object), the caller subtracts the load base first. For ET_EXEC it’s the address as-is.

Parameters

Name Direction Description
self in Parsed ELF file.
vaddr in Virtual address to resolve.

Success

Returns a pointer to the matching ElfSymbol. The pointer is valid until ElfDeinit.

Failure

Returns NULL if no symbol covers vaddr.

Usage example (Cross-references)

Usage examples (Cross-references)
        // (3) Symbol lookup against .symtab/.dynsym should miss for our
        //     static helpers (they're not exported, and .symtab is gone).
        const ElfSymbol *sym                    = ElfResolveAddress(&stripped, file_relative);
        bool             sym_missing_or_unnamed = (!sym) || (sym && (!sym->name || !sym->name[0]));
        if (!sym_missing_or_unnamed) {
        // sidecar (full `.symtab` for stripped binaries) if nothing
        // matches.
        const ElfSymbol *sym = ElfResolveAddress(&cache_entry->elf, file_relative);
        if (!(sym && sym->name && sym->name[0]) && cache_entry->has_sidecar) {
            sym = ElfResolveAddress(&cache_entry->sidecar, file_relative);
        const ElfSymbol *sym = ElfResolveAddress(&cache_entry->elf, file_relative);
        if (!(sym && sym->name && sym->name[0]) && cache_entry->has_sidecar) {
            sym = ElfResolveAddress(&cache_entry->sidecar, file_relative);
        }
        if (sym && sym->name && sym->name[0]) {
    }
    
    const ElfSymbol *ElfResolveAddress(const Elf *self, u64 vaddr) {
        if (!self)
            return NULL;
Last updated on