diff --git a/src/linker/lnk.c b/src/linker/lnk.c index cea78b23..abbe2e79 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -2138,15 +2138,6 @@ lnk_build_win32_header(Arena *arena, LNK_SymbolTable *symtab, LNK_Config *config return result; } -internal int -lnk_pdata_is_before_x8664(void *raw_a, void *raw_b) -{ - PE_IntelPdata *a = raw_a; - PE_IntelPdata *b = raw_b; - int is_before = a->voff_first < b->voff_first; - return is_before; -} - internal String8 lnk_build_win32_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolTable *symtab, U64 objs_count, LNK_Obj **objs) { @@ -3068,21 +3059,8 @@ lnk_build_win32_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_S { LNK_Section *pdata_sect = lnk_section_table_search(sectab, str8_lit(".pdata"), PE_PDATA_SECTION_FLAGS); if (pdata_sect) { - String8 pdata = str8_substr(image_data, rng_1u64(pdata_sect->foff, pdata_sect->foff + pdata_sect->vsize)); - - ProfBegin("Sort Exception Info"); - if (pdata_sect) { - switch (config->machine) { - case COFF_MachineType_Unknown: break; - case COFF_MachineType_X86: - case COFF_MachineType_X64: { - U64 count = pdata.size / sizeof(PE_IntelPdata); - radsort((PE_IntelPdata *)pdata.str, count, lnk_pdata_is_before_x8664); - } break; - default: { NotImplemented; } break; - } - } - ProfEnd(); + String8 raw_pdata = str8_substr(image_data, rng_1u64(pdata_sect->foff, pdata_sect->foff + pdata_sect->vsize)); + pe_pdata_sort(config->machine, raw_pdata); PE_DataDirectory *pdata_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_EXCEPTIONS); pdata_dir->virt_off = lnk_get_first_section_contrib_voff(image_section_table, pdata_sect); diff --git a/src/pe/pe.c b/src/pe/pe.c index 1cb63a53..a8e2ea3a 100644 --- a/src/pe/pe.c +++ b/src/pe/pe.c @@ -1790,3 +1790,28 @@ pe_has_plus_header(COFF_MachineType machine) } return has_plus_header; } + +//////////////////////////////// + +internal int +pe_pdata_is_before_x86_64(void *raw_a, void *raw_b) +{ + PE_IntelPdata *a = raw_a, *b = raw_b; + return a->voff_first < b->voff_first; +} + +internal void +pe_pdata_sort(COFF_MachineType machine, String8 raw_pdata) +{ + ProfBeginFunction(); + switch (machine) { + case COFF_MachineType_Unknown: break; + case COFF_MachineType_X86: + case COFF_MachineType_X64: { + U64 count = raw_pdata.size / sizeof(PE_IntelPdata); + radsort((PE_IntelPdata *)raw_pdata.str, count, pe_pdata_is_before_x86_64); + } break; + default: { NotImplemented; } break; + } + ProfEnd(); +} diff --git a/src/pe/pe.h b/src/pe/pe.h index 3dbaeea2..cc225ffc 100644 --- a/src/pe/pe.h +++ b/src/pe/pe.h @@ -1106,4 +1106,8 @@ internal String8 pe_make_debug_header_rdi(Arena *arena, Guid guid, String8 rdi_p internal U32 pe_compute_checksum(U8 *buffer, U64 buffer_size); +//////////////////////////////// + +internal void pe_pdata_sort(COFF_MachineType machine, String8 raw_pdata); + #endif // PE_H