DwarfLinesBuildFromElf
Description
Parse the .debug_line section of a previously-opened Elf.
Parameters
| Name | Direction | Description |
|---|---|---|
out |
out | Populated on success. |
elf |
in | ELF file to read from. Borrowed; not retained. |
alloc |
in | Allocator for the resulting tables + string pool. |
Success
Returns true. out->entries.length may be 0 if the binary has no .debug_line section (stripped or built without -g).
Failure
Returns false; logs the failing step. out is left zeroed.
Usage example (Cross-references)
Usage examples (Cross-references)
if (!cache_entry->dwarf_built) {
cache_entry->dwarf_built = true;
cache_entry->dwarf_ok = DwarfLinesBuildFromElf(&cache_entry->dwarf, &cache_entry->elf, self->allocator);
}
const DwarfLineEntry *de = NULL; cache_entry->sidecar_dwarf_built = true;
cache_entry->sidecar_dwarf_ok =
DwarfLinesBuildFromElf(&cache_entry->sidecar_dwarf, &cache_entry->sidecar, self->allocator);
}
if (cache_entry->sidecar_dwarf_ok) {- In
Dwarf.c:542:
bool dwarf_lines_build_from_elf(DwarfLines *out, const Elf *elf, Allocator *alloc) {
if (!out || !elf || !alloc) {
LOG_FATAL("DwarfLinesBuildFromElf: NULL argument");
}
MemSet(out, 0, sizeof(*out));- In
Dwarf.Mut.c:191:
if (!ElfOpenFromMemoryCopy(elf, elfbuf, (size)elf_len, base))
return false;
bool built = DwarfLinesBuildFromElf(lines, elf, base);
return built;
}- In
Dwarf.c:29:
DwarfLines lines;
bool built = DwarfLinesBuildFromElf(&lines, &elf, ALLOCATOR_OF(&alloc));
bool ok = built && VecLen(&lines.entries) > 0;- In
Dwarf.c:69:
DwarfLines lines;
bool built = DwarfLinesBuildFromElf(&lines, &elf, base);
bool ok = false;
if (built) {- In
Dwarf.c:582:
DwarfLines lines;
bool built = DwarfLinesBuildFromElf(&lines, &elf, base);
bool ok = built;
if (built) {- In
Dwarf.c:637:
DwarfLines lines;
bool built = DwarfLinesBuildFromElf(&lines, &elf, base);
// The malformed unit is rejected: either the build fails outright, or
// (defensively) it succeeds but yields no usable rows. A caller must
- In
Dwarf.c:755:
return false;
}
fx->built = DwarfLinesBuildFromElf(&fx->lines, &fx->elf, base);
if (!fx->built) {
ElfDeinit(&fx->elf);- In
Dwarf.c:883:
return false;
bool built = DwarfLinesBuildFromElf(lines, &elf, base);
ElfDeinit(&elf);
return built;- In
Dwarf.c:1013:
if (!ElfOpenFromMemoryCopy(elf, elfbuf, (size)elf_len, base))
return false;
return DwarfLinesBuildFromElf(out, elf, base);
}- In
Dwarf.c:1523:
DwarfLines lines;
bool built = DwarfLinesBuildFromElf(&lines, &elf, base);
// The over-long extended record must be rejected: either the build fails
// outright, or it yields a table where the only safe row (0x17000) is
- In
Dwarf.c:1916:
return false;
bool built = DwarfLinesBuildFromElf(lines, &elf, base);
ElfDeinit(&elf);
return built;- In
Dwarf.c:2473:
DwarfLines lines;
bool built = DwarfLinesBuildFromElf(&lines, &elf, base);
bool ok = built; // 562: `ok=true`->false => built would be false.
if (built) {- In
Dwarf.c:2517:
DwarfLines lines;
bool built = DwarfLinesBuildFromElf(&lines, &elf, base);
// Real code: rejected -> built == false. Mutant (ok=true): built == true.
bool ok = !built;- In
Dwarf.c:2553:
DwarfLines lines;
bool built = DwarfLinesBuildFromElf(&lines, &elf, base);
// Real code rejects the overrun -> built == false. Mutant returns true.
bool ok = !built;- In
Dwarf.c:2588:
DwarfLines lines;
bool built = DwarfLinesBuildFromElf(&lines, &elf, base);
bool ok = built;
if (built) {- In
Dwarf.c:2643:
size before = DebugAllocatorLiveCount(&dbg);
DwarfLines lines;
bool built = DwarfLinesBuildFromElf(&lines, &elf, base);
bool ok = built;
if (built) {- In
Dwarf.c:2689:
size before = DebugAllocatorLiveCount(&dbg);
DwarfLines lines;
bool built = DwarfLinesBuildFromElf(&lines, &elf, base);
bool ok = built;
if (built) {
Last updated on