mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-01 11:48:10 +00:00
improve unresolved symbol errors
- collect symbol references and print out objs that reference unresolved symbol - print source file location of the references
This commit is contained in:
committed by
Ryan Fleury
parent
d92f45784d
commit
a6432cce8e
+158
-78
@@ -194,6 +194,11 @@ lnk_config_from_argcv(Arena *arena, int argc, char **argv)
|
||||
lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".gfids");
|
||||
lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".gxfg");
|
||||
|
||||
// set limits on unresolved symbol errors
|
||||
lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_MapLinesForUnresolvedSymbols, "");
|
||||
lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_UnresolvedSymbolLimit, "1000");
|
||||
lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit, "10");
|
||||
|
||||
// set default max worker count
|
||||
if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_SharedThreadPool)) {
|
||||
lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, "");
|
||||
@@ -1507,22 +1512,24 @@ lnk_link_inputs_(TP_Context *tp,
|
||||
LNK_Symbol *symbol = c->v[i].symbol;
|
||||
if (symbol->is_lib_member_linked) { continue; }
|
||||
|
||||
LNK_ObjSymbolRef symbol_ref = lnk_get_obj_symbol_ref(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;
|
||||
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 (symbol_interp == COFF_SymbolValueInterp_Weak) {
|
||||
COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(symbol_parsed, symbol->ref.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_ObjSymbolRef dep_symbol = lnk_resolve_weak_symbol(symtab, symbol->ref);
|
||||
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) {
|
||||
@@ -1569,8 +1576,9 @@ lnk_link_inputs_(TP_Context *tp,
|
||||
hash_table_push_string_raw(imps->arena, imps->import_stub_ht, import_header.func_name, 0);
|
||||
|
||||
// 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_obj_ref_symbol(symtab->arena->v[0], link_symbol->name, import_stub->ref.obj, import_stub->ref.symbol_idx);
|
||||
LNK_Symbol *import_stub = lnk_symbol_table_search(symtab, str8_lit(LNK_IMPORT_STUB));
|
||||
LNK_ObjSymbolRef import_symbol_ref = lnk_get_obj_symbol_ref(import_stub);
|
||||
LNK_Symbol *import_symbol = lnk_make_obj_ref_symbol(symtab->arena->v[0], link_symbol->name, import_symbol_ref.obj, import_symbol_ref.symbol_idx);
|
||||
lnk_symbol_table_push(symtab, import_symbol);
|
||||
|
||||
// search DLL symbol list
|
||||
@@ -1936,45 +1944,116 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer
|
||||
//
|
||||
{
|
||||
ProfBegin("Report Unresolved Symbols");
|
||||
U64 chunks_count = 0;
|
||||
LNK_SymbolHashTrieChunk **chunks = lnk_array_from_symbol_hash_trie_chunk_list(scratch.arena, symtab->chunks, symtab->arena->count, &chunks_count);
|
||||
|
||||
U64 count = 0;
|
||||
for EachIndex(chunk_idx, chunks_count) {
|
||||
LNK_SymbolHashTrieChunk *chunk = chunks[chunk_idx];
|
||||
for EachIndex(i, chunk->count) {
|
||||
LNK_Symbol *symbol = chunk->v[i].symbol;
|
||||
COFF_SymbolValueInterpType symbol_interp = lnk_interp_symbol(symbol);
|
||||
if (symbol_interp == COFF_SymbolValueInterp_Undefined) {
|
||||
count += 1;
|
||||
U64 unresolved_symbols_count = 0;
|
||||
LNK_Symbol **unresolved_symbols = 0;
|
||||
{
|
||||
U64 chunks_count = 0;
|
||||
LNK_SymbolHashTrieChunk **chunks = lnk_array_from_symbol_hash_trie_chunk_list(scratch.arena, symtab->chunks, symtab->arena->count, &chunks_count);
|
||||
|
||||
for EachIndex(chunk_idx, chunks_count) {
|
||||
LNK_SymbolHashTrieChunk *chunk = chunks[chunk_idx];
|
||||
for EachIndex(i, chunk->count) {
|
||||
LNK_Symbol *symbol = chunk->v[i].symbol;
|
||||
COFF_SymbolValueInterpType symbol_interp = lnk_interp_symbol(symbol);
|
||||
if (symbol_interp == COFF_SymbolValueInterp_Undefined) {
|
||||
unresolved_symbols_count += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U64 cursor = 0;
|
||||
LNK_Symbol **unresolved = push_array(scratch.arena, LNK_Symbol *, count);
|
||||
for EachIndex(chunk_idx, chunks_count) {
|
||||
LNK_SymbolHashTrieChunk *chunk = chunks[chunk_idx];
|
||||
for EachIndex(i, chunk->count) {
|
||||
LNK_Symbol *symbol = chunk->v[i].symbol;
|
||||
COFF_SymbolValueInterpType symbol_interp = lnk_interp_symbol(symbol);
|
||||
if (symbol_interp == COFF_SymbolValueInterp_Undefined) {
|
||||
unresolved[cursor++] = chunk->v[i].symbol;
|
||||
unresolved_symbols = push_array(scratch.arena, LNK_Symbol *, unresolved_symbols_count);
|
||||
if (unresolved_symbols_count) {
|
||||
U64 cursor = 0;
|
||||
for EachIndex(chunk_idx, chunks_count) {
|
||||
LNK_SymbolHashTrieChunk *chunk = chunks[chunk_idx];
|
||||
for EachIndex(i, chunk->count) {
|
||||
LNK_Symbol *symbol = chunk->v[i].symbol;
|
||||
if (lnk_interp_symbol(symbol) == COFF_SymbolValueInterp_Undefined) {
|
||||
unresolved_symbols[cursor++] = chunk->v[i].symbol;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
radsort(unresolved_symbols, unresolved_symbols_count, lnk_symbol_ptr_is_before);
|
||||
}
|
||||
|
||||
radsort(unresolved, count, lnk_symbol_ptr_is_before);
|
||||
for EachIndex(i, unresolved_symbols_count) {
|
||||
LNK_Symbol *symbol = unresolved_symbols[i];
|
||||
|
||||
for EachIndex(i, count) {
|
||||
LNK_Symbol *symbol = unresolved[i];
|
||||
lnk_error_obj(LNK_Error_UnresolvedSymbol, symbol->ref.obj, "unresolved symbol %S", symbol->name);
|
||||
if (i > config->unresolved_symbol_limit) {
|
||||
lnk_error(LNK_Error_UnresolvedSymbol, "too many unresolved symbol errors, stopping now");
|
||||
break;
|
||||
}
|
||||
|
||||
String8List supp_info = {0};
|
||||
{
|
||||
U64 refs_count = 0;
|
||||
LNK_ObjSymbolRef **refs = lnk_get_obj_symbol_ref_many(scratch.arena, symbol, &refs_count);
|
||||
for EachIndex(ref_idx, refs_count) {
|
||||
LNK_ObjSymbolRef *ref = refs[ref_idx];
|
||||
LNK_Obj *obj = ref->obj;
|
||||
COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj);
|
||||
String8 string_table = lnk_coff_string_table_from_obj(obj);
|
||||
|
||||
CV_DebugS debug_s = {0};
|
||||
CV_LinesAccel *debug_lines = 0;
|
||||
String8 debug_checksums = {0};
|
||||
String8 debug_strings = {0};
|
||||
|
||||
for EachIndex(sect_idx, obj->header.section_count_no_null) {
|
||||
COFF_SectionHeader *section_header = §ion_table[sect_idx];
|
||||
String8 section_name = coff_name_from_section_header(string_table, section_header);
|
||||
U64 section_number = sect_idx+1;
|
||||
COFF_RelocArray relocs = lnk_coff_relocs_from_section_header(obj, section_header);
|
||||
for EachIndex(reloc_idx, relocs.count) {
|
||||
if (supp_info.node_count > config->unresolved_symbol_ref_limit) {
|
||||
str8_list_pushf(scratch.arena, &supp_info, "too many unresolved symbol references reported, stopping now");
|
||||
break;
|
||||
}
|
||||
COFF_Reloc *reloc = &relocs.v[reloc_idx];
|
||||
if (reloc->isymbol == ref->symbol_idx) {
|
||||
U64 line_matches_count = 0;
|
||||
CV_Line *line_matches = 0;
|
||||
if (config->map_lines_for_unresolved_symbols == LNK_SwitchState_Yes) {
|
||||
if (debug_lines == 0) {
|
||||
debug_s = lnk_debug_s_from_obj(scratch.arena, obj);
|
||||
debug_lines = cv_lines_accel_from_debug_s(scratch.arena, debug_s);
|
||||
debug_checksums = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms).first->string;
|
||||
debug_strings = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_StringTable).first->string;
|
||||
}
|
||||
line_matches_count = 0;
|
||||
line_matches = cv_line_from_voff(debug_lines, reloc->apply_off, &line_matches_count);
|
||||
}
|
||||
|
||||
if (line_matches) {
|
||||
for EachIndex(i, line_matches_count) {
|
||||
CV_Line line = line_matches[i];
|
||||
CV_C13Checksum checksum = {0};
|
||||
String8 file_name = {0};
|
||||
str8_deserial_read_struct(debug_checksums, line.file_off, &checksum);
|
||||
str8_deserial_read_cstr(debug_strings, checksum.name_off, &file_name);
|
||||
str8_list_pushf(scratch.arena, &supp_info, "%S: %S:%u", lnk_loc_from_obj(scratch.arena, obj), file_name, line.line_num);
|
||||
}
|
||||
} else {
|
||||
str8_list_pushf(scratch.arena, &supp_info, "%S: %S(%llx)+%x", lnk_loc_from_obj(scratch.arena, obj), section_name, section_number, reloc->apply_off);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lnk_error(LNK_Error_UnresolvedSymbol, "unresolved symbol %S", symbol->name);
|
||||
lnk_supplement_error_list(supp_info);
|
||||
}
|
||||
|
||||
// TODO: /FORCE
|
||||
if (count) {
|
||||
if (unresolved_symbols_count) {
|
||||
lnk_exit(LNK_Error_UnresolvedSymbol);
|
||||
}
|
||||
|
||||
ProfEnd();
|
||||
}
|
||||
|
||||
@@ -2054,13 +2133,14 @@ lnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *config, LNK_Obj
|
||||
|
||||
// push tasks for each root symbol
|
||||
for (LNK_IncludeSymbolNode *root_n = config->include_symbol_list.first; root_n != 0; root_n = root_n->next) {
|
||||
LNK_Symbol *root = lnk_symbol_table_search(symtab, root_n->v.name);
|
||||
LNK_Symbol *root = lnk_symbol_table_search(symtab, root_n->v.name);
|
||||
LNK_ObjSymbolRef root_ref = lnk_get_obj_symbol_ref(root);
|
||||
|
||||
struct Task *t = push_array(scratch.arena, struct Task, 1);
|
||||
t->obj = root->ref.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->ref.symbol_idx;
|
||||
t->relocs.v[0].isymbol = root_ref.symbol_idx;
|
||||
|
||||
SLLStackPush(task_stack, t);
|
||||
}
|
||||
@@ -2113,20 +2193,20 @@ lnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *config, LNK_Obj
|
||||
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->ref;
|
||||
ref_symbol = lnk_get_obj_symbol_ref(symlink);
|
||||
}
|
||||
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->ref;
|
||||
next_ref = lnk_get_obj_symbol_ref(defn);
|
||||
} 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->ref;
|
||||
next_ref = lnk_get_obj_symbol_ref(defn);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
@@ -2227,14 +2307,14 @@ lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymb
|
||||
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->ref : symbol;
|
||||
*symbol_out = symlink ? lnk_get_obj_symbol_ref(symlink) : 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->ref.obj, defn->ref.symbol_idx);
|
||||
COFF_SymbolValueInterpType defn_interp = coff_interp_symbol(defn_parsed.section_number, defn_parsed.value, defn_parsed.storage_class);
|
||||
COFF_ParsedSymbol defn_parsed = lnk_parse_symbol(defn);
|
||||
COFF_SymbolValueInterpType defn_interp = lnk_interp_symbol(defn);
|
||||
if (defn_interp != COFF_SymbolValueInterp_Undefined) {
|
||||
*symbol_out = defn->ref;
|
||||
*symbol_out = lnk_get_obj_symbol_ref(defn);
|
||||
} else {
|
||||
is_resolved = 0;
|
||||
}
|
||||
@@ -2242,19 +2322,19 @@ lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymb
|
||||
case COFF_SymbolValueInterp_Undefined: {
|
||||
LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name);
|
||||
if (defn) {
|
||||
*symbol_out = defn->ref;
|
||||
*symbol_out = lnk_get_obj_symbol_ref(defn);
|
||||
} else {
|
||||
is_resolved = 0;
|
||||
}
|
||||
} break;
|
||||
case COFF_SymbolValueInterp_Common: {
|
||||
LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name);
|
||||
*symbol_out = defn->ref;
|
||||
*symbol_out = lnk_get_obj_symbol_ref(defn);
|
||||
} 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->ref;
|
||||
*symbol_out = lnk_get_obj_symbol_ref(defn);
|
||||
} else {
|
||||
*symbol_out = symbol;
|
||||
}
|
||||
@@ -2379,7 +2459,8 @@ THREAD_POOL_TASK_FUNC(lnk_set_comdat_leaders_contribs_task)
|
||||
if (symlink == 0) { continue; }
|
||||
|
||||
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];
|
||||
LNK_ObjSymbolRef symlink_ref = lnk_get_obj_symbol_ref(symlink);
|
||||
task->sect_map[obj_idx][sect_idx] = task->sect_map[symlink_ref.obj->input_idx][symlink_parsed.section_number - 1];
|
||||
}
|
||||
ProfEnd();
|
||||
}
|
||||
@@ -2422,29 +2503,32 @@ 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->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_parse_symbol(symlink);
|
||||
section_number = symbol.section_number;
|
||||
value = parsed_symlink.value;
|
||||
} else {
|
||||
// COMDAT section may have static symbols which are now invalid to relocate against
|
||||
section_number = LNK_REMOVED_SECTION_NUMBER_32;
|
||||
value = max_U32;
|
||||
task->u.patch_symtabs.was_symbol_patched[obj_idx][symbol_idx] = 1;
|
||||
}
|
||||
if (symlink) {
|
||||
LNK_ObjSymbolRef symlink_ref = lnk_get_obj_symbol_ref(symlink);
|
||||
if (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_parse_symbol(symlink);
|
||||
section_number = symbol.section_number;
|
||||
value = parsed_symlink.value;
|
||||
} else {
|
||||
// COMDAT section may have static symbols which are now invalid to relocate against
|
||||
section_number = LNK_REMOVED_SECTION_NUMBER_32;
|
||||
value = max_U32;
|
||||
task->u.patch_symtabs.was_symbol_patched[obj_idx][symbol_idx] = 1;
|
||||
}
|
||||
|
||||
if (obj->header.is_big_obj) {
|
||||
COFF_Symbol32 *symbol32 = symbol.raw_symbol;
|
||||
symbol32->section_number = section_number;
|
||||
symbol32->value = value;
|
||||
} else {
|
||||
COFF_Symbol16 *symbol16 = symbol.raw_symbol;
|
||||
symbol16->section_number = (U16)section_number;
|
||||
symbol16->value = value;
|
||||
if (obj->header.is_big_obj) {
|
||||
COFF_Symbol32 *symbol32 = symbol.raw_symbol;
|
||||
symbol32->section_number = section_number;
|
||||
symbol32->value = value;
|
||||
} else {
|
||||
COFF_Symbol16 *symbol16 = symbol.raw_symbol;
|
||||
symbol16->section_number = (U16)section_number;
|
||||
symbol16->value = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2504,11 +2588,11 @@ 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->ref.obj;
|
||||
COFF_ParsedSymbol parsed_symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol->ref.symbol_idx);
|
||||
LNK_ObjSymbolRef symbol_ref = lnk_get_obj_symbol_ref(symbol);
|
||||
COFF_ParsedSymbol parsed_symbol = lnk_parse_symbol(symbol);
|
||||
U64 section_number = task->u.patch_symtabs.common_block_sect->sect_idx + 1;
|
||||
|
||||
if (obj->header.is_big_obj) {
|
||||
if (symbol_ref.obj->header.is_big_obj) {
|
||||
COFF_Symbol32 *symbol32 = parsed_symbol.raw_symbol;
|
||||
symbol32->value = contrib->u.offset;
|
||||
symbol32->section_number = safe_cast_u32(section_number);
|
||||
@@ -2518,7 +2602,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->ref.symbol_idx] = 1;
|
||||
task->u.patch_symtabs.was_symbol_patched[symbol_ref.obj->input_idx][symbol_ref.symbol_idx] = 1;
|
||||
}
|
||||
|
||||
ProfEnd();
|
||||
@@ -2536,11 +2620,10 @@ THREAD_POOL_TASK_FUNC(lnk_patch_common_block_symbols_task)
|
||||
for (U64 symbol_idx = 0; symbol_idx < obj->header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {
|
||||
symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx);
|
||||
COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class);
|
||||
|
||||
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->ref.obj, defn->ref.symbol_idx);
|
||||
Assert(coff_interp_symbol(defn_parsed.section_number, defn_parsed.value, defn_parsed.storage_class) == COFF_SymbolValueInterp_Regular);
|
||||
COFF_ParsedSymbol defn_parsed = lnk_parse_symbol(defn);
|
||||
Assert(lnk_interp_symbol(defn) == COFF_SymbolValueInterp_Regular);
|
||||
if (defn) {
|
||||
if (obj->header.is_big_obj) {
|
||||
COFF_Symbol32 *symbol32 = symbol.raw_symbol;
|
||||
@@ -2720,13 +2803,10 @@ THREAD_POOL_TASK_FUNC(lnk_obj_reloc_patcher)
|
||||
Rng1U64 section_frange = rng_1u64(section_header->foff, section_header->foff + section_header->fsize);
|
||||
String8 section_data = str8_substr(data, section_frange);
|
||||
|
||||
// find section relocs
|
||||
COFF_RelocInfo reloc_info = coff_reloc_info_from_section_header(obj->data, section_header);
|
||||
COFF_Reloc *relocs = (COFF_Reloc *)(obj->data.str + reloc_info.array_off);
|
||||
|
||||
// apply relocs
|
||||
for EachIndex(reloc_idx, reloc_info.count) {
|
||||
COFF_Reloc *reloc = &relocs[reloc_idx];
|
||||
COFF_RelocArray relocs = lnk_coff_relocs_from_section_header(obj, section_header);
|
||||
for EachIndex(reloc_idx, relocs.count) {
|
||||
COFF_Reloc *reloc = &relocs.v[reloc_idx];
|
||||
|
||||
// error check relocation
|
||||
if (obj->header.machine == COFF_MachineType_X64) {
|
||||
|
||||
Reference in New Issue
Block a user