remove per-section linker side arrays

This commit is contained in:
Nikita Smith committed 2026-08-24 22:27:21 -07:00
1 parent 646ff97b3c
commit 736a6c63a5
5 files changed
+51 -76

No files matched your search

+31 -31
View File
@@ -2383,7 +2383,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer
if ( ! lnk_do_debug_info(config)) { sect_filter |= LNK_SECTION_FLAG_DEBUG; } // on /DEBUG:NONE linker never invokes the debug info machinery
for EachIndex(sect_idx, obj->coff.sections.count) {
if (obj->coff.sections.flags[sect_idx] & sect_filter) { continue; }
if (obj->coff.sections.headers[sect_idx].flags & sect_filter) { continue; }
// unpack section and relocations
COFF_SectionHeader *section_header = &section_table[sect_idx];
@@ -2708,7 +2708,7 @@ THREAD_POOL_TASK_FUNC(lnk_opt_ref_task)
is_live[obj_idx] = push_array(scratch.arena, U8, obj->coff.sections.count + 1);
for EachIndex(sect_idx, obj->coff.sections.count) {
is_live[obj_idx][sect_idx + 1] = !(obj->coff.sections.flags[sect_idx] & COFF_SectionFlag_LnkCOMDAT);
is_live[obj_idx][sect_idx + 1] = !(obj->coff.sections.headers[sect_idx].flags & COFF_SectionFlag_LnkCOMDAT);
}
}
}
@@ -2741,7 +2741,7 @@ THREAD_POOL_TASK_FUNC(lnk_opt_ref_task)
for EachIndex(sect_idx, obj->coff.sections.count) {
U32 section_number = sect_idx+1;
COFF_SectionFlags section_flags = obj->coff.sections.flags[sect_idx];
COFF_SectionFlags section_flags = obj->coff.sections.headers[sect_idx].flags;
// is section eligible for walking?
if (section_flags & COFF_SectionFlag_LnkRemove) { continue; }
@@ -2806,7 +2806,7 @@ THREAD_POOL_TASK_FUNC(lnk_opt_ref_task)
for EachNode(section_n, U32Node, associated_sections.first) {
U32 section_number = section_n->data;
COFF_SectionFlags section_flags = ref_symbol.obj->coff.sections.flags[section_number-1];
COFF_SectionFlags section_flags = ref_symbol.obj->coff.sections.headers[section_number-1].flags;
// on first section visit, set live flag and enqueue section
U8 was_visited = ins_atomic_u8_eval_assign(&is_live[ref_symbol.obj->input_idx][section_number], 1);
@@ -2877,7 +2877,7 @@ THREAD_POOL_TASK_FUNC(lnk_opt_ref_task)
U32 section_number = sect_idx+1;
COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number);
if ( ! is_live[obj->input_idx][section_number]) {
obj->coff.sections.flags[sect_idx] |= COFF_SectionFlag_LnkRemove;
obj->coff.sections.headers[sect_idx].flags |= COFF_SectionFlag_LnkRemove;
}
}
}
@@ -2895,19 +2895,19 @@ THREAD_POOL_TASK_FUNC(lnk_opt_ref_task)
COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number);
U64 stat_kind = Stat_Null;
if (obj->coff.sections.flags[sect_idx] & LNK_SECTION_FLAG_DEBUG) { stat_kind = Stat_Debug; }
else if (obj->coff.sections.flags[sect_idx] & COFF_SectionFlag_CntCode) { stat_kind = Stat_Code; }
if (obj->coff.sections.headers[sect_idx].flags & LNK_SECTION_FLAG_DEBUG) { stat_kind = Stat_Debug; }
else if (obj->coff.sections.headers[sect_idx].flags & COFF_SectionFlag_CntCode) { stat_kind = Stat_Code; }
else { stat_kind = Stat_Data; }
if (is_live[obj->input_idx][section_number]) {
stats[stat_kind].live_count += 1;
if (obj->coff.sections.flags[sect_idx] & COFF_SectionFlag_CntUninitializedData) {
if (obj->coff.sections.headers[sect_idx].flags & COFF_SectionFlag_CntUninitializedData) {
stats[stat_kind].live_vsize += section_header->vsize;
} else {
stats[stat_kind].live_fsize += section_header->fsize;
}
} else {
if (obj->coff.sections.flags[sect_idx] & COFF_SectionFlag_CntUninitializedData) {
if (obj->coff.sections.headers[sect_idx].flags & COFF_SectionFlag_CntUninitializedData) {
stats[stat_kind].vsize += section_header->vsize;
} else {
stats[stat_kind].fsize += section_header->fsize;
@@ -2978,16 +2978,16 @@ lnk_icf_scope_from_section(LNK_Obj *obj, U32 sect_idx)
// * section flags filter *
COFF_SectionFlags expected_flags = COFF_SectionFlag_LnkCOMDAT | COFF_SectionFlag_MemRead;
COFF_SectionFlags exclude_flags = COFF_SectionFlag_LnkRemove | COFF_SectionFlag_MemWrite | LNK_SECTION_FLAG_NOICF;
if ((obj->coff.sections.flags[sect_idx] & expected_flags) != expected_flags || (obj->coff.sections.flags[sect_idx] & exclude_flags) != 0) {
if ((obj->coff.sections.headers[sect_idx].flags & expected_flags) != expected_flags || (obj->coff.sections.headers[sect_idx].flags & exclude_flags) != 0) {
goto exit;
}
if (obj->coff.sections.flags[sect_idx] & COFF_SectionFlag_CntCode) {
if (obj->coff.sections.headers[sect_idx].flags & COFF_SectionFlag_CntCode) {
result = LNK_ICF_Scope_Code;
goto exit;
}
if (obj->coff.sections.flags[sect_idx] & COFF_SectionFlag_CntInitializedData) {
if (obj->coff.sections.headers[sect_idx].flags & COFF_SectionFlag_CntInitializedData) {
U64 section_number = sect_idx + 1;
COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number);
String8 section_name = str8_cstring_capped(section_header->name, section_header->name + sizeof(section_header->name));
@@ -3141,12 +3141,12 @@ THREAD_POOL_TASK_FUNC(lnk_opt_icf_task)
if (is_symbol_found) {
COFF_ParsedSymbol symbol = lnk_parsed_symbol_from_coff_symbol_idx_no_name(target_ref.obj, target_ref.symbol_idx);
if (coff_interp_from_parsed_symbol(symbol) == COFF_SymbolValueInterp_Regular) {
target_ref.obj->coff.sections.flags[symbol.section_number - 1] |= LNK_SECTION_FLAG_NOICF;
target_ref.obj->coff.sections.headers[symbol.section_number - 1].flags |= LNK_SECTION_FLAG_NOICF;
}
} else {
COFF_ParsedSymbol original_symbol = lnk_parsed_symbol_from_coff_symbol_idx_no_name(obj, symbol_idx);
if (coff_interp_from_parsed_symbol(original_symbol) == COFF_SymbolValueInterp_Regular) {
obj->coff.sections.flags[original_symbol.section_number - 1] |= LNK_SECTION_FLAG_NOICF;
obj->coff.sections.headers[original_symbol.section_number - 1].flags |= LNK_SECTION_FLAG_NOICF;
} else {
lnk_log(LNK_Log_Debug, "%S: .llvm_addrsig: contains an unresolved symbol index 0x%x at offset 0x%x", lnk_loc_from_obj(scratch.arena, obj), symbol_idx, symbol_off);
}
@@ -3303,7 +3303,7 @@ THREAD_POOL_TASK_FUNC(lnk_opt_icf_task)
// use the selected COMDAT leader so equivalent targets hash alike
if (target_sect != 0 && target_sect <= target_obj->coff.sections.count &&
target_obj->coff.sections.flags[target_sect - 1] & COFF_SectionFlag_LnkCOMDAT) {
target_obj->coff.sections.headers[target_sect - 1].flags & COFF_SectionFlag_LnkCOMDAT) {
LNK_ObjSymbolRef leader_ref = {0};
if (lnk_obj_get_comdat_symlink(target_obj, target_sect, &leader_ref)) {
COFF_ParsedSymbol leader_symbol = lnk_parsed_symbol_from_coff_symbol_idx_no_name(leader_ref.obj, leader_ref.symbol_idx);
@@ -3602,8 +3602,8 @@ THREAD_POOL_TASK_FUNC(lnk_opt_icf_task)
// TODO: double-check if discarded section headers should be updated with leaders' alignment,
// leaders at this point are resolved
U64 contrib_align = coff_align_size_from_section_flags(contrib_obj->coff.sections.flags[contrib->sect_idx]);
COFF_SectionFlags *leader_flags = &leader_obj->coff.sections.flags[leader->sect_idx];
U64 contrib_align = coff_align_size_from_section_flags(contrib_obj->coff.sections.headers[contrib->sect_idx].flags);
COFF_SectionFlags *leader_flags = &leader_obj->coff.sections.headers[leader->sect_idx].flags;
for (COFF_SectionFlags old_flags = ins_atomic_u32_eval((U32 *)leader_flags);;) {
U64 leader_align = coff_align_size_from_section_flags(old_flags);
if (leader_align >= contrib_align) { break; }
@@ -3618,7 +3618,7 @@ THREAD_POOL_TASK_FUNC(lnk_opt_icf_task)
}
// remove folded section from the image
contrib_obj->coff.sections.flags[contrib->sect_idx] |= COFF_SectionFlag_LnkRemove;
contrib_obj->coff.sections.headers[contrib->sect_idx].flags |= COFF_SectionFlag_LnkRemove;
// update folded section COMDAT symlink to point to the leader section
contrib_obj->symlinks[contrib->sect_idx + 1] = (LNK_ObjSymbolRef){ leader_obj, leader_obj->coff.sections.comdats[leader->sect_idx] };
@@ -3754,7 +3754,7 @@ lnk_section_definition_is_before(void *raw_a, void *raw_b)
internal B32
lnk_should_gather_section(LNK_Obj *obj, U64 sect_idx, COFF_SectionHeader *sect_header)
{
COFF_SectionFlags sect_flags = obj->coff.sections.flags[sect_idx];
COFF_SectionFlags sect_flags = obj->coff.sections.headers[sect_idx].flags;
// removed sections were eliminated before image layout
if (sect_flags & COFF_SectionFlag_LnkRemove) {
@@ -3808,7 +3808,7 @@ THREAD_POOL_TASK_FUNC(lnk_gather_sections_task)
Temp temp = temp_begin(scratch.arena);
// was section defined?
COFF_SectionFlags image_sect_flags = obj->coff.sections.flags[sect_idx] & ~(COFF_SectionFlags_LnkFlags | COFF_SectionFlags_Reserved);
COFF_SectionFlags image_sect_flags = obj->coff.sections.headers[sect_idx].flags & ~(COFF_SectionFlags_LnkFlags | COFF_SectionFlags_Reserved);
String8 sect_name = coff_name_from_section_header(string_table, sect_header);
image_sect_flags = lnk_apply_section_directives_to_flags(task->config, sect_name, image_sect_flags);
String8 sect_name_with_flags = lnk_make_name_with_flags(temp.arena, sect_name, image_sect_flags);
@@ -3934,7 +3934,7 @@ THREAD_POOL_TASK_FUNC(lnk_gather_sections_task)
for EachIndex(sect_idx, obj->coff.sections.count) {
LNK_SectionContrib *sc = task->null_sc;
COFF_SectionHeader *sect_header = &section_table[sect_idx];
COFF_SectionFlags sect_flags = obj->coff.sections.flags[sect_idx];
COFF_SectionFlags sect_flags = obj->coff.sections.headers[sect_idx].flags;
task->sect_map[obj_idx][sect_idx] = sc;
if ( ! lnk_should_gather_section(obj, sect_idx, sect_header)) { continue; }
@@ -3987,7 +3987,7 @@ THREAD_POOL_TASK_FUNC(lnk_set_comdat_leaders_contribs_task)
for EachIndex(sect_idx, obj->coff.sections.count) {
U64 section_number = sect_idx+1;
if (~obj->coff.sections.flags[sect_idx] & COFF_SectionFlag_LnkCOMDAT) { continue; }
if (~obj->coff.sections.headers[sect_idx].flags & COFF_SectionFlag_LnkCOMDAT) { continue; }
LNK_ObjSymbolRef symlink_ref = {0};
if ( ! lnk_obj_get_comdat_symlink(obj, section_number, &symlink_ref)) { continue; }
@@ -4010,7 +4010,7 @@ THREAD_POOL_TASK_FUNC(lnk_flag_debug_symbols_task)
symbol = lnk_parsed_symbol_from_coff_symbol_idx_no_name(obj, symbol_idx);
COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class);
if (interp == COFF_SymbolValueInterp_Regular) {
if (obj->coff.sections.flags[symbol.section_number-1] & LNK_SECTION_FLAG_DEBUG) {
if (obj->coff.sections.headers[symbol.section_number-1].flags & LNK_SECTION_FLAG_DEBUG) {
task->u.patch_symtabs.was_symbol_patched[obj_idx][symbol_idx] = 1;
}
}
@@ -4429,7 +4429,7 @@ THREAD_POOL_TASK_FUNC(lnk_obj_reloc_patcher)
for EachIndex(sect_idx, obj_header.section_count_no_null) {
COFF_SectionHeader *section_header = &section_table[sect_idx];
COFF_SectionFlags section_flags = obj->coff.sections.flags[sect_idx];
COFF_SectionFlags section_flags = obj->coff.sections.headers[sect_idx].flags;
if (section_flags & COFF_SectionFlag_LnkInfo) { continue; }
if (section_flags & COFF_SectionFlag_LnkRemove) { continue; }
@@ -4574,7 +4574,7 @@ THREAD_POOL_TASK_FUNC(lnk_flag_hotpatch_contribs_task)
if (interp == COFF_SymbolValueInterp_Regular && COFF_SymbolType_IsFunc(symbol.type)) {
LNK_SectionContrib *sc = task->sect_map[obj_idx][symbol.section_number-1];
if (sc != task->null_sc) {
sc->hotpatch = !!(obj->coff.sections.flags[symbol.section_number-1] & COFF_SectionFlag_CntCode);
sc->hotpatch = !!(obj->coff.sections.headers[symbol.section_number-1].flags & COFF_SectionFlag_CntCode);
}
}
}
@@ -4938,7 +4938,7 @@ THREAD_POOL_TASK_FUNC(lnk_patch_virtual_offsets_and_sizes_in_obj_section_headers
COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj);
for (U64 sect_idx = 0; sect_idx < obj->coff.sections.count; sect_idx += 1) {
COFF_SectionHeader *sect_header = &section_table[sect_idx];
if (~obj->coff.sections.flags[sect_idx] & COFF_SectionFlag_LnkRemove) {
if (~obj->coff.sections.headers[sect_idx].flags & COFF_SectionFlag_LnkRemove) {
LNK_SectionContrib *sc = task->sect_map[obj_idx][sect_idx];
LNK_Section *sect = task->image_sects.v[sc->u.sect_idx];
sect_header->vsize = lnk_size_from_section_contrib(sc);
@@ -4959,7 +4959,7 @@ THREAD_POOL_TASK_FUNC(lnk_patch_file_offsets_and_sizes_in_obj_section_headers_ta
COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj);
for (U64 sect_idx = 0; sect_idx < obj->coff.sections.count; sect_idx += 1) {
COFF_SectionHeader *sect_header = &section_table[sect_idx];
COFF_SectionFlags sect_flags = obj->coff.sections.flags[sect_idx];
COFF_SectionFlags sect_flags = obj->coff.sections.headers[sect_idx].flags;
B32 patch_section_header = (~sect_flags & COFF_SectionFlag_LnkRemove) &&
(~sect_flags & LNK_SECTION_FLAG_DEBUG);
if (patch_section_header) {
@@ -4992,7 +4992,7 @@ THREAD_POOL_TASK_FUNC(lnk_patch_section_symbols_task)
COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj);
for EachIndex(sect_idx, obj->coff.sections.count) {
COFF_SectionHeader *section_header = &section_table[sect_idx];
COFF_SectionFlags section_flags = obj->coff.sections.flags[sect_idx];
COFF_SectionFlags section_flags = obj->coff.sections.headers[sect_idx].flags;
if (section_flags & COFF_SectionFlag_LnkRemove) { continue; }
if (section_flags & COFF_SectionFlag_LnkInfo) { continue; }
if (section_flags & LNK_SECTION_FLAG_DEBUG) { continue; }
@@ -5058,7 +5058,7 @@ THREAD_POOL_TASK_FUNC(lnk_gather_base_reloc_pages_task)
ProfBeginV("%S", obj->path);
for EachIndex(sect_idx, obj->coff.sections.count) {
COFF_SectionHeader *sect_header = &sect_table[sect_idx];
if (obj->coff.sections.flags[sect_idx] & COFF_SectionFlag_LnkRemove) { continue; }
if (obj->coff.sections.headers[sect_idx].flags & COFF_SectionFlag_LnkRemove) { continue; }
COFF_RelocArray relocs = lnk_coff_relocs_from_section_header(obj, sect_header);
for EachIndex(reloc_idx, relocs.count) {
@@ -6142,7 +6142,7 @@ lnk_obj_sect_idx_from_section(Arena *arena, U64 objs_count, LNK_Obj **objs, LNK_
String8 section_name, section_postfix;
coff_parse_section_name(full_section_name, &section_name, &section_postfix);
if (obj->coff.sections.flags[sect_idx] & COFF_SectionFlag_LnkRemove) { continue; }
if (obj->coff.sections.headers[sect_idx].flags & COFF_SectionFlag_LnkRemove) { continue; }
if (section_header->fsize == 0) { continue; }
if (lnk_is_section_removed(config, section_name)) { continue; }
@@ -6313,7 +6313,7 @@ lnk_build_rad_map(Arena *arena, String8 image_data, LNK_Config *config, U64 objs
COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(obj->coff.data, obj->coff.header.section_table_range.min, 0);
for (U64 sect_idx = 0; sect_idx < obj->coff.sections.count; sect_idx += 1) {
COFF_SectionHeader *section_header = &section_table[sect_idx];
COFF_SectionFlags section_flags = obj->coff.sections.flags[sect_idx];
COFF_SectionFlags section_flags = obj->coff.sections.headers[sect_idx].flags;
if (~section_flags & COFF_SectionFlag_LnkRemove && section_flags & LNK_SECTION_FLAG_DEBUG) {
LNK_Lib *lib = lnk_obj_get_lib(obj);
if (lib) {
+1 -1
View File
@@ -2855,7 +2855,7 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task)
for EachIndex(sect_idx, obj->coff.sections.count) {
// filter by section flags
if (obj->coff.sections.flags[sect_idx] & (COFF_SectionFlag_LnkInfo | COFF_SectionFlag_LnkRemove | LNK_SECTION_FLAG_DEBUG)) { continue; }
if (obj->coff.sections.headers[sect_idx].flags & (COFF_SectionFlag_LnkInfo | COFF_SectionFlag_LnkRemove | LNK_SECTION_FLAG_DEBUG)) { continue; }
// skip unwind info for the section contribution
String8 section_name = lnk_obj_section_name_from_sect_idx(obj, sect_idx);
+17 -30
View File
@@ -103,23 +103,23 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer)
// - find debug info and meta-data leaders
//
COFF_SectionHeader *coff_section_table = (COFF_SectionHeader *)raw_coff_section_table.str;
COFF_SectionFlags *section_flags = push_array_no_zero(arena, COFF_SectionFlags, header.section_count_no_null);
U32 debug_t_sect_idx = ~0;
U32 debug_p_sect_idx = ~0;
U32 debug_h_sect_idx = ~0;
U32 llvm_addrsig_sect_idx = ~0;
for (U64 sect_idx = 0; sect_idx < header.section_count_no_null; sect_idx += 1) {
COFF_SectionHeader *coff_sect_header = &coff_section_table[sect_idx];
section_flags[sect_idx] = coff_sect_header->flags & ~3; // linker reserves low 2 bits for internal flags
COFF_SectionFlags *section_flags = &section_headers[sect_idx].flags;
String8 sect_name = coff_name_from_section_header(raw_coff_string_table, coff_sect_header);
*section_flags = coff_sect_header->flags & ~3; // linker reserves low 2 bits for internal flags
if (str8_starts_with(sect_name, str8_lit(".debug$"))) {
section_flags[sect_idx] |= LNK_SECTION_FLAG_DEBUG;
*section_flags |= LNK_SECTION_FLAG_DEBUG;
}
if (str8_ends_with(sect_name, str8_lit("$fo$"), 0) ||
str8_ends_with(sect_name, str8_lit("$fo_rvas$"), 0) ||
str8_ends_with(sect_name, str8_lit("$fo_bdd$"), 0)) {
section_flags[sect_idx] |= COFF_SectionFlag_LnkInfo;
*section_flags |= COFF_SectionFlag_LnkInfo;
}
if (str8_match(sect_name, str8_lit(".debug$T"), 0)) {
@@ -134,7 +134,7 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer)
llvm_addrsig_sect_idx = sect_idx;
}
if (~section_flags[sect_idx] & COFF_SectionFlag_CntUninitializedData) {
if (~*section_flags & COFF_SectionFlag_CntUninitializedData) {
if (coff_sect_header->fsize > 0) {
Rng1U64 sect_range = rng_1u64(coff_sect_header->foff, coff_sect_header->foff + coff_sect_header->fsize);
if (contains_1u64(header.header_range, coff_sect_header->foff) ||
@@ -156,13 +156,6 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer)
}
}
String8 *section_data = push_array(arena, String8, header.section_count_no_null);
for EachIndex(sect_idx, header.section_count_no_null) {
COFF_SectionHeader *sect_header = &coff_section_table[sect_idx];
String8 data = str8_substr(input->data, r1u64s(sect_header->foff, sect_header->fsize));
section_data[sect_idx] = section_flags[sect_idx] & LNK_SECTION_FLAG_DEBUG ? push_str8_copy(arena, data) : data;
}
//
// error check symbol table and cache name lengths for primary symbols
//
@@ -255,7 +248,7 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer)
if (symbol.storage_class == COFF_SymStorageClass_Static) {
if (symbol.section_number > 0 && symbol.section_number <= header.section_count_no_null) {
COFF_SectionHeader *sect_header = &coff_section_table[symbol.section_number-1];
if (section_flags[symbol.section_number-1] & COFF_SectionFlag_LnkCOMDAT) {
if (section_headers[symbol.section_number-1].flags & COFF_SectionFlag_LnkCOMDAT) {
if (symbol.aux_symbol_count) {
U32 section_length = 0;
coff_parse_secdef(symbol, header.is_big_obj, 0, 0, &section_length, 0);
@@ -362,7 +355,7 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer)
CV_Symbol comp_symbol = {0};
for EachIndex(sect_idx, header.section_count_no_null) {
COFF_SectionHeader *sect_header = &coff_section_table[sect_idx];
if (section_flags[sect_idx] & LNK_SECTION_FLAG_DEBUG) {
if (section_headers[sect_idx].flags & LNK_SECTION_FLAG_DEBUG) {
String8 name = str8_cstring_capped(sect_header->name, sect_header->name+sizeof(sect_header->name));
if (str8_match(name, str8_lit(".debug$S"), 0)) {
Temp temp = temp_begin(scratch.arena);
@@ -402,8 +395,6 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer)
.sections = {
.count = header.section_count_no_null,
.headers = section_headers,
.flags = section_flags,
.data = section_data,
.comdats = comdats,
.associations = associated_sections,
},
@@ -521,7 +512,7 @@ lnk_symlinks_from_obj(Arena *arena, LNK_SymbolTable *symtab, LNK_Obj *obj)
COFF_SymbolValueInterpType interp = coff_interp_from_parsed_symbol(symbol);
if (interp != COFF_SymbolValueInterp_Regular) { continue; }
COFF_SectionFlags section_flags = obj->coff.sections.flags[symbol.section_number - 1];
COFF_SectionFlags section_flags = obj->coff.sections.headers[symbol.section_number - 1].flags;
if (~section_flags & COFF_SectionFlag_LnkCOMDAT) { continue; }
LNK_ObjSymbolRef *symlink = &symlinks[symbol.section_number];
@@ -582,7 +573,7 @@ lnk_obj_collect_associated_sections(Arena *arena, LNK_Obj *obj, U32 root_section
if (child_section == 0) { continue; }
if (hash_map_search_u64_u64(&seen_hm, child_section)) { continue; }
if (obj->coff.sections.flags[child_section - 1] & skip_flags) { continue; }
if (obj->coff.sections.headers[child_section - 1].flags & skip_flags) { continue; }
hash_map_push_u64_u64(scratch.arena, &seen_hm, child_section, 1);
u32_list_push(arena, &queue, child_section);
@@ -702,22 +693,18 @@ internal String8
lnk_obj_section_data_from_sect_idx(LNK_Obj *obj, U64 sect_idx)
{
Assert(sect_idx < obj->coff.sections.count);
return obj->coff.sections.data[sect_idx];
COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(obj->coff.data, obj->coff.header.section_table_range).str;
COFF_SectionHeader *section = &section_table[sect_idx];
return str8_substr(obj->coff.data, r1u64s(section->foff, section->fsize));
}
internal U64
lnk_obj_foff_from_section_data_ptr(LNK_Obj *obj, void *ptr)
{
U64 ptr_v = IntFromPtr(ptr);
for EachIndex(sect_idx, obj->coff.sections.count) {
String8 data = obj->coff.sections.data[sect_idx];
U64 data_min = IntFromPtr(data.str);
if (data_min <= ptr_v && ptr_v < data_min + data.size) {
return obj->coff.sections.headers[sect_idx].foff + ptr_v - data_min;
}
}
InvalidPath;
return 0;
U64 data_min = IntFromPtr(obj->coff.data.str);
U64 ptr_v = IntFromPtr(ptr);
Assert(data_min <= ptr_v && ptr_v < data_min + obj->coff.data.size);
return ptr_v - data_min;
}
internal U64
@@ -757,7 +744,7 @@ lnk_obj_section_from_sect_idx(LNK_Obj *obj, U64 sect_idx)
section.sect_idx = sect_idx;
section.section_number = sect_idx+1;
section.header = &lnk_coff_section_table_from_obj(obj)[sect_idx];
section.flags = &obj->coff.sections.flags[sect_idx];
section.flags = &section.header->flags;
section.vrange = rng_1u64(section.header->voff, section.header->voff + section.header->vsize);
section.frange = rng_1u64(section.header->foff, section.header->foff + section.header->fsize);
section.reloc_count = section.header->reloc_count;
-2
View File
@@ -31,8 +31,6 @@ typedef struct LNK_ObjSectionArray
{
U64 count;
COFF_SectionHeader *headers;
COFF_SectionFlags *flags;
String8 *data;
U32 *comdats;
U32Node **associations;
} LNK_ObjSectionArray;
+2 -12
View File
@@ -5881,12 +5881,8 @@ TEST(debug_p_sig_mismatch)
T_Ok(t_write_file(str8_lit("b.obj"), b_obj));
T_Ok(t_write_entry_obj());
String8 a_obj_before = t_read_file(arena, str8_lit("a.obj"));
String8 b_obj_before = t_read_file(arena, str8_lit("b.obj"));
t_invoke_linkerf("/RAD_MEMORY_MAP_FILES:READ_WRITE /subsystem:console /entry:entry /out:a.exe /debug:full a.obj b.obj entry.obj");
t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:full a.obj b.obj entry.obj");
T_Ok(g_last_exit_code == 0);
T_Ok(str8_match(a_obj_before, t_read_file(arena, str8_lit("a.obj")), 0));
T_Ok(str8_match(b_obj_before, t_read_file(arena, str8_lit("b.obj")), 0));
B32 found_error = 0;
String8 a_obj_path = t_make_file_path(arena, str8_lit("a.obj"));
@@ -6275,14 +6271,8 @@ TEST(gen_rrt)
t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:full /rad_type_server:foo.rrt a.obj b.obj entry.obj");
T_Ok(g_last_exit_code == 0);
String8 a_obj_before = t_read_file(arena, a_obj_file_path);
String8 b_obj_before = t_read_file(arena, b_obj_file_path);
String8 rrt_before = t_read_file(arena, str8_lit("foo.rrt"));
t_invoke_linkerf("/RAD_MEMORY_MAP_FILES:READ_WRITE /subsystem:console /entry:entry /out:a.exe /debug:ghash a.obj foo.rrt b.obj entry.obj");
t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:ghash a.obj foo.rrt b.obj entry.obj");
T_Ok(g_last_exit_code == 0);
T_Ok(str8_match(a_obj_before, t_read_file(arena, a_obj_file_path), 0));
T_Ok(str8_match(b_obj_before, t_read_file(arena, b_obj_file_path), 0));
T_Ok(str8_match(rrt_before, t_read_file(arena, str8_lit("foo.rrt")), 0));
}
TEST(debug_p_and_debug_t_in_obj)