From 00204c92323d58e9e12259b6cd35693af73e2a99 Mon Sep 17 00:00:00 2001 From: Nicolas Savoire Date: Wed, 21 May 2025 23:13:35 +0200 Subject: [PATCH 1/2] Add support for dynamic symbols when DYNAMIC segment is stripped If dynamic symbols cannot be parsed from the DYNAMIC segment, try to parse them from the section headers. --- symbolic-debuginfo/src/elf.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/symbolic-debuginfo/src/elf.rs b/symbolic-debuginfo/src/elf.rs index ed65c2fab..6f93a9750 100644 --- a/symbolic-debuginfo/src/elf.rs +++ b/symbolic-debuginfo/src/elf.rs @@ -291,6 +291,24 @@ impl<'data> ElfObject<'data> { return_partial_on_err!(elf::Symtab::parse(data, dyn_info.symtab, num_syms, ctx)); } + // If the dynamic symbol table is empty, try to parse it from the section headers. + if obj.dynsyms.is_empty() { + for shdr in &obj.section_headers { + if shdr.sh_type == elf::section_header::SHT_DYNSYM { + let size = shdr.sh_entsize; + let count = if size == 0 { 0 } else { shdr.sh_size / size }; + obj.dynsyms = return_partial_on_err!(elf::Symtab::parse( + data, + shdr.sh_offset as usize, + count as usize, + ctx + )); + + obj.dynstrtab = return_partial_on_err!(get_strtab(&obj.section_headers, shdr.sh_link as usize)); + } + } + } + obj.shdr_relocs = vec![]; for (idx, section) in obj.section_headers.iter().enumerate() { let is_rela = section.sh_type == elf::section_header::SHT_RELA; From dd2db6190dfe1ea4f34b210ca8397ea8a56fc477 Mon Sep 17 00:00:00 2001 From: Nicolas Savoire Date: Fri, 27 Jun 2025 16:38:00 +0200 Subject: [PATCH 2/2] Add early loop exit --- symbolic-debuginfo/src/elf.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/symbolic-debuginfo/src/elf.rs b/symbolic-debuginfo/src/elf.rs index 6f93a9750..5e40e8503 100644 --- a/symbolic-debuginfo/src/elf.rs +++ b/symbolic-debuginfo/src/elf.rs @@ -305,6 +305,7 @@ impl<'data> ElfObject<'data> { )); obj.dynstrtab = return_partial_on_err!(get_strtab(&obj.section_headers, shdr.sh_link as usize)); + break; } } }