fix eh_frame unwinder - switching to synchronous process reads exposed losing info about a missed address read for unwinding, so unwinds never succeeded

This commit is contained in:
Ryan Fleury committed 2026-08-04 18:51:01 -07:00
1 parent a6755d6191
commit a0a16ea11e
3 files changed
+6 -4

No files matched your search

+1
View File
@@ -133,6 +133,7 @@ eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64
// rjf: determine CIE's full address range
Rng1U64 cie_vaddr_range = {0};
DW_Format cie_fmt = DW_Format_Null;
if(!done)
{
// rjf: read initial length data
String8 initial_length_data = {0};
@@ -1764,7 +1764,8 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
{
ptr_data->addr_is_good = 1;
}
else if(e_space_read(ptr_data->value_eval.space, &byte, &range_info, r1u64(ptr_data->value_eval.value.u64, ptr_data->value_eval.value.u64+1)))
else if(e_space_read(ptr_data->value_eval.space, &byte, &range_info, r1u64(ptr_data->value_eval.value.u64, ptr_data->value_eval.value.u64+1)) &&
!(range_info.flags & E_SpaceRangeFlag_Stale))
{
ptr_data->addr_is_good = !(byte_bad_flags & 1);
}
+3 -3
View File
@@ -690,7 +690,7 @@ lnx_dmn_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased
U64 bloom_word = (elf_class == ELF_Class_64) ? 8 : 4;
U64 buckets_vaddr = dynamic_info.gnu_hash_vaddr + sizeof(gnu_header) + bloom_size * bloom_word;
U64 chain_vaddr = buckets_vaddr + (U64)nbuckets * sizeof(U32);
// find largest symbol index referenced by any bucket
U32 max_bucket = 0;
for(U32 b = 0; b < nbuckets; b += 1)
@@ -702,7 +702,7 @@ lnx_dmn_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased
}
if(entry > max_bucket) { max_bucket = entry; }
}
if(max_bucket < symoffset)
{
// no symbols in hash; total count is symoffset
@@ -735,7 +735,7 @@ lnx_dmn_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased
}
}
}
// scan symbol table for the rendezvous symbol
if(dynamic_info.symtab_vaddr && dynamic_info.symtab_entry_size && symbol_count)
{