fix ELF compressed header and skip duplicate sections

This commit is contained in:
Nikita Smith
2025-08-12 14:10:13 -07:00
parent b50f309422
commit 086d774b8b
2 changed files with 47 additions and 49 deletions
+8 -11
View File
@@ -32,7 +32,6 @@ dw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin)
{ {
DW_Input result = {0}; DW_Input result = {0};
B32 is_section_present[ArrayCount(result.sec)] = {0}; B32 is_section_present[ArrayCount(result.sec)] = {0};
Temp scratch = scratch_begin(&arena, 1);
for(U64 section_idx = 1; section_idx < bin->shdrs.count; section_idx += 1) for(U64 section_idx = 1; section_idx < bin->shdrs.count; section_idx += 1)
{ {
ELF_Shdr64 *shdr = &bin->shdrs.v[section_idx]; ELF_Shdr64 *shdr = &bin->shdrs.v[section_idx];
@@ -49,10 +48,11 @@ dw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin)
is_dwo = (section_kind != DW_Section_Null); is_dwo = (section_kind != DW_Section_Null);
} }
if(section_kind == DW_Section_Null) { continue; } // skip unknown sections
if(is_section_present[section_kind]) { continue; } // skip duplicate sections
//- rjf: decompress section data if needed //- rjf: decompress section data if needed
String8 section_data__uncompressed = {0}; String8 section_data__uncompressed = {0};
if(section_kind != DW_Section_Null)
{
if(!(shdr->sh_flags & ELF_Shf_Compressed)) if(!(shdr->sh_flags & ELF_Shf_Compressed))
{ {
section_data__uncompressed = section_data__maybe_compressed; section_data__uncompressed = section_data__maybe_compressed;
@@ -81,7 +81,6 @@ dw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin)
String8 section_data__compressed_contents = str8_skip(section_data__maybe_compressed, chdr_size); String8 section_data__compressed_contents = str8_skip(section_data__maybe_compressed, chdr_size);
switch(chdr64.ch_type) switch(chdr64.ch_type)
{ {
default:
case ELF_CompressType_None: case ELF_CompressType_None:
{ {
section_data__uncompressed = section_data__compressed_contents; section_data__uncompressed = section_data__compressed_contents;
@@ -89,29 +88,27 @@ dw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin)
case ELF_CompressType_ZLib: case ELF_CompressType_ZLib:
{ {
U8 *section_data_uncompressed_buffer = push_array_no_zero_aligned(arena, U8, chdr64.ch_size, chdr64.ch_addr_align); U8 *section_data_uncompressed_buffer = push_array_no_zero_aligned(arena, U8, chdr64.ch_size, chdr64.ch_addr_align);
U64 section_data_uncompressed_size = 0; U64 section_data_uncompressed_size = zsinflate(section_data_uncompressed_buffer, chdr64.ch_size, section_data__compressed_contents.str, section_data__compressed_contents.size);
section_data_uncompressed_size = zsinflate(section_data_uncompressed_buffer, chdr64.ch_size, section_data__compressed_contents.str, section_data__compressed_contents.size);
section_data__uncompressed = str8(section_data_uncompressed_buffer, section_data_uncompressed_size); section_data__uncompressed = str8(section_data_uncompressed_buffer, section_data_uncompressed_size);
}break; }break;
case ELF_CompressType_ZStd: case ELF_CompressType_ZStd:
{ {
NotImplemented; NotImplemented;
}break; }break;
} default:
{
NotImplemented;
}break;
} }
} }
} }
//- rjf: store //- rjf: store
if(section_kind != DW_Section_Null)
{
is_section_present[section_kind] = 1; is_section_present[section_kind] = 1;
DW_Section *d = &result.sec[section_kind]; DW_Section *d = &result.sec[section_kind];
d->name = push_str8_copy(arena, section_name); d->name = push_str8_copy(arena, section_name);
d->data = section_data__uncompressed; d->data = section_data__uncompressed;
d->is_dwo = is_dwo; d->is_dwo = is_dwo;
} }
}
scratch_end(scratch);
return result; return result;
} }
+2 -1
View File
@@ -971,7 +971,8 @@ typedef struct ELF_Chdr32
typedef struct ELF_Chdr64 typedef struct ELF_Chdr64
{ {
U64 ch_type; U32 ch_type;
U32 ch_reserved;
U64 ch_size; U64 ch_size;
U64 ch_addr_align; U64 ch_addr_align;
} ELF_Chdr64; } ELF_Chdr64;