From d92f45784db848b650215b3a2bc8aa9d9f9758a9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 3 Sep 2025 13:41:05 -0700 Subject: [PATCH] rename defined symbol to obj ref, as the symbol table no longer has scopes and it makes no sense to refer to them that way --- src/linker/lnk.c | 86 ++++++++++++------------- src/linker/lnk_debug_info.c | 4 +- src/linker/lnk_obj.c | 10 +-- src/linker/lnk_symbol_table.c | 116 +++++++++++++++++----------------- src/linker/lnk_symbol_table.h | 18 +++--- 5 files changed, 115 insertions(+), 119 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 3200a455..4c4a0acd 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1190,7 +1190,7 @@ lnk_lib_member_ref_is_before(void *raw_a, void *raw_b) LNK_LibMemberRef **a = raw_a, **b = raw_b; LNK_Symbol *a_pull_in_ref = (*a)->lib->was_member_linked[(*a)->member_idx]; LNK_Symbol *b_pull_in_ref = (*b)->lib->was_member_linked[(*b)->member_idx]; - return lnk_symbol_defined_is_before(a_pull_in_ref, b_pull_in_ref); + return lnk_symbol_is_before(a_pull_in_ref, b_pull_in_ref); } internal LNK_LibMemberRef ** @@ -1507,7 +1507,7 @@ lnk_link_inputs_(TP_Context *tp, LNK_Symbol *symbol = c->v[i].symbol; if (symbol->is_lib_member_linked) { continue; } - COFF_ParsedSymbol symbol_parsed = lnk_parsed_symbol_from_defined(symbol); + COFF_ParsedSymbol symbol_parsed = lnk_parse_symbol(symbol); COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); if (symbol_interp == COFF_SymbolValueInterp_Undefined) { U32 member_idx; @@ -1515,14 +1515,14 @@ lnk_link_inputs_(TP_Context *tp, lnk_queue_lib_member(arena->v[0], &queued_members, symbol, &lib_n->data, member_idx); } } else if (symbol_interp == COFF_SymbolValueInterp_Weak) { - COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(symbol_parsed, symbol->defined.obj->header.is_big_obj); + COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(symbol_parsed, symbol->ref.obj->header.is_big_obj); if (weak_ext->characteristics == COFF_WeakExt_SearchLibrary) { U32 member_idx; if (lnk_search_lib(&lib_n->data, symbol->name, &member_idx)) { lnk_queue_lib_member(arena->v[0], &queued_members, symbol, &lib_n->data, member_idx); } } else if (search_anti_deps && weak_ext->characteristics == COFF_WeakExt_AntiDependency) { - LNK_SymbolDefined dep_symbol = lnk_resolve_weak_symbol(symtab, symbol->defined); + LNK_ObjSymbolRef dep_symbol = lnk_resolve_weak_symbol(symtab, symbol->ref); COFF_ParsedSymbol dep_parsed = lnk_parsed_symbol_from_coff_symbol_idx(dep_symbol.obj, dep_symbol.symbol_idx); COFF_SymbolValueInterpType dep_interp = coff_interp_from_parsed_symbol(dep_parsed); if (dep_interp == COFF_SymbolValueInterp_Weak) { @@ -1570,7 +1570,7 @@ lnk_link_inputs_(TP_Context *tp, // create import stub (later replaced with acutal import generated by linker) LNK_Symbol *import_stub = lnk_symbol_table_search(symtab, str8_lit(LNK_IMPORT_STUB)); - LNK_Symbol *import_symbol = lnk_make_defined_symbol(symtab->arena->v[0], link_symbol->name, import_stub->defined.obj, import_stub->defined.symbol_idx); + LNK_Symbol *import_symbol = lnk_make_obj_ref_symbol(symtab->arena->v[0], link_symbol->name, import_stub->ref.obj, import_stub->ref.symbol_idx); lnk_symbol_table_push(symtab, import_symbol); // search DLL symbol list @@ -1640,7 +1640,7 @@ lnk_link_inputs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer for (LNK_AltNameNode *alt_name_n = config->alt_name_list.first; alt_name_n != 0; alt_name_n = alt_name_n->next) { LNK_SymbolHashTrie *symbol_ht = lnk_symbol_table_search_(symtab, alt_name_n->v.from); if (symbol_ht) { - COFF_SymbolValueInterpType interp = lnk_interp_from_symbol(symbol_ht->symbol); + COFF_SymbolValueInterpType interp = lnk_interp_symbol(symbol_ht->symbol); if (interp == COFF_SymbolValueInterp_Undefined) { // clear out slot so weak symbol can replace undefined symbol (general rule is // weak symbol is not allowed to replace undefined) @@ -1944,7 +1944,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer LNK_SymbolHashTrieChunk *chunk = chunks[chunk_idx]; for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - COFF_SymbolValueInterpType symbol_interp = lnk_interp_from_symbol(symbol); + COFF_SymbolValueInterpType symbol_interp = lnk_interp_symbol(symbol); if (symbol_interp == COFF_SymbolValueInterp_Undefined) { count += 1; } @@ -1957,18 +1957,18 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer LNK_SymbolHashTrieChunk *chunk = chunks[chunk_idx]; for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - COFF_SymbolValueInterpType symbol_interp = lnk_interp_from_symbol(symbol); + COFF_SymbolValueInterpType symbol_interp = lnk_interp_symbol(symbol); if (symbol_interp == COFF_SymbolValueInterp_Undefined) { unresolved[cursor++] = chunk->v[i].symbol; } } } - radsort(unresolved, count, lnk_symbol_defined_ptr_is_before); + radsort(unresolved, count, lnk_symbol_ptr_is_before); for EachIndex(i, count) { LNK_Symbol *symbol = unresolved[i]; - lnk_error_obj(LNK_Error_UnresolvedSymbol, symbol->defined.obj, "unresolved symbol %S", symbol->name); + lnk_error_obj(LNK_Error_UnresolvedSymbol, symbol->ref.obj, "unresolved symbol %S", symbol->name); } // TODO: /FORCE @@ -2057,10 +2057,10 @@ lnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *config, LNK_Obj LNK_Symbol *root = lnk_symbol_table_search(symtab, root_n->v.name); struct Task *t = push_array(scratch.arena, struct Task, 1); - t->obj = root->defined.obj; + t->obj = root->ref.obj; t->relocs.count = 1; t->relocs.v = push_array(scratch.arena, COFF_Reloc, 1); - t->relocs.v[0].isymbol = root->defined.symbol_idx; + t->relocs.v[0].isymbol = root->ref.symbol_idx; SLLStackPush(task_stack, t); } @@ -2100,33 +2100,33 @@ lnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *config, LNK_Obj struct Task *t = task_stack; SLLStackPop(task_stack); for EachIndex(reloc_idx, t->relocs.count) { COFF_Reloc *reloc = &t->relocs.v[reloc_idx]; - LNK_SymbolDefined reloc_defn = (LNK_SymbolDefined){ .obj = t->obj, .symbol_idx = reloc->isymbol }; + LNK_ObjSymbolRef reloc_defn = (LNK_ObjSymbolRef){ .obj = t->obj, .symbol_idx = reloc->isymbol }; COFF_ParsedSymbol reloc_parsed = lnk_parsed_symbol_from_coff_symbol_idx(reloc_defn.obj, reloc_defn.symbol_idx); COFF_SymbolValueInterpType reloc_interp = coff_interp_from_parsed_symbol(reloc_parsed); - LNK_SymbolDefined ref_symbol = reloc_defn; + LNK_ObjSymbolRef ref_symbol = reloc_defn; for (;;) { COFF_ParsedSymbol ref_parsed = lnk_parsed_symbol_from_coff_symbol_idx(ref_symbol.obj, ref_symbol.symbol_idx); COFF_SymbolValueInterpType ref_interp = coff_interp_from_parsed_symbol(ref_parsed); - LNK_SymbolDefined next_ref = {0}; + LNK_ObjSymbolRef next_ref = {0}; if (ref_interp == COFF_SymbolValueInterp_Regular) { LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(ref_symbol.obj, ref_parsed.section_number); if (symlink) { - ref_symbol = symlink->defined; + ref_symbol = symlink->ref; } break; } else if (ref_interp == COFF_SymbolValueInterp_Undefined) { if (reloc_parsed.storage_class == COFF_SymStorageClass_External) { LNK_Symbol *defn = lnk_symbol_table_search(symtab, ref_parsed.name); - next_ref = defn->defined; + next_ref = defn->ref; } else { MemoryZeroStruct(&ref_symbol); break; } } else if (ref_interp == COFF_SymbolValueInterp_Weak) { LNK_Symbol *defn = lnk_symbol_table_search(symtab, ref_parsed.name); - next_ref = defn->defined; + next_ref = defn->ref; } else { break; } @@ -2219,7 +2219,7 @@ lnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *config, LNK_Obj } internal B32 -lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol, LNK_SymbolDefined *symbol_out) +lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymbolRef *symbol_out) { B32 is_resolved = 1; COFF_ParsedSymbol symbol_parsed = lnk_parsed_symbol_from_coff_symbol_idx(symbol.obj, symbol.symbol_idx); @@ -2227,14 +2227,14 @@ lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol, LNK_Symbol switch (symbol_interp) { case COFF_SymbolValueInterp_Regular: { LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(symbol.obj, symbol_parsed.section_number); - *symbol_out = symlink ? symlink->defined : symbol; + *symbol_out = symlink ? symlink->ref : symbol; } break; case COFF_SymbolValueInterp_Weak: { LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); - COFF_ParsedSymbol defn_parsed = lnk_parsed_symbol_from_coff_symbol_idx(defn->defined.obj, defn->defined.symbol_idx); + COFF_ParsedSymbol defn_parsed = lnk_parsed_symbol_from_coff_symbol_idx(defn->ref.obj, defn->ref.symbol_idx); COFF_SymbolValueInterpType defn_interp = coff_interp_symbol(defn_parsed.section_number, defn_parsed.value, defn_parsed.storage_class); if (defn_interp != COFF_SymbolValueInterp_Undefined) { - *symbol_out = defn->defined; + *symbol_out = defn->ref; } else { is_resolved = 0; } @@ -2242,19 +2242,19 @@ lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol, LNK_Symbol case COFF_SymbolValueInterp_Undefined: { LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); if (defn) { - *symbol_out = defn->defined; + *symbol_out = defn->ref; } else { is_resolved = 0; } } break; case COFF_SymbolValueInterp_Common: { LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); - *symbol_out = defn->defined; + *symbol_out = defn->ref; } break; case COFF_SymbolValueInterp_Abs: { if (symbol_parsed.storage_class == COFF_SymStorageClass_External) { LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); - *symbol_out = defn->defined; + *symbol_out = defn->ref; } else { *symbol_out = symbol; } @@ -2378,8 +2378,8 @@ THREAD_POOL_TASK_FUNC(lnk_set_comdat_leaders_contribs_task) LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(obj, section_number); if (symlink == 0) { continue; } - COFF_ParsedSymbol symlink_parsed = lnk_parsed_symbol_from_defined(symlink); - task->sect_map[obj_idx][sect_idx] = task->sect_map[symlink->defined.obj->input_idx][symlink_parsed.section_number - 1]; + COFF_ParsedSymbol symlink_parsed = lnk_parse_symbol(symlink); + task->sect_map[obj_idx][sect_idx] = task->sect_map[symlink->ref.obj->input_idx][symlink_parsed.section_number - 1]; } ProfEnd(); } @@ -2422,12 +2422,12 @@ THREAD_POOL_TASK_FUNC(lnk_patch_comdat_leaders_task) COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class); if (interp == COFF_SymbolValueInterp_Regular) { LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(obj, symbol.section_number); - if (symlink && symlink->defined.obj != obj) { + if (symlink && symlink->ref.obj != obj) { U32 section_number; U32 value; if (symbol.storage_class == COFF_SymStorageClass_External) { // COMDAT leader may be at a different offset, so update this symbol with leader's offset - COFF_ParsedSymbol parsed_symlink = lnk_parsed_symbol_from_coff_symbol_idx(symlink->defined.obj, symlink->defined.symbol_idx); + COFF_ParsedSymbol parsed_symlink = lnk_parse_symbol(symlink); section_number = symbol.section_number; value = parsed_symlink.value; } else { @@ -2485,11 +2485,7 @@ lnk_common_block_contrib_is_before(void *raw_a, void *raw_b) if (a->u.size == b->u.size) { LNK_Symbol *a_symbol = a->symbol; LNK_Symbol *b_symbol = b->symbol; - if (a_symbol->defined.obj->input_idx == b_symbol->defined.obj->input_idx) { - is_before = a_symbol->defined.symbol_idx < b_symbol->defined.symbol_idx; - } else { - is_before = a_symbol->defined.obj->input_idx < b_symbol->defined.obj->input_idx; - } + is_before = lnk_symbol_is_before(a_symbol, b_symbol); } else { is_before = a->u.size > b->u.size; } @@ -2508,8 +2504,8 @@ THREAD_POOL_TASK_FUNC(lnk_patch_common_block_leaders_task) for (U64 contrib_idx = contrib_range.min; contrib_idx < contrib_range.max; contrib_idx += 1) { LNK_CommonBlockContrib *contrib = &task->u.patch_symtabs.common_block_contribs[contrib_idx]; LNK_Symbol *symbol = contrib->symbol; - LNK_Obj *obj = symbol->defined.obj; - COFF_ParsedSymbol parsed_symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol->defined.symbol_idx); + LNK_Obj *obj = symbol->ref.obj; + COFF_ParsedSymbol parsed_symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol->ref.symbol_idx); U64 section_number = task->u.patch_symtabs.common_block_sect->sect_idx + 1; if (obj->header.is_big_obj) { @@ -2522,7 +2518,7 @@ THREAD_POOL_TASK_FUNC(lnk_patch_common_block_leaders_task) symbol16->section_number = safe_cast_u16(section_number); } - task->u.patch_symtabs.was_symbol_patched[obj->input_idx][symbol->defined.symbol_idx] = 1; + task->u.patch_symtabs.was_symbol_patched[obj->input_idx][symbol->ref.symbol_idx] = 1; } ProfEnd(); @@ -2543,7 +2539,7 @@ THREAD_POOL_TASK_FUNC(lnk_patch_common_block_symbols_task) if (interp == COFF_SymbolValueInterp_Common) { LNK_Symbol *defn = lnk_symbol_table_search(task->symtab, symbol.name); - COFF_ParsedSymbol defn_parsed = lnk_parsed_symbol_from_coff_symbol_idx(defn->defined.obj, defn->defined.symbol_idx); + COFF_ParsedSymbol defn_parsed = lnk_parsed_symbol_from_coff_symbol_idx(defn->ref.obj, defn->ref.symbol_idx); Assert(coff_interp_symbol(defn_parsed.section_number, defn_parsed.value, defn_parsed.storage_class) == COFF_SymbolValueInterp_Regular); if (defn) { if (obj->header.is_big_obj) { @@ -2621,8 +2617,8 @@ lnk_patch_obj_symtab(LNK_SymbolTable *symtab, LNK_Obj *obj, B8 *was_symbol_patch COFF_SymbolValueInterpType fixup_dst_type = coff_interp_symbol(fixup_dst.section_number, fixup_dst.value, fixup_dst.storage_class); if (fixup_type != fixup_dst_type) { continue; } - LNK_SymbolDefined symbol_to_resolve = { .obj = obj, .symbol_idx = symbol_idx }; - LNK_SymbolDefined fixup_symbol = {0}; + LNK_ObjSymbolRef symbol_to_resolve = { .obj = obj, .symbol_idx = symbol_idx }; + LNK_ObjSymbolRef fixup_symbol = {0}; B32 is_resolved = lnk_resolve_symbol(symtab, symbol_to_resolve, &fixup_symbol); if (is_resolved) { COFF_ParsedSymbol fixup_src = lnk_parsed_symbol_from_coff_symbol_idx(fixup_symbol.obj, fixup_symbol.symbol_idx); @@ -2824,7 +2820,7 @@ THREAD_POOL_TASK_FUNC(lnk_count_common_block_contribs_task) for (LNK_SymbolHashTrieChunk *chunk = symtab->chunks[task_id].first; chunk != 0; chunk = chunk->next) { for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - COFF_ParsedSymbol parsed_symbol = lnk_parsed_symbol_from_coff_symbol_idx(symbol->defined.obj, symbol->defined.symbol_idx); + COFF_ParsedSymbol parsed_symbol = lnk_parse_symbol(symbol); COFF_SymbolValueInterpType parsed_interp = coff_interp_symbol(parsed_symbol.section_number, parsed_symbol.value, parsed_symbol.storage_class); if (parsed_interp == COFF_SymbolValueInterp_Common) { task->u.common_block.counts[task_id] += 1; @@ -2843,7 +2839,7 @@ THREAD_POOL_TASK_FUNC(lnk_fill_out_common_block_contribs_task) for (LNK_SymbolHashTrieChunk *chunk = symtab->chunks[task_id].first; chunk != 0; chunk = chunk->next) { for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - COFF_ParsedSymbol parsed_symbol = lnk_parsed_symbol_from_coff_symbol_idx(symbol->defined.obj, symbol->defined.symbol_idx); + COFF_ParsedSymbol parsed_symbol = lnk_parse_symbol(symbol); COFF_SymbolValueInterpType parsed_interp = coff_interp_symbol(parsed_symbol.section_number, parsed_symbol.value, parsed_symbol.storage_class); if (parsed_interp == COFF_SymbolValueInterp_Common) { LNK_CommonBlockContrib *contrib = &task->u.common_block.contribs[cursor++]; @@ -4270,13 +4266,13 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT LNK_Symbol *null_import_desc = lnk_symbol_table_searchf(symtab, "__NULL_IMPORT_DESCRIPTOR"); LNK_Symbol *null_thunk_data = lnk_symbol_table_searchf(symtab, "\x7f%S_NULL_THUNK_DATA", lnk_get_image_name(config)); if (idata_sect && null_import_desc && null_thunk_data) { - COFF_ParsedSymbol null_import_desc_parsed = lnk_parsed_symbol_from_coff_symbol_idx(null_import_desc->defined.obj, null_import_desc->defined.symbol_idx); + COFF_ParsedSymbol null_import_desc_parsed = lnk_parse_symbol(null_import_desc); LNK_SectionContrib *idata_first_contrib = lnk_get_first_section_contrib(idata_sect); PE_DataDirectory *import_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_IMPORT); import_dir->virt_off = image_section_table[idata_first_contrib->u.sect_idx + 1]->voff + idata_first_contrib->u.off; import_dir->virt_size = null_import_desc_parsed.value - idata_first_contrib->u.off; - COFF_ParsedSymbol null_thunk_data_parsed = lnk_parsed_symbol_from_coff_symbol_idx(null_thunk_data->defined.obj, null_thunk_data->defined.symbol_idx); + COFF_ParsedSymbol null_thunk_data_parsed = lnk_parse_symbol(null_thunk_data); U64 null_thunk_data_voff = image_section_table[null_thunk_data_parsed.section_number]->voff + null_thunk_data_parsed.value; U64 first_import_foff = image_section_table[idata_first_contrib->u.sect_idx+1]->foff + idata_first_contrib->u.off; PE_ImportEntry *first_import = str8_deserial_get_raw_ptr(image_data, first_import_foff, sizeof(*first_import)); @@ -4292,7 +4288,7 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT LNK_Symbol *null_import_desc = lnk_symbol_table_search(symtab, str8_lit("__NULL_DELAY_IMPORT_DESCRIPTOR")); LNK_Symbol *last_null_thunk = lnk_symbol_table_searchf(symtab,"\x7f%S_NULL_THUNK_DATA_DLA", lnk_get_image_name(config)); if (didat_sect && null_import_desc && last_null_thunk) { - COFF_ParsedSymbol null_import_desc_parsed = lnk_parsed_symbol_from_coff_symbol_idx(null_import_desc->defined.obj, null_import_desc->defined.symbol_idx); + COFF_ParsedSymbol null_import_desc_parsed = lnk_parse_symbol(null_import_desc); LNK_SectionContrib *didat_first_contrib = lnk_get_first_section_contrib(didat_sect); PE_DataDirectory *import_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_DELAY_IMPORT); import_dir->virt_off = lnk_get_first_section_contrib_voff(image_section_table, didat_sect); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 1c7581a9..44d38728 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -3021,9 +3021,9 @@ THREAD_POOL_TASK_FUNC(lnk_build_pdb_public_symbols_defined_task) U64 node_idx = 0; for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - COFF_ParsedSymbol symbol_parsed = lnk_parsed_symbol_from_defined(symbol); + COFF_ParsedSymbol symbol_parsed = lnk_parse_symbol(symbol); - if (symbol_parsed.section_number == lnk_obj_get_removed_section_number(symbol->defined.obj)) { continue; } + if (symbol_parsed.section_number == lnk_obj_get_removed_section_number(symbol->ref.obj)) { continue; } COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); if (symbol_interp != COFF_SymbolValueInterp_Regular) { continue; } diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c index 514f0df7..fc5abf37 100644 --- a/src/linker/lnk_obj.c +++ b/src/linker/lnk_obj.c @@ -355,27 +355,27 @@ THREAD_POOL_TASK_FUNC(lnk_input_coff_symbol_table) if (sect_header->flags & COFF_SectionFlag_LnkRemove) { break; } - LNK_Symbol *defn = lnk_make_defined_symbol(arena, symbol.name, obj, symbol_idx); + LNK_Symbol *defn = lnk_make_obj_ref_symbol(arena, symbol.name, obj, symbol_idx); lnk_symbol_table_push_(task->symtab, arena, worker_id, defn); } } break; case COFF_SymbolValueInterp_Weak: { - LNK_Symbol *defn = lnk_make_defined_symbol(arena, symbol.name, obj, symbol_idx); + LNK_Symbol *defn = lnk_make_obj_ref_symbol(arena, symbol.name, obj, symbol_idx); lnk_symbol_table_push_(task->symtab, arena, worker_id, defn); } break; case COFF_SymbolValueInterp_Undefined: { if (symbol.storage_class == COFF_SymStorageClass_External) { - LNK_Symbol *defn = lnk_make_defined_symbol(arena, symbol.name, obj, symbol_idx); + LNK_Symbol *defn = lnk_make_obj_ref_symbol(arena, symbol.name, obj, symbol_idx); lnk_symbol_table_push_(task->symtab, arena, worker_id, defn); } } break; case COFF_SymbolValueInterp_Common: { - LNK_Symbol *defn = lnk_make_defined_symbol(arena, symbol.name, obj, symbol_idx); + LNK_Symbol *defn = lnk_make_obj_ref_symbol(arena, symbol.name, obj, symbol_idx); lnk_symbol_table_push_(task->symtab, arena, worker_id, defn); } break; case COFF_SymbolValueInterp_Abs: { if (symbol.storage_class == COFF_SymStorageClass_External) { - LNK_Symbol *defn = lnk_make_defined_symbol(arena, symbol.name, obj, symbol_idx); + LNK_Symbol *defn = lnk_make_obj_ref_symbol(arena, symbol.name, obj, symbol_idx); lnk_symbol_table_push_(task->symtab, arena, worker_id, defn); } } break; diff --git a/src/linker/lnk_symbol_table.c b/src/linker/lnk_symbol_table.c index 869ea4bc..024d5569 100644 --- a/src/linker/lnk_symbol_table.c +++ b/src/linker/lnk_symbol_table.c @@ -2,38 +2,38 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) internal LNK_Symbol * -lnk_make_defined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx) +lnk_make_obj_ref_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx) { - LNK_Symbol *symbol = push_array(arena, LNK_Symbol, 1); - symbol->name = name; - symbol->defined.obj = obj; - symbol->defined.symbol_idx = symbol_idx; + LNK_Symbol *symbol = push_array(arena, LNK_Symbol, 1); + symbol->name = name; + symbol->ref.obj = obj; + symbol->ref.symbol_idx = symbol_idx; return symbol; } internal B32 -lnk_symbol_defined_is_before(void *raw_a, void *raw_b) +lnk_symbol_is_before(void *raw_a, void *raw_b) { LNK_Symbol *a = raw_a, *b = raw_b; - LNK_Lib *a_lib = lnk_obj_get_lib(a->defined.obj); - LNK_Lib *b_lib = lnk_obj_get_lib(b->defined.obj); + LNK_Lib *a_lib = lnk_obj_get_lib(a->ref.obj); + LNK_Lib *b_lib = lnk_obj_get_lib(b->ref.obj); U32 a_lib_input_idx = a_lib ? a_lib->input_idx : 0; U32 b_lib_input_idx = b_lib ? b_lib->input_idx : 0; if (a_lib_input_idx == b_lib_input_idx) { - if (a->defined.obj->input_idx == b->defined.obj->input_idx) { - return a->defined.symbol_idx < b->defined.symbol_idx; + if (a->ref.obj->input_idx == b->ref.obj->input_idx) { + return a->ref.symbol_idx < b->ref.symbol_idx; } - return a->defined.obj->input_idx < b->defined.obj->input_idx; + return a->ref.obj->input_idx < b->ref.obj->input_idx; } return a_lib_input_idx < b_lib_input_idx; } internal B32 -lnk_symbol_defined_ptr_is_before(void *raw_a, void *raw_b) +lnk_symbol_ptr_is_before(void *raw_a, void *raw_b) { - return lnk_symbol_defined_is_before(*(LNK_Symbol **)raw_a, *(LNK_Symbol **)raw_b); + return lnk_symbol_is_before(*(LNK_Symbol **)raw_a, *(LNK_Symbol **)raw_b); } internal void @@ -120,7 +120,7 @@ lnk_symbol_hash_trie_chunk_list_push(Arena *arena, LNK_SymbolHashTrieChunkList * internal void lnk_error_multiply_defined_symbol(LNK_Symbol *dst, LNK_Symbol *src) { - lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, dst->defined.obj, "symbol \"%S\" (No. %#x) is multiply defined in %S (No. %#x)", dst->name, dst->defined.symbol_idx, src->defined.obj->path, src->defined.symbol_idx); + lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, dst->ref.obj, "symbol \"%S\" (No. %#x) is multiply defined in %S (No. %#x)", dst->name, dst->ref.symbol_idx, src->ref.obj->path, src->ref.symbol_idx); } internal B32 @@ -128,10 +128,10 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) { B32 can_replace = 0; - LNK_Obj *dst_obj = dst->defined.obj; - LNK_Obj *src_obj = src->defined.obj; - COFF_ParsedSymbol dst_parsed = lnk_parsed_symbol_from_coff_symbol_idx(dst->defined.obj, dst->defined.symbol_idx); - COFF_ParsedSymbol src_parsed = lnk_parsed_symbol_from_coff_symbol_idx(src->defined.obj, src->defined.symbol_idx); + LNK_Obj *dst_obj = dst->ref.obj; + LNK_Obj *src_obj = src->ref.obj; + COFF_ParsedSymbol dst_parsed = lnk_parsed_symbol_from_coff_symbol_idx(dst->ref.obj, dst->ref.symbol_idx); + COFF_ParsedSymbol src_parsed = lnk_parsed_symbol_from_coff_symbol_idx(src->ref.obj, src->ref.symbol_idx); COFF_SymbolValueInterpType dst_interp = coff_interp_from_parsed_symbol(dst_parsed); COFF_SymbolValueInterpType src_interp = coff_interp_from_parsed_symbol(src_parsed); @@ -151,7 +151,7 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) weak_parsed = src_parsed; } - COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(weak_parsed, weak->defined.obj->header.is_big_obj); + COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(weak_parsed, weak->ref.obj->header.is_big_obj); if (weak_ext->characteristics == COFF_WeakExt_SearchLibrary) { // NOTE: MSVC does not let a weak symbol to replace an undefined one, // but LLD links without errors or warnings, meaning undefined symbols @@ -163,12 +163,12 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) } else if (weak_ext->characteristics == COFF_WeakExt_SearchAlias) { can_replace = dst_interp == COFF_SymbolValueInterp_Undefined; } else { - can_replace = lnk_symbol_defined_is_before(src, dst); + can_replace = lnk_symbol_is_before(src, dst); } } // undefined vs undefined else if (dst_interp == COFF_SymbolValueInterp_Undefined && src_interp == COFF_SymbolValueInterp_Undefined) { - can_replace = lnk_symbol_defined_is_before(src, dst); + can_replace = lnk_symbol_is_before(src, dst); } // undefined vs common else if (dst_interp == COFF_SymbolValueInterp_Undefined && src_interp == COFF_SymbolValueInterp_Common) { @@ -196,7 +196,7 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) } // abs vs common else if (dst_interp == COFF_SymbolValueInterp_Abs && src_interp == COFF_SymbolValueInterp_Common) { - if (lnk_symbol_defined_is_before(dst, src)) { + if (lnk_symbol_is_before(dst, src)) { can_replace = 1; } else { lnk_error_multiply_defined_symbol(dst, src); @@ -204,7 +204,7 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) } // common vs abs else if (dst_interp == COFF_SymbolValueInterp_Common && src_interp == COFF_SymbolValueInterp_Abs) { - if (lnk_symbol_defined_is_before(dst, src)) { + if (lnk_symbol_is_before(dst, src)) { lnk_error_multiply_defined_symbol(dst, src); } } @@ -214,16 +214,16 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) } // weak vs weak else if (dst_interp == COFF_SymbolValueInterp_Weak && src_interp == COFF_SymbolValueInterp_Weak) { - COFF_SymbolWeakExt *dst_ext = coff_parse_weak_tag(dst_parsed, dst->defined.obj->header.is_big_obj); - COFF_SymbolWeakExt *src_ext = coff_parse_weak_tag(src_parsed, src->defined.obj->header.is_big_obj); + COFF_SymbolWeakExt *dst_ext = coff_parse_weak_tag(dst_parsed, dst->ref.obj->header.is_big_obj); + COFF_SymbolWeakExt *src_ext = coff_parse_weak_tag(src_parsed, src->ref.obj->header.is_big_obj); if ((dst_ext->characteristics == COFF_WeakExt_SearchAlias && src_ext->characteristics != COFF_WeakExt_SearchAlias)) { - if (lnk_symbol_defined_is_before(dst, src) || src_ext->characteristics == COFF_WeakExt_AntiDependency) { + if (lnk_symbol_is_before(dst, src) || src_ext->characteristics == COFF_WeakExt_AntiDependency) { can_replace = 0; } else { lnk_error_multiply_defined_symbol(dst, src); } } else if (dst_ext->characteristics != COFF_WeakExt_SearchAlias && src_ext->characteristics == COFF_WeakExt_SearchAlias) { - if (lnk_symbol_defined_is_before(src, dst) || dst_ext->characteristics == COFF_WeakExt_AntiDependency) { + if (lnk_symbol_is_before(src, dst) || dst_ext->characteristics == COFF_WeakExt_AntiDependency) { can_replace = 1; } else { lnk_error_multiply_defined_symbol(dst, src); @@ -231,7 +231,7 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) } else if (dst_ext->characteristics == COFF_WeakExt_SearchAlias && src_ext->characteristics == COFF_WeakExt_SearchAlias) { lnk_error_multiply_defined_symbol(dst, src); } else { - can_replace = lnk_symbol_defined_is_before(src, dst); + can_replace = lnk_symbol_is_before(src, dst); } } // weak vs regular/abs/common @@ -250,7 +250,7 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) U32 dst_section_length; U32 dst_check_sum; if (dst_interp == COFF_SymbolValueInterp_Regular) { - dst_is_comdat = lnk_try_comdat_props_from_section_number(dst->defined.obj, dst_parsed.section_number, &dst_select, 0, &dst_section_length, &dst_check_sum); + dst_is_comdat = lnk_try_comdat_props_from_section_number(dst->ref.obj, dst_parsed.section_number, &dst_select, 0, &dst_section_length, &dst_check_sum); } else if (dst_interp == COFF_SymbolValueInterp_Common) { dst_select = COFF_ComdatSelect_Largest; dst_section_length = dst_parsed.value; @@ -264,7 +264,7 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) U32 src_section_length, src_checks; U32 src_check_sum; if (src_interp == COFF_SymbolValueInterp_Regular) { - src_is_comdat = lnk_try_comdat_props_from_section_number(src->defined.obj, src_parsed.section_number, &src_select, 0, &src_section_length, &src_check_sum); + src_is_comdat = lnk_try_comdat_props_from_section_number(src->ref.obj, src_parsed.section_number, &src_select, 0, &src_section_length, &src_check_sum); } else if (src_interp == COFF_SymbolValueInterp_Common) { src_select = COFF_ComdatSelect_Largest; src_section_length = src_parsed.value; @@ -356,18 +356,18 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) internal void lnk_on_symbol_replace(LNK_Symbol *dst, LNK_Symbol *src) { - COFF_ParsedSymbol dst_parsed = lnk_parsed_symbol_from_coff_symbol_idx(dst->defined.obj, dst->defined.symbol_idx); + COFF_ParsedSymbol dst_parsed = lnk_parsed_symbol_from_coff_symbol_idx(dst->ref.obj, dst->ref.symbol_idx); COFF_SymbolValueInterpType dst_interp = coff_interp_from_parsed_symbol(dst_parsed); if (dst_interp == COFF_SymbolValueInterp_Regular) { // remove replaced section from the output - COFF_SectionHeader *dst_sect = lnk_coff_section_header_from_section_number(dst->defined.obj, dst_parsed.section_number); + COFF_SectionHeader *dst_sect = lnk_coff_section_header_from_section_number(dst->ref.obj, dst_parsed.section_number); dst_sect->flags |= COFF_SectionFlag_LnkRemove; // remove associated sections from the output - for (U32Node *associated_section = dst->defined.obj->associated_sections[dst_parsed.section_number]; + for (U32Node *associated_section = dst->ref.obj->associated_sections[dst_parsed.section_number]; associated_section != 0; associated_section = associated_section->next) { - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(dst->defined.obj, associated_section->data); + COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(dst->ref.obj, associated_section->data); section_header->flags |= COFF_SectionFlag_LnkRemove; } } @@ -375,10 +375,10 @@ lnk_on_symbol_replace(LNK_Symbol *dst, LNK_Symbol *src) // assert leader section is live #if BUILD_DEBUG { - COFF_ParsedSymbol src_parsed = lnk_parsed_symbol_from_coff_symbol_idx(src->defined.obj, src->defined.symbol_idx); + COFF_ParsedSymbol src_parsed = lnk_parsed_symbol_from_coff_symbol_idx(src->ref.obj, src->ref.symbol_idx); COFF_SymbolValueInterpType src_interp = coff_interp_from_parsed_symbol(src_parsed); if (src_interp == COFF_SymbolValueInterp_Regular) { - COFF_SectionHeader *src_sect = lnk_coff_section_header_from_section_number(src->defined.obj, src_parsed.section_number); + COFF_SectionHeader *src_sect = lnk_coff_section_header_from_section_number(src->ref.obj, src_parsed.section_number); AssertAlways(~src_sect->flags & COFF_SectionFlag_LnkRemove); } } @@ -506,32 +506,32 @@ lnk_array_from_symbol_hash_trie_chunk_list(Arena *arena, LNK_SymbolHashTrieChunk } internal COFF_ParsedSymbol -lnk_parsed_symbol_from_defined(LNK_Symbol *symbol) +lnk_parse_symbol(LNK_Symbol *symbol) { - return lnk_parsed_symbol_from_coff_symbol_idx(symbol->defined.obj, symbol->defined.symbol_idx); + return lnk_parsed_symbol_from_coff_symbol_idx(symbol->ref.obj, symbol->ref.symbol_idx); } internal COFF_SymbolValueInterpType -lnk_interp_from_symbol(LNK_Symbol *symbol) +lnk_interp_symbol(LNK_Symbol *symbol) { - COFF_ParsedSymbol symbol_parsed = lnk_parsed_symbol_from_defined(symbol); + COFF_ParsedSymbol symbol_parsed = lnk_parse_symbol(symbol); return coff_interp_from_parsed_symbol(symbol_parsed); } -internal LNK_SymbolDefined -lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol) +internal LNK_ObjSymbolRef +lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol) { Temp scratch = scratch_begin(0,0); - struct S { struct S *next; LNK_SymbolDefined symbol; B32 is_anti_dep; }; + struct S { struct S *next; LNK_ObjSymbolRef symbol; B32 is_anti_dep; }; struct S *sf = 0, *sl = 0; - LNK_SymbolDefined current_symbol = symbol; + LNK_ObjSymbolRef current_symbol = symbol; for (;;) { // guard against self-referencing weak symbols struct S *was_visited = 0; for (struct S *s = sf; s != 0; s = s->next) { - if (MemoryCompare(&s->symbol, ¤t_symbol, sizeof(LNK_SymbolDefined)) == 0) { was_visited = s; break; } + if (MemoryCompare(&s->symbol, ¤t_symbol, sizeof(LNK_ObjSymbolRef)) == 0) { was_visited = s; break; } } if (was_visited) { String8List chain = {0}; @@ -559,10 +559,10 @@ lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol) // does weak symbol have a definition? LNK_Symbol *defn_symbol = lnk_symbol_table_search(symtab, current_parsed.name); - COFF_ParsedSymbol defn_parsed = lnk_parsed_symbol_from_coff_symbol_idx(defn_symbol->defined.obj, defn_symbol->defined.symbol_idx); + COFF_ParsedSymbol defn_parsed = lnk_parsed_symbol_from_coff_symbol_idx(defn_symbol->ref.obj, defn_symbol->ref.symbol_idx); COFF_SymbolValueInterpType defn_interp = coff_interp_symbol(defn_parsed.section_number, defn_parsed.value, defn_parsed.storage_class); if (defn_interp != COFF_SymbolValueInterp_Weak) { - current_symbol = defn_symbol->defined; + current_symbol = defn_symbol->ref; break; } @@ -571,24 +571,24 @@ lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol) // no definition -- fallback to default symbol COFF_ParsedSymbol tag_parsed = lnk_parsed_symbol_from_coff_symbol_idx(current_symbol.obj, weak_ext->tag_index); COFF_SymbolValueInterpType tag_interp = coff_interp_symbol(tag_parsed.section_number, tag_parsed.value, tag_parsed.storage_class); - current_symbol = (LNK_SymbolDefined){ .obj = current_symbol.obj, .symbol_idx = weak_ext->tag_index }; + current_symbol = (LNK_ObjSymbolRef){ .obj = current_symbol.obj, .symbol_idx = weak_ext->tag_index }; if (weak_ext->characteristics == COFF_WeakExt_AntiDependency) { if (tag_interp == COFF_SymbolValueInterp_Undefined || tag_interp == COFF_SymbolValueInterp_Weak) { LNK_Symbol *dep_symbol = lnk_symbol_table_search(symtab, tag_parsed.name); - tag_interp = lnk_interp_from_symbol(dep_symbol); + tag_interp = lnk_interp_symbol(dep_symbol); } if (tag_interp == COFF_SymbolValueInterp_Weak) { goto exit; } } } else if (current_interp == COFF_SymbolValueInterp_Undefined) { LNK_Symbol *defn_symbol = lnk_symbol_table_search(symtab, current_parsed.name); - COFF_SymbolValueInterpType defn_interp = lnk_interp_from_symbol(defn_symbol); + COFF_SymbolValueInterpType defn_interp = lnk_interp_symbol(defn_symbol); // unresolved undefined symbol if (defn_interp == COFF_SymbolValueInterp_Undefined) { break; } // follow symbol definition - current_symbol = defn_symbol->defined; + current_symbol = defn_symbol->ref; } else { break; } } @@ -666,15 +666,15 @@ THREAD_POOL_TASK_FUNC(lnk_replace_weak_with_default_symbol_task) LNK_SymbolHashTrieChunk *chunk = task->chunks[task_id]; for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - COFF_ParsedSymbol symbol_parsed = lnk_parsed_symbol_from_defined(symbol); + COFF_ParsedSymbol symbol_parsed = lnk_parse_symbol(symbol); COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); if (symbol_interp == COFF_SymbolValueInterp_Weak) { - LNK_SymbolDefined resolve = lnk_resolve_weak_symbol(symtab, symbol->defined); + LNK_ObjSymbolRef resolve = lnk_resolve_weak_symbol(symtab, symbol->ref); COFF_ParsedSymbol resolve_parsed = lnk_parsed_symbol_from_coff_symbol_idx(resolve.obj, resolve.symbol_idx); COFF_SymbolValueInterpType resolve_interp = coff_interp_from_parsed_symbol(resolve_parsed); if (resolve_interp == COFF_SymbolValueInterp_Weak) { - COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(resolve_parsed, symbol->defined.obj->header.is_big_obj); - if (symbol->defined.obj->header.is_big_obj) { + COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(resolve_parsed, symbol->ref.obj->header.is_big_obj); + if (symbol->ref.obj->header.is_big_obj) { COFF_Symbol32 *symbol32 = symbol_parsed.raw_symbol; symbol32->section_number = COFF_Symbol_UndefinedSection; symbol32->value = 0; @@ -686,7 +686,7 @@ THREAD_POOL_TASK_FUNC(lnk_replace_weak_with_default_symbol_task) symbol16->storage_class = COFF_SymStorageClass_External; } } else { - symbol->defined = resolve; + symbol->ref = resolve; } } } @@ -708,7 +708,7 @@ lnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab) LNK_SymbolHashTrieChunk *chunk = chunks[chunk_idx]; for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; - COFF_SymbolValueInterpType symbol_interp = lnk_interp_from_symbol(symbol); + COFF_SymbolValueInterpType symbol_interp = lnk_interp_symbol(symbol); AssertAlways(symbol_interp != COFF_SymbolValueInterp_Weak); } } @@ -721,7 +721,7 @@ lnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab) internal ISectOff lnk_sc_from_symbol(LNK_Symbol *symbol) { - COFF_ParsedSymbol parsed_symbol = lnk_parsed_symbol_from_coff_symbol_idx(symbol->defined.obj, symbol->defined.symbol_idx); + COFF_ParsedSymbol parsed_symbol = lnk_parsed_symbol_from_coff_symbol_idx(symbol->ref.obj, symbol->ref.symbol_idx); ISectOff sc = {0}; sc.isect = parsed_symbol.section_number; diff --git a/src/linker/lnk_symbol_table.h b/src/linker/lnk_symbol_table.h index d7554022..cc633568 100644 --- a/src/linker/lnk_symbol_table.h +++ b/src/linker/lnk_symbol_table.h @@ -5,17 +5,17 @@ // --- Symbol ------------------------------------------------------------------ -typedef struct LNK_SymbolDefined +typedef struct LNK_ObjSymbolRef { struct LNK_Obj *obj; U32 symbol_idx; -} LNK_SymbolDefined; +} LNK_ObjSymbolRef; typedef struct LNK_Symbol { - String8 name; - B8 is_lib_member_linked; - LNK_SymbolDefined defined; + String8 name; + B8 is_lib_member_linked; + LNK_ObjSymbolRef ref; } LNK_Symbol; // --- Symbol Containers ------------------------------------------------------- @@ -88,7 +88,7 @@ typedef struct // --- Symbol Make ------------------------------------------------------------- -internal LNK_Symbol * lnk_make_defined_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx); +internal LNK_Symbol * lnk_make_obj_ref_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx); // --- Symbol Containers ------------------------------------------------------ @@ -109,9 +109,9 @@ internal LNK_SymbolHashTrieChunk ** lnk_array_from_symbol_hash_trie_chunk_list(A // --- Symbol Helpers ---------------------------------------------------------- -internal COFF_ParsedSymbol lnk_parsed_symbol_from_defined(LNK_Symbol *symbol); -internal COFF_SymbolValueInterpType lnk_interp_from_symbol(LNK_Symbol *symbol); -internal LNK_SymbolDefined lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_SymbolDefined symbol); +internal COFF_ParsedSymbol lnk_parse_symbol(LNK_Symbol *symbol); +internal COFF_SymbolValueInterpType lnk_interp_symbol(LNK_Symbol *symbol); +internal LNK_ObjSymbolRef lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol); // --- Symbol Table ------------------------------------------------------------