From 0886963d938d34b044e95cea551eac98595cbbee Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 6 Nov 2024 14:01:38 -0800 Subject: [PATCH] promote section definition number to 32-bit when linking big obj --- src/linker/lnk.c | 5 +++-- src/linker/lnk_chunk.c | 6 +++--- src/linker/lnk_obj.c | 16 ++++++++++++++-- src/linker/lnk_obj.h | 2 +- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index fe73939f..dc946f19 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -760,9 +760,10 @@ lnk_make_res_obj(TP_Context *tp, coff_sect_symbol.aux_symbol_count = 1; coff_sect_symbol.storage_class = COFF_SymStorageClass_STATIC; + Assert(sect->isect <= max_U16); COFF_SymbolSecDef secdef = {0}; secdef.length = safe_cast_u32(sect_size); - secdef.number = sect->isect; + secdef.number_lo = sect->isect; secdef.number_of_relocations = safe_cast_u32(reloc_count); coff_symbol16_list_push(scratch.arena, &coff_symbol_list, coff_sect_symbol); @@ -3279,7 +3280,7 @@ l.count += 1; \ B32 build_win32_header = 1; B32 patch_relocs = 1; B32 sort_exception_info = 1; - B32 build_imp_lib = 1; //config->build_imp_lib; + B32 build_imp_lib = config->build_imp_lib; LNK_ObjList obj_list = {0}; LNK_LibList lib_index[LNK_InputSource_Count] = {0}; String8 image_data = str8_zero(); diff --git a/src/linker/lnk_chunk.c b/src/linker/lnk_chunk.c index e5f6d2ca..97d5015c 100644 --- a/src/linker/lnk_chunk.c +++ b/src/linker/lnk_chunk.c @@ -481,7 +481,7 @@ lnk_op_list_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count, U8 frame->chunk_array = *chunk->u.arr; frame->ichunk = 0; SLLStackPush(stack, frame); - } goto yeild; + } goto _continue; case LNK_Chunk_List: { // balance ops at :end_chunk_series @@ -507,7 +507,7 @@ lnk_op_list_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count, U8 frame->chunk_array = chunk_array; frame->ichunk = 0; SLLStackPush(stack, frame); - } goto yeild; + } goto _continue; case LNK_Chunk_Null: { /* ignore */ } break; } @@ -530,7 +530,7 @@ lnk_op_list_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count, U8 // move to next frame SLLStackPop(stack); - yeild:; + _continue:; } scratch_end(scratch); diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c index 95113386..d7629944 100644 --- a/src/linker/lnk_obj.c +++ b/src/linker/lnk_obj.c @@ -417,7 +417,8 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer) lnk_chunk_set_debugf(arena, master_common_block, "%S: master common block", path); // convert from coff - LNK_SymbolArray symbol_arr = lnk_symbol_array_from_coff(arena, input->data, obj, cached_path, coff_info.string_table_off, coff_info.section_count_no_null, coff_sect_arr, coff_symbols, chunk_arr, master_common_block); + B32 is_big_obj = coff_info.type == COFF_DataType_BIG_OBJ; + LNK_SymbolArray symbol_arr = lnk_symbol_array_from_coff(arena, input->data, obj, cached_path, is_big_obj, coff_info.string_table_off, coff_info.section_count_no_null, coff_sect_arr, coff_symbols, chunk_arr, master_common_block); LNK_SymbolList symbol_list = lnk_symbol_list_from_array(arena, symbol_arr); LNK_RelocList *reloc_list_arr = lnk_reloc_list_array_from_coff(arena, coff_info.machine, input->data, coff_info.section_count_no_null, coff_sect_arr, chunk_arr, symbol_arr); @@ -715,6 +716,7 @@ lnk_symbol_array_from_coff(Arena *arena, String8 coff_data, LNK_Obj *obj, String8 obj_path, + B32 is_big_obj, U64 string_table_off, U64 sect_count, COFF_SectionHeader *coff_sect_arr, @@ -774,7 +776,17 @@ lnk_symbol_array_from_coff(Arena *arena, check_sum = secdef->check_sum; if (secdef->selection == COFF_ComdatSelectType_ASSOCIATIVE) { - LNK_Chunk *head_chunk = &chunk_arr[secdef->number - 1]; + U32 secdef_number = secdef->number_lo; + if (is_big_obj) { + secdef_number |= (U32)secdef->number_hi << 16; + } + + if (secdef_number == 0 || secdef_number > sect_count) { + lnk_error(LNK_Error_IllData, "%S: symbol %u has out of bounds section definition number %u", name, symbol_idx, secdef_number); + break; + } + + LNK_Chunk *head_chunk = &chunk_arr[secdef_number - 1]; LNK_Chunk *associate_chunk = &chunk_arr[coff_symbol->section_number - 1]; lnk_chunk_associate(arena, head_chunk, associate_chunk); } diff --git a/src/linker/lnk_obj.h b/src/linker/lnk_obj.h index 6a6ee555..a27b46e8 100644 --- a/src/linker/lnk_obj.h +++ b/src/linker/lnk_obj.h @@ -180,7 +180,7 @@ internal LNK_ChunkList * lnk_collect_obj_chunks(TP_Context *tp, TP_Arena *arena internal LNK_ObjNodeArray lnk_obj_list_push_parallel(TP_Context *tp, TP_Arena *tp_arena, LNK_ObjList *obj_list, LNK_SectionTable *st, U64 input_count, LNK_InputObj **inputs); internal LNK_Chunk * lnk_sect_chunk_array_from_coff(Arena *arena, U64 obj_id, String8 obj_path, String8 coff_data, U64 sect_count, COFF_SectionHeader *coff_sect_arr, String8 *sect_name_arr, String8 *sect_postfix_arr); -internal LNK_SymbolArray lnk_symbol_array_from_coff(Arena *arena, String8 coff_data, LNK_Obj *obj, String8 obj_path, U64 string_table_off, U64 sect_count, COFF_SectionHeader *coff_sect_arr, COFF_Symbol32Array coff_symbols, LNK_Chunk *chunk_arr, LNK_Chunk *master_common_block); +internal LNK_SymbolArray lnk_symbol_array_from_coff(Arena *arena, String8 coff_data, LNK_Obj *obj, String8 obj_path, B32 is_big_obj, U64 string_table_off, U64 sect_count, COFF_SectionHeader *coff_sect_arr, COFF_Symbol32Array coff_symbols, LNK_Chunk *chunk_arr, LNK_Chunk *master_common_block); internal LNK_RelocList lnk_reloc_list_from_coff_reloc_array(Arena *arena, COFF_MachineType machine, LNK_Chunk *chunk, LNK_SymbolArray symbol_array, COFF_Reloc *reloc_v, U64 reloc_count); internal LNK_RelocList * lnk_reloc_list_array_from_coff(Arena *arena, COFF_MachineType machine, String8 coff_data, U64 sect_count, COFF_SectionHeader *coff_sect_arr, LNK_Chunk *sect_chunk_arr, LNK_SymbolArray symbol_array); internal LNK_DirectiveInfo lnk_init_directives(Arena *arena, String8 obj_path, U64 chunk_count, String8 *sect_name_arr, LNK_Chunk *chunk_arr);