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]) {- In
Elf.c:521:
}
const ElfSymbol *ElfResolveAddress(const Elf *self, u64 vaddr) {
if (!self)
return NULL;
Last updated on