picked better name convention for the section table

This commit is contained in:
Nikita Smith
2025-04-04 15:47:37 -07:00
parent 8beb168905
commit ab05133f8a
13 changed files with 262 additions and 262 deletions
+121 -121
View File
@@ -414,13 +414,13 @@ lnk_res_number_id_is_before(void *raw_a, void *raw_b)
}
internal void
lnk_serialize_pe_resource_tree(LNK_SectionTable *st, LNK_SymbolTable *symtab, PE_ResourceDir *root_dir)
lnk_serialize_pe_resource_tree(LNK_SectionTable *sectab, LNK_SymbolTable *symtab, PE_ResourceDir *root_dir)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
LNK_Section *dir_sect = lnk_section_table_push(st, str8_lit(".rsrc$01"), LNK_RSRC_SECTION_FLAGS);
LNK_Section *data_sect = lnk_section_table_push(st, str8_lit(".rsrc$02"), LNK_RSRC_SECTION_FLAGS);
LNK_Section *dir_sect = lnk_section_table_push(sectab, str8_lit(".rsrc$01"), LNK_RSRC_SECTION_FLAGS);
LNK_Section *data_sect = lnk_section_table_push(sectab, str8_lit(".rsrc$02"), LNK_RSRC_SECTION_FLAGS);
LNK_Chunk *dir_tree_chunk = lnk_section_push_chunk_list(dir_sect, dir_sect->root, str8_zero());
LNK_Chunk *dir_data_chunk = lnk_section_push_chunk_list(dir_sect, dir_sect->root, str8_zero());
@@ -580,7 +580,7 @@ lnk_serialize_pe_resource_tree(LNK_SectionTable *st, LNK_SymbolTable *symtab, PE
}
internal void
lnk_add_resource_debug_s(LNK_SectionTable *st,
lnk_add_resource_debug_s(LNK_SectionTable *sectab,
LNK_SymbolTable *symtab,
String8 obj_path,
String8 cwd_path,
@@ -674,7 +674,7 @@ lnk_add_resource_debug_s(LNK_SectionTable *st,
str8_serial_push_data_list(scratch.arena, &sub_sect_srl, symbol_srl.first);
str8_serial_push_align(scratch.arena, &sub_sect_srl, CV_C13SubSectionAlign);
LNK_Section *debug_s = lnk_section_table_push(st, str8_lit(".debug$S"), LNK_DEBUG_SECTION_FLAGS);
LNK_Section *debug_s = lnk_section_table_push(sectab, str8_lit(".debug$S"), LNK_DEBUG_SECTION_FLAGS);
String8 sub_sect_data = str8_serial_end(debug_s->arena, &sub_sect_srl);
lnk_section_push_chunk_data(debug_s, debug_s->root, sub_sect_data, str8_zero());
@@ -706,24 +706,24 @@ lnk_make_res_obj(TP_Context *tp,
temp_tp_arena->v[0] = arena_alloc();
LNK_SymbolTable *symtab = lnk_symbol_table_init(temp_tp_arena);
LNK_SectionTable *st = lnk_section_table_alloc(0, sect_virt_align, sect_file_align);
LNK_Section *header_sect = lnk_section_table_push(st, str8_lit(".null"), 0);
LNK_SectionTable *sectab = lnk_section_table_alloc(0, sect_virt_align, sect_file_align);
LNK_Section *header_sect = lnk_section_table_push(sectab, str8_lit(".null"), 0);
lnk_serialize_pe_resource_tree(st, symtab, root_dir);
lnk_serialize_pe_resource_tree(sectab, symtab, root_dir);
CV_Arch cv_arch = cv_arch_from_coff_machine(machine);
lnk_add_resource_debug_s(st, symtab, path, cwd_path, exe_path, cv_arch, res_file_list, res_hash_array);
lnk_add_resource_debug_s(sectab, symtab, path, cwd_path, exe_path, cv_arch, res_file_list, res_hash_array);
// register section symbols (after this point don't push new sections)
for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != 0; sect_node = sect_node->next) {
LNK_Section *sect = &sect_node->data;
lnk_symbol_table_push_defined_chunk(symtab, sect->name, LNK_DefinedSymbolVisibility_Internal, 0, sect->root, 0, 0, 0);
}
st->null_sect = lnk_section_list_remove(&st->list, str8_lit(".null"));
lnk_section_table_build_data(tp, st, machine);
lnk_section_table_push_null(st);
lnk_section_table_assign_indices(st);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st);
sectab->null_sect = lnk_section_list_remove(&sectab->list, str8_lit(".null"));
lnk_section_table_build_data(tp, sectab, machine);
lnk_section_table_push_null(sectab);
lnk_section_table_assign_indices(sectab);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, sectab);
COFF_Symbol16List coff_symbol_list = {0};
@@ -735,7 +735,7 @@ lnk_make_res_obj(TP_Context *tp,
coff_symbol16_list_push(scratch.arena, &coff_symbol_list, coff_feat00);
// emit coff symbols for section definitions
for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != 0; sect_node = sect_node->next) {
LNK_Section *sect = &sect_node->data;
if (sect == header_sect) continue;
if (!sect->emit_header) continue;
@@ -768,7 +768,7 @@ lnk_make_res_obj(TP_Context *tp,
// convert relocations and symbols to coff format
{
for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != 0; sect_node = sect_node->next) {
LNK_Section *sect = &sect_node->data;
// filter out resource relocations
@@ -827,8 +827,8 @@ lnk_make_res_obj(TP_Context *tp,
if (coff_reloc_list.count == 0) continue;
// push section for relocation data
String8 sect_name = push_str8f(st->arena, "%S.relocs", sect->name);
LNK_Section *reloc_sect = lnk_section_table_push(st, sect_name, 0);
String8 sect_name = push_str8f(sectab->arena, "%S.relocs", sect->name);
LNK_Section *reloc_sect = lnk_section_table_push(sectab, sect_name, 0);
reloc_sect->emit_header = 0;
// push chunk layout for relocations
@@ -848,7 +848,7 @@ lnk_make_res_obj(TP_Context *tp,
}
}
LNK_Section *misc_sect = lnk_section_table_push(st, str8_lit(".misc"), COFF_SectionFlag_LnkInfo|COFF_SectionFlag_LnkRemove);
LNK_Section *misc_sect = lnk_section_table_push(sectab, str8_lit(".misc"), COFF_SectionFlag_LnkInfo|COFF_SectionFlag_LnkRemove);
misc_sect->emit_header = 0;
// serialize coff symbol list
@@ -894,9 +894,9 @@ lnk_make_res_obj(TP_Context *tp,
// build section headers
{
LNK_Chunk *coff_section_header_array_chunk = lnk_section_push_chunk_list(header_sect, header_sect->root, str8_zero());
for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) {
if (sect_node == st->null_sect) continue;
if (!sect_node->data.emit_header) continue;
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != 0; sect_node = sect_node->next) {
if (sect_node == sectab->null_sect) continue;
if (!sect_node->data.emit_header) continue;
LNK_Section *sect = &sect_node->data;
// init section header
@@ -941,13 +941,13 @@ lnk_make_res_obj(TP_Context *tp,
lnk_symbol_table_push(symtab, coff_section_header_count_symbol);
}
lnk_section_table_assign_indices(st);
lnk_section_table_build_data(tp, st, machine);
lnk_section_table_assign_file_offsets(st);
String8 res_obj = lnk_section_table_serialize(tp, arena, st, machine);
sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st);
lnk_patch_relocs_linker(tp, symtab, st, sect_id_map, res_obj, 0);
lnk_section_table_release(&st);
lnk_section_table_assign_indices(sectab);
lnk_section_table_build_data(tp, sectab, machine);
lnk_section_table_assign_file_offsets(sectab);
String8 res_obj = lnk_section_table_serialize(tp, arena, sectab, machine);
sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, sectab);
lnk_patch_relocs_linker(tp, symtab, sectab, sect_id_map, res_obj, 0);
lnk_section_table_release(&sectab);
arena_release(temp_tp_arena->v[0]);
scratch_end(scratch);
@@ -958,7 +958,7 @@ lnk_make_res_obj(TP_Context *tp,
internal String8
lnk_obj_from_res_file_list(TP_Context *tp,
Arena *arena,
LNK_SectionTable *st,
LNK_SectionTable *sectab,
LNK_SymbolTable *symtab,
String8List res_data_list,
String8List res_path_list,
@@ -1030,10 +1030,10 @@ lnk_make_linker_coff_obj(TP_Context *tp,
temp_tp_arena->count = 1;
LNK_SymbolTable *symtab = lnk_symbol_table_init(temp_tp_arena);
LNK_SectionTable *st = lnk_section_table_alloc(0, 1, 1);
LNK_SectionTable *sectab = lnk_section_table_alloc(0, 1, 1);
LNK_Section *header_sect = lnk_section_table_push(st, str8_lit(".coffhdr"), 0);
LNK_Section *debug_s_sect = lnk_section_table_push(st, str8_lit(".debug$S"), LNK_DEBUG_SECTION_FLAGS);
LNK_Section *header_sect = lnk_section_table_push(sectab, str8_lit(".coffhdr"), 0);
LNK_Section *debug_s_sect = lnk_section_table_push(sectab, str8_lit(".debug$S"), LNK_DEBUG_SECTION_FLAGS);
// TODO: remove! hack!
header_sect->emit_header = 0;
@@ -1105,15 +1105,15 @@ lnk_make_linker_coff_obj(TP_Context *tp,
{
// register section symbols (after this point don't push new sections)
for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != NULL; sect_node = sect_node->next) {
LNK_Section *sect = &sect_node->data;
lnk_symbol_table_push_defined_chunk(symtab, sect->name, LNK_DefinedSymbolVisibility_Internal, 0, sect->root, 0, 0, 0);
}
LNK_Chunk *coff_section_header_array_chunk = lnk_section_push_chunk_list(header_sect, header_sect->root, str8_zero());
for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) {
if (sect_node == st->null_sect) continue;
if (!sect_node->data.emit_header) continue;
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != NULL; sect_node = sect_node->next) {
if (sect_node == sectab->null_sect) continue;
if (!sect_node->data.emit_header) continue;
LNK_Section *sect = &sect_node->data;
// init section header
@@ -1157,14 +1157,14 @@ lnk_make_linker_coff_obj(TP_Context *tp,
lnk_symbol_table_push(symtab, coff_section_header_count_symbol);
}
lnk_section_table_assign_indices(st);
lnk_section_table_build_data(tp, st, machine);
lnk_section_table_assign_file_offsets(st);
String8 coff_data = lnk_section_table_serialize(tp, arena, st, machine);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st);
lnk_patch_relocs_linker(tp, symtab, st, sect_id_map, coff_data, 0);
lnk_section_table_assign_indices(sectab);
lnk_section_table_build_data(tp, sectab, machine);
lnk_section_table_assign_file_offsets(sectab);
String8 coff_data = lnk_section_table_serialize(tp, arena, sectab, machine);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, sectab);
lnk_patch_relocs_linker(tp, symtab, sectab, sect_id_map, coff_data, 0);
lnk_section_table_release(&st);
lnk_section_table_release(&sectab);
scratch_end(scratch);
return coff_data;
@@ -1378,7 +1378,7 @@ lnk_push_pe_debug_data_directory(LNK_Section *sect,
}
internal void
lnk_build_debug_pdb(LNK_SectionTable *st,
lnk_build_debug_pdb(LNK_SectionTable *sectab,
LNK_SymbolTable *symtab,
LNK_Section *sect,
LNK_Chunk *dir_array_chunk,
@@ -1405,7 +1405,7 @@ lnk_build_debug_pdb(LNK_SectionTable *st,
}
internal void
lnk_build_debug_rdi(LNK_SectionTable *st,
lnk_build_debug_rdi(LNK_SectionTable *sectab,
LNK_SymbolTable *symtab,
LNK_Section *debug_sect,
LNK_Chunk *debug_dir_array_chunk,
@@ -1415,7 +1415,7 @@ lnk_build_debug_rdi(LNK_SectionTable *st,
{
ProfBeginFunction();
LNK_Section *rdi_sect = lnk_section_table_push(st, str8_lit(".raddbg"), COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead);
LNK_Section *rdi_sect = lnk_section_table_push(sectab, str8_lit(".raddbg"), COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead);
// push chunks
String8 debug_rdi = pe_make_debug_header_rdi(rdi_sect->arena, guid, rdi_path);
@@ -1434,7 +1434,7 @@ lnk_build_debug_rdi(LNK_SectionTable *st,
internal void
lnk_build_guard_tables(TP_Context *tp,
LNK_SectionTable *st,
LNK_SectionTable *sectab,
LNK_SymbolTable *symtab,
LNK_ExportTable *exptab,
LNK_ObjList obj_list,
@@ -1446,7 +1446,7 @@ lnk_build_guard_tables(TP_Context *tp,
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, sectab);
enum { GUARD_FIDS, GUARD_IATS, GUARD_LJMP, GUARD_EHCONT, GUARD_COUNT };
LNK_SymbolList guard_symbol_list_table[GUARD_COUNT]; MemoryZeroStruct(&guard_symbol_list_table[0]);
@@ -1561,8 +1561,8 @@ lnk_build_guard_tables(TP_Context *tp,
#endif
// build section data
lnk_section_table_build_data(tp, st, machine);
lnk_section_table_assign_virtual_offsets(st);
lnk_section_table_build_data(tp, sectab, machine);
lnk_section_table_assign_virtual_offsets(sectab);
// compute symbols virtual offsets
U64Array guard_voff_arr_table[GUARD_COUNT];
@@ -1604,7 +1604,7 @@ lnk_build_guard_tables(TP_Context *tp,
{ ".gehcont", LNK_GEHCONT_SYMBOL_NAME, LNK_GEHCONT_SECTION_FLAGS },
};
for (U64 i = 0; i < ArrayCount(sect_layout); ++i) {
LNK_Section *sect = lnk_section_table_push(st, str8_cstring(sect_layout[i].name), sect_layout[i].flags);
LNK_Section *sect = lnk_section_table_push(sectab, str8_cstring(sect_layout[i].name), sect_layout[i].flags);
lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(sect_layout[i].symbol), LNK_DefinedSymbolVisibility_Internal, 0, sect->root, 0, 0, 0);
}
@@ -1619,10 +1619,10 @@ lnk_build_guard_tables(TP_Context *tp,
LNK_Symbol *gljmp_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_GLJMP_SYMBOL_NAME));
LNK_Symbol *gehcont_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_GEHCONT_SYMBOL_NAME));
LNK_Section *gfids_sect = lnk_section_table_search_id(st, gfids_symbol->u.defined.u.chunk->ref.sect_id);
LNK_Section *giats_sect = lnk_section_table_search_id(st, giats_symbol->u.defined.u.chunk->ref.sect_id);
LNK_Section *gljmp_sect = lnk_section_table_search_id(st, gljmp_symbol->u.defined.u.chunk->ref.sect_id);
LNK_Section *gehcont_sect = lnk_section_table_search_id(st, gehcont_symbol->u.defined.u.chunk->ref.sect_id);
LNK_Section *gfids_sect = lnk_section_table_search_id(sectab, gfids_symbol->u.defined.u.chunk->ref.sect_id);
LNK_Section *giats_sect = lnk_section_table_search_id(sectab, giats_symbol->u.defined.u.chunk->ref.sect_id);
LNK_Section *gljmp_sect = lnk_section_table_search_id(sectab, gljmp_symbol->u.defined.u.chunk->ref.sect_id);
LNK_Section *gehcont_sect = lnk_section_table_search_id(sectab, gehcont_symbol->u.defined.u.chunk->ref.sect_id);
LNK_Chunk *gfids_array_chunk = gfids_sect->root;
LNK_Chunk *giats_array_chunk = giats_sect->root;
@@ -1683,7 +1683,7 @@ lnk_build_guard_tables(TP_Context *tp,
gflags_def->u.va |= PE_LoadConfigGuardFlags_EH_CONTINUATION_TABLE_PRESENT;
}
{
LNK_Section *didat_sect = lnk_section_table_search(st, str8_lit(".didat"));
LNK_Section *didat_sect = lnk_section_table_search(sectab, str8_lit(".didat"));
if (didat_sect) {
gflags_def->u.va |= PE_LoadConfigGuardFlags_DELAYLOAD_IAT_IN_ITS_OWN_SECTION;
}
@@ -1852,7 +1852,7 @@ lnk_base_reloc_page_array_sort(LNK_BaseRelocPageArray arr)
internal void
lnk_build_base_relocs(TP_Context *tp,
TP_Arena *tp_arena,
LNK_SectionTable *st,
LNK_SectionTable *sectab,
LNK_SymbolTable *symtab,
COFF_MachineType machine,
U64 page_size,
@@ -1863,10 +1863,10 @@ lnk_build_base_relocs(TP_Context *tp,
TP_Temp temp = tp_temp_begin(tp_arena);
lnk_section_table_build_data(tp, st, machine);
lnk_section_table_assign_virtual_offsets(st);
lnk_section_table_build_data(tp, sectab, machine);
lnk_section_table_assign_virtual_offsets(sectab);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(tp_arena->v[0], st);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(tp_arena->v[0], sectab);
LNK_BaseRelocPageList *page_list_arr = push_array(tp_arena->v[0], LNK_BaseRelocPageList, tp->worker_count);
HashTable **page_ht_arr = push_array_no_zero(tp_arena->v[0], HashTable *, tp->worker_count);
@@ -1876,7 +1876,7 @@ lnk_build_base_relocs(TP_Context *tp,
// emit pages from relocs defined in section table
ProfBegin("Emit Relocs From Section Table");
for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != 0; sect_node = sect_node->next) {
LNK_BaseRelocTask task = {0};
task.page_size = page_size;
task.sect_id_map = sect_id_map;
@@ -1938,7 +1938,7 @@ lnk_build_base_relocs(TP_Context *tp,
ProfEnd();
if (main_page_list->count > 0) {
LNK_Section *base_reloc_sect = lnk_section_table_push(st, str8_lit(".reloc"), LNK_RELOC_SECTION_FLAGS);
LNK_Section *base_reloc_sect = lnk_section_table_push(sectab, str8_lit(".reloc"), LNK_RELOC_SECTION_FLAGS);
lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_BASE_RELOC_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, base_reloc_sect->root, 0, 0, 0);
ProfBegin("Page List -> Array");
@@ -2772,7 +2772,7 @@ THREAD_POOL_TASK_FUNC(lnk_section_reloc_patcher)
String8 image_data = task->image_data;
LNK_SymbolTable *symtab = task->symtab;
LNK_SectionTable *st = task->st;
LNK_SectionTable *sectab = task->sectab;
LNK_Section **sect_id_map = task->sect_id_map;
U64 base_addr = task->base_addr;
Rng1U64 range = task->range_arr[task_id];
@@ -2786,24 +2786,24 @@ THREAD_POOL_TASK_FUNC(lnk_section_reloc_patcher)
continue;
}
String8 chunk_data = lnk_data_from_chunk_ref(sect_id_map, image_data, chunk->ref);
lnk_apply_reloc(base_addr, st->sect_align, st->file_align, sect_id_map, symtab, chunk_data, reloc);
lnk_apply_reloc(base_addr, sectab->sect_align, sectab->file_align, sect_id_map, symtab, chunk_data, reloc);
int bad_vs = 0; (void)bad_vs;
}
}
}
internal void
lnk_patch_relocs_linker(TP_Context *tp, LNK_SymbolTable *symtab, LNK_SectionTable *st, LNK_Section **sect_id_map, String8 image_data, U64 base_addr)
lnk_patch_relocs_linker(TP_Context *tp, LNK_SymbolTable *symtab, LNK_SectionTable *sectab, LNK_Section **sect_id_map, String8 image_data, U64 base_addr)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0,0);
LNK_SectionPtrArray sect_arr = lnk_section_ptr_array_from_list(scratch.arena, st->list);
LNK_SectionPtrArray sect_arr = lnk_section_ptr_array_from_list(scratch.arena, sectab->list);
LNK_SectionRelocPatcher task = {0};
task.image_data = image_data;
task.symtab = symtab;
task.st = st;
task.sectab = sectab;
task.sect_id_map = sect_id_map;
task.sect_arr = sect_arr.v;
task.base_addr = base_addr;
@@ -2829,14 +2829,14 @@ THREAD_POOL_TASK_FUNC(lnk_obj_reloc_patcher)
continue;
}
String8 chunk_data = lnk_data_from_chunk_ref(sect_id_map, image_data, reloc->chunk->ref);
lnk_apply_reloc(task->base_addr, task->st->sect_align, task->st->file_align, task->sect_id_map, task->symtab, chunk_data, reloc);
lnk_apply_reloc(task->base_addr, task->sectab->sect_align, task->sectab->file_align, task->sect_id_map, task->symtab, chunk_data, reloc);
int bad_vs = 0; (void)bad_vs;
}
}
}
internal void
lnk_patch_relocs_obj(TP_Context *tp, LNK_ObjList obj_list, LNK_SymbolTable *symtab, LNK_SectionTable *st, LNK_Section **sect_id_map, String8 image_data, U64 base_addr)
lnk_patch_relocs_obj(TP_Context *tp, LNK_ObjList obj_list, LNK_SymbolTable *symtab, LNK_SectionTable *sectab, LNK_Section **sect_id_map, String8 image_data, U64 base_addr)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0,0);
@@ -2844,7 +2844,7 @@ lnk_patch_relocs_obj(TP_Context *tp, LNK_ObjList obj_list, LNK_SymbolTable *symt
LNK_ObjRelocPatcher task;
task.image_data = image_data;
task.symtab = symtab;
task.st = st;
task.sectab = sectab;
task.sect_id_map = sect_id_map;
task.base_addr = base_addr;
task.obj_arr = lnk_obj_arr_from_list(scratch.arena, obj_list);
@@ -2879,24 +2879,24 @@ lnk_init_section_table(LNK_SymbolTable *symtab, U64 section_virt_off, U64 sect_a
{ ".tls", LNK_TLS_SYMBOL_NAME, LNK_DATA_SECTION_FLAGS },
};
LNK_SectionTable *st = lnk_section_table_alloc(section_virt_off, sect_align, file_align);
LNK_SectionTable *sectab = lnk_section_table_alloc(section_virt_off, sect_align, file_align);
for (U64 i = 0; i < ArrayCount(sect_layout); ++i) {
LNK_Section *sect = lnk_section_table_push(st, str8_cstring(sect_layout[i].name), sect_layout[i].flags);
LNK_Section *sect = lnk_section_table_push(sectab, str8_cstring(sect_layout[i].name), sect_layout[i].flags);
sect->symbol_name = str8_cstring(sect_layout[i].symbol);
sect->symbol_name = push_str8_copy(sect->arena, sect->symbol_name);
lnk_symbol_table_push_defined_chunk(symtab, sect->symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, sect->root, 0, 0, 0);
}
st->null_sect = lnk_section_list_remove(&st->list, str8_lit(".null"));
sectab->null_sect = lnk_section_list_remove(&sectab->list, str8_lit(".null"));
// dont build layout because we discard debug from image and move it to pdb
LNK_Section *debug_sect = lnk_section_table_search(st, str8_lit(".debug"));
LNK_Section *debug_sect = lnk_section_table_search(sectab, str8_lit(".debug"));
debug_sect->emit_header = 0;
debug_sect->has_layout = 0;
ProfEnd();
return st;
return sectab;
}
internal LNK_MergeDirectiveList
@@ -2928,7 +2928,7 @@ lnk_init_merge_directive_list(Arena *arena, LNK_ObjList obj_list)
}
internal void
lnk_discard_meta_data_sections(LNK_SectionTable *st)
lnk_discard_meta_data_sections(LNK_SectionTable *sectab)
{
static char * meta_data_sect_arr[] = {
".gfids",
@@ -2938,7 +2938,7 @@ lnk_discard_meta_data_sections(LNK_SectionTable *st)
};
for (U64 meta_idx = 0; meta_idx < ArrayCount(meta_data_sect_arr); meta_idx += 1) {
String8 name = str8_cstring(meta_data_sect_arr[meta_idx]);
LNK_Section *sect = lnk_section_table_search(st, name);
LNK_Section *sect = lnk_section_table_search(sectab, name);
if (sect) {
lnk_visit_chunks(sect->id, sect->root, lnk_chunk_mark_discarded, NULL);
sect->root->is_discarded = 0;
@@ -2960,15 +2960,15 @@ lnk_pdata_is_before_x8664(void *raw_a, void *raw_b)
////////////////////////////////
internal void
lnk_log_size_breakdown(LNK_SectionTable *st, LNK_SymbolTable *symtab)
lnk_log_size_breakdown(LNK_SectionTable *sectab, LNK_SymbolTable *symtab)
{
Temp scratch = scratch_begin(0, 0);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, sectab);
U64 code_size = 0;
U64 data_size = 0;
for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != NULL; sect_node = sect_node->next) {
LNK_Section *sect = &sect_node->data;
if (sect->has_layout) {
U64 sect_size = lnk_file_size_from_chunk_ref(sect_id_map, sect->root->ref);
@@ -2982,21 +2982,21 @@ lnk_log_size_breakdown(LNK_SectionTable *st, LNK_SymbolTable *symtab)
LNK_Symbol *dos_header_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_DOS_HEADER_SYMBOL_NAME));
LNK_Symbol *dos_program_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_DOS_PROGRAM_SYMBOL_NAME));
LNK_Symbol *COFF_FileHeader_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_COFF_FILE_HEADER_SYMBOL_NAME));
LNK_Symbol *coff_file_header_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_COFF_FILE_HEADER_SYMBOL_NAME));
LNK_Symbol *coff_section_header_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_COFF_SECT_HEADER_ARRAY_SYMBOL_NAME));
LNK_Symbol *pe_opt_header_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_PE_OPT_HEADER_SYMBOL_NAME));
LNK_Symbol *pe_directories_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_PE_DIRECTORY_ARRAY_SYMBOL_NAME));
LNK_Chunk *dos_header_chunk = dos_header_symbol->u.defined.u.chunk;
LNK_Chunk *dos_program_chunk = dos_program_symbol->u.defined.u.chunk;
LNK_Chunk *COFF_FileHeader_chunk = COFF_FileHeader_symbol->u.defined.u.chunk;
LNK_Chunk *coff_file_header_chunk = coff_file_header_symbol->u.defined.u.chunk;
LNK_Chunk *coff_section_header_chunk = coff_section_header_symbol->u.defined.u.chunk;
LNK_Chunk *pe_opt_header_chunk = pe_opt_header_symbol->u.defined.u.chunk;
LNK_Chunk *pe_directories_chunk = pe_directories_symbol->u.defined.u.chunk;
U64 dos_header_size = lnk_file_size_from_chunk_ref(sect_id_map, dos_header_chunk->ref);
U64 dos_program_size = lnk_file_size_from_chunk_ref(sect_id_map, dos_program_chunk->ref);
U64 COFF_FileHeader_size = lnk_file_size_from_chunk_ref(sect_id_map, COFF_FileHeader_chunk->ref);
U64 coff_file_header_size = lnk_file_size_from_chunk_ref(sect_id_map, coff_file_header_chunk->ref);
U64 coff_section_header_size = lnk_file_size_from_chunk_ref(sect_id_map, coff_section_header_chunk->ref);
U64 pe_opt_header_size = lnk_file_size_from_chunk_ref(sect_id_map, pe_opt_header_chunk->ref);
U64 pe_directories_size = lnk_file_size_from_chunk_ref(sect_id_map, pe_directories_chunk->ref);
@@ -3005,7 +3005,7 @@ lnk_log_size_breakdown(LNK_SectionTable *st, LNK_SymbolTable *symtab)
str8_list_pushf(scratch.arena, &output_list, "--- Image Size Breakdown -------------------------------------------------------");
str8_list_pushf(scratch.arena, &output_list, " DOS Header: %M", dos_header_size);
str8_list_pushf(scratch.arena, &output_list, " DOS Program Stub: %M", dos_program_size);
str8_list_pushf(scratch.arena, &output_list, " COFF Header: %M", COFF_FileHeader_size);
str8_list_pushf(scratch.arena, &output_list, " COFF Header: %M", coff_file_header_size);
str8_list_pushf(scratch.arena, &output_list, " COFF Section Headers: %M", coff_section_header_size);
str8_list_pushf(scratch.arena, &output_list, " PE Header: %M", pe_opt_header_size);
str8_list_pushf(scratch.arena, &output_list, " Directories: %M", pe_directories_size);
@@ -3020,7 +3020,7 @@ lnk_log_size_breakdown(LNK_SectionTable *st, LNK_SymbolTable *symtab)
}
internal void
lnk_log_link_stats(LNK_ObjList obj_list, LNK_LibList *lib_index, LNK_SectionTable *st)
lnk_log_link_stats(LNK_ObjList obj_list, LNK_LibList *lib_index, LNK_SectionTable *sectab)
{
Temp scratch = scratch_begin(0, 0);
@@ -3029,7 +3029,7 @@ lnk_log_link_stats(LNK_ObjList obj_list, LNK_LibList *lib_index, LNK_SectionTabl
lib_count += lib_index[i].count;
}
U32 reloc_count = 0;
for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != NULL; sect_node = sect_node->next) {
reloc_count += sect_node->data.reloc_list.count;
}
@@ -3204,18 +3204,18 @@ lnk_chunk_off_pair_array_bsearch(LNK_ChunkOffPair *arr, U64 count, U64 value)
}
internal String8List
lnk_build_rad_chunk_map(Arena *arena, String8 image_data, U64 thread_count, LNK_ObjList objs, LNK_LibList lib_index[LNK_InputSource_Count], LNK_SectionTable *st, LNK_SymbolTable *symtab)
lnk_build_rad_chunk_map(Arena *arena, String8 image_data, U64 thread_count, LNK_ObjList objs, LNK_LibList lib_index[LNK_InputSource_Count], LNK_SectionTable *sectab, LNK_SymbolTable *symtab)
{
ProfBeginFunction();
Temp scratch = scratch_begin(&arena, 1);
String8List map = {0};
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, sectab);
ProfBegin("SECTIONS");
str8_list_pushf(arena, &map, "# SECTIONS\n");
for (LNK_SectionNode *sect_n = st->list.first; sect_n != 0; sect_n = sect_n->next) {
for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {
LNK_Section *sect = &sect_n->data;
if (sect->has_layout) {
LNK_Chunk **chunks = push_array_no_zero(scratch.arena, LNK_Chunk *, sect->layout.total_count);
@@ -3436,7 +3436,7 @@ lnk_run(int argc, char **argv)
// state
LNK_SymbolTable *symtab = lnk_symbol_table_init(tp_arena);
LNK_SectionTable *st = lnk_init_section_table(symtab, config->section_virt_off, config->sect_align, config->file_align);
LNK_SectionTable *sectab = lnk_init_section_table(symtab, config->section_virt_off, config->sect_align, config->file_align);
LNK_ImportTable *imptab_static = 0;
LNK_ImportTable *imptab_delayed = 0;
LNK_ExportTable *exptab = lnk_export_table_alloc();
@@ -3682,7 +3682,7 @@ lnk_run(int argc, char **argv)
Assert(config->machine != COFF_MachineType_Unknown);
B32 is_unloadable = !!(config->flags & LNK_ConfigFlag_DelayUnload);
B32 is_bindable = !!(config->flags & LNK_ConfigFlag_DelayBind);
imptab_delayed = lnk_import_table_alloc_delayed(st, symtab, config->machine, is_unloadable, is_bindable);
imptab_delayed = lnk_import_table_alloc_delayed(sectab, symtab, config->machine, is_unloadable, is_bindable);
}
LNK_ImportDLL *dll = lnk_import_table_search_dll(imptab_delayed, import_header->dll_name);
if (!dll) {
@@ -3695,7 +3695,7 @@ lnk_run(int argc, char **argv)
} else {
if (!imptab_static) {
Assert(config->machine != COFF_MachineType_Unknown);
imptab_static = lnk_import_table_alloc_static(st, symtab, config->machine);
imptab_static = lnk_import_table_alloc_static(sectab, symtab, config->machine);
}
LNK_ImportDLL *dll = lnk_import_table_search_dll(imptab_static, import_header->dll_name);
if (!dll) {
@@ -3769,7 +3769,7 @@ lnk_run(int argc, char **argv)
}
ProfEnd();
LNK_ObjNodeArray obj_node_arr = lnk_obj_list_push_parallel(tp, tp_arena, &obj_list, st, config->function_pad_min, unique_obj_input_list.count, input_obj_arr);
LNK_ObjNodeArray obj_node_arr = lnk_obj_list_push_parallel(tp, tp_arena, &obj_list, sectab, config->function_pad_min, unique_obj_input_list.count, input_obj_arr);
ProfBegin("Machine Compat Check");
for (U64 obj_idx = 0; obj_idx < obj_node_arr.count; ++obj_idx) {
@@ -4012,7 +4012,7 @@ lnk_run(int argc, char **argv)
String8 obj_name = str8_lit("* Resources *");
String8 obj_data = lnk_obj_from_res_file_list(tp,
tp_arena->v[0],
st,
sectab,
symtab,
res_data_list,
res_path_list,
@@ -4101,14 +4101,14 @@ lnk_run(int argc, char **argv)
case State_DiscardMetaDataSections: {
ProfBegin("Discard Meta Data Sections");
lnk_discard_meta_data_sections(st);
lnk_discard_meta_data_sections(sectab);
ProfEnd();
} break;
case State_BuildDebugDirectory: {
ProfBegin("Build Debug Directory");
// push debug directory layout chunks
LNK_Section *debug_sect = lnk_section_table_search(st, str8_lit(".rdata"));
LNK_Section *debug_sect = lnk_section_table_search(sectab, str8_lit(".rdata"));
LNK_Chunk *debug_chunk = lnk_section_push_chunk_list(debug_sect, debug_sect->root, str8_zero());
LNK_Chunk *debug_dir_array_chunk = lnk_section_push_chunk_list(debug_sect, debug_chunk, str8_zero());
@@ -4117,12 +4117,12 @@ lnk_run(int argc, char **argv)
// debug entry for PDB
if (config->debug_mode != LNK_DebugMode_None && config->debug_mode != LNK_DebugMode_Null) {
lnk_build_debug_pdb(st, symtab, debug_sect, debug_dir_array_chunk, config->time_stamp, config->guid, config->age, config->pdb_alt_path);
lnk_build_debug_pdb(sectab, symtab, debug_sect, debug_dir_array_chunk, config->time_stamp, config->guid, config->age, config->pdb_alt_path);
}
// debug entry for RDI
if (config->rad_debug == LNK_SwitchState_Yes) {
lnk_build_debug_rdi(st, symtab, debug_sect, debug_dir_array_chunk, config->time_stamp, config->guid, config->rad_debug_alt_path);
lnk_build_debug_rdi(sectab, symtab, debug_sect, debug_dir_array_chunk, config->time_stamp, config->guid, config->rad_debug_alt_path);
}
ProfEnd();
@@ -4139,38 +4139,38 @@ lnk_run(int argc, char **argv)
lnk_collect_exports_from_obj_directives(exptab, obj_list, symtab);
// build export table section
lnk_build_edata(exptab, st, symtab, config->image_name, config->machine);
lnk_build_edata(exptab, sectab, symtab, config->image_name, config->machine);
ProfEnd();
} break;
case State_MergeSections: {
ProfBegin("Merge Sections");
LNK_MergeDirectiveList merge_list = lnk_init_merge_directive_list(scratch.arena, obj_list);
lnk_section_table_merge(st, merge_list);
lnk_section_table_merge(sectab, merge_list);
ProfEnd();
} break;
case State_BuildCFGuards: {
ProfBegin("Build CF Guards");
B32 emit_suppress_flag = 1; // MSVC emits this flag but every entry has zero set.
lnk_build_guard_tables(tp, st, symtab, exptab, obj_list, config->machine, config->entry_point_name, config->guard_flags, emit_suppress_flag);
lnk_build_guard_tables(tp, sectab, symtab, exptab, obj_list, config->machine, config->entry_point_name, config->guard_flags, emit_suppress_flag);
ProfEnd();
} break;
case State_BuildBaseRelocs: {
ProfBegin("Base Relocs");
lnk_build_base_relocs(tp, tp_arena, st, symtab, config->machine, config->page_size, config->file_characteristics, obj_list);
lnk_build_base_relocs(tp, tp_arena, sectab, symtab, config->machine, config->page_size, config->file_characteristics, obj_list);
ProfEnd();
} break;
case State_FinalizeImage: {
ProfBegin("Build Win32 Header");
// remove empty section headers from output image
lnk_section_table_remove_empties(st, symtab);
lnk_section_table_remove_empties(sectab, symtab);
// collect output sections
LNK_SectionArray out_sect_arr = lnk_section_table_get_output_sections(scratch.arena, st);
LNK_SectionArray out_sect_arr = lnk_section_table_get_output_sections(scratch.arena, sectab);
// push back null section where we store image header
LNK_Section *header_sect = lnk_section_table_push_null(st);
LNK_Section *header_sect = lnk_section_table_push_null(sectab);
// fill out header section with win32 image header data
lnk_build_win32_image_header(symtab, header_sect, header_sect->root, config, out_sect_arr);
@@ -4178,24 +4178,24 @@ lnk_run(int argc, char **argv)
ProfEnd();
// finalize sections
lnk_section_table_build_data(tp, st, config->machine);
lnk_section_table_assign_indices(st);
lnk_section_table_assign_virtual_offsets(st);
lnk_section_table_assign_file_offsets(st);
lnk_section_table_build_data(tp, sectab, config->machine);
lnk_section_table_assign_indices(sectab);
lnk_section_table_assign_virtual_offsets(sectab);
lnk_section_table_assign_file_offsets(sectab);
ProfBegin("Image Serialize");
image_data = lnk_section_table_serialize(tp, scratch.arena, st, config->machine);
image_data = lnk_section_table_serialize(tp, scratch.arena, sectab, config->machine);
Assert(image_data.size > 0);
ProfEnd();
// image layout is finalized, section id map is stable after this point
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, sectab);
ProfBegin("Patch Relocs");
U64 base_addr = lnk_get_base_addr(config);
lnk_patch_relocs_obj(tp, obj_list, symtab, st, sect_id_map, image_data, base_addr);
lnk_patch_relocs_linker(tp, symtab, st, sect_id_map, image_data, base_addr);
lnk_patch_relocs_obj(tp, obj_list, symtab, sectab, sect_id_map, image_data, base_addr);
lnk_patch_relocs_linker(tp, symtab, sectab, sect_id_map, image_data, base_addr);
ProfEnd();
@@ -4333,7 +4333,7 @@ lnk_run(int argc, char **argv)
} break;
case State_BuildRadChunkMap: {
ProfBegin("RAD Chunk Map");
String8List map = lnk_build_rad_chunk_map(scratch.arena, image_data, config->worker_count, obj_list, lib_index, st, symtab);
String8List map = lnk_build_rad_chunk_map(scratch.arena, image_data, config->worker_count, obj_list, lib_index, sectab, symtab);
lnk_write_data_list_to_file_path(config->rad_chunk_map_name, config->temp_rad_chunk_map_name, map);
ProfEnd();
} break;
@@ -4343,12 +4343,12 @@ lnk_run(int argc, char **argv)
LNK_CodeViewInput input = lnk_make_code_view_input(tp, tp_arena, config->lib_dir_list, obj_list);
CV_DebugT *types = lnk_import_types(tp, tp_arena, &input);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, sectab);
if (config->rad_debug == LNK_SwitchState_Yes) {
lnk_timer_begin(LNK_Timer_Rdi);
RDI_Arch arch = rdi_arch_from_coff_machine(config->machine);
LNK_SectionArray image_sects = lnk_section_table_get_output_sections(scratch.arena, st);
LNK_SectionArray image_sects = lnk_section_table_get_output_sections(scratch.arena, sectab);
String8List rdi_data = lnk_build_rad_debug_info(tp,
tp_arena,
@@ -4553,10 +4553,10 @@ lnk_run(int argc, char **argv)
}
if (lnk_get_log_status(LNK_Log_SizeBreakdown)) {
lnk_log_size_breakdown(st, symtab);
lnk_log_size_breakdown(sectab, symtab);
}
if (lnk_get_log_status(LNK_Log_LinkStats)) {
lnk_log_link_stats(obj_list, lib_index, st);
lnk_log_link_stats(obj_list, lib_index, sectab);
}
if (lnk_get_log_status(LNK_Log_Timers)) {
lnk_log_timers();
@@ -4566,7 +4566,7 @@ lnk_run(int argc, char **argv)
// linker is done, punt memory release to OS
//arena_release(ht_arena);
//lnk_section_table_release(&st);
//lnk_section_table_release(&sectab);
//lnk_export_table_release(&export_table);
//lnk_import_table_release(&imptab_static);
//lnk_import_table_release(&imptab_delayed);
+13 -13
View File
@@ -204,7 +204,7 @@ typedef struct
{
String8 image_data;
LNK_SymbolTable *symtab;
LNK_SectionTable *st;
LNK_SectionTable *sectab;
LNK_Section **sect_id_map;
U64 base_addr;
LNK_Section **sect_arr;
@@ -215,7 +215,7 @@ typedef struct
{
String8 image_data;
LNK_SymbolTable *symtab;
LNK_SectionTable *st;
LNK_SectionTable *sectab;
LNK_Section **sect_id_map;
U64 base_addr;
LNK_Obj **obj_arr;
@@ -262,10 +262,10 @@ internal void lnk_merge_manifest_files(String8 mt_path, String8 out_name, Str
////////////////////////////////
// Resources
internal void lnk_serialize_pe_resource_tree(LNK_SectionTable *st, LNK_SymbolTable *symtab, PE_ResourceDir *root_dir);
internal void lnk_add_resource_debug_s(LNK_SectionTable *st, LNK_SymbolTable *symtab, String8 obj_path, String8 cwd_path, String8 exe_path, CV_Arch arch, String8List res_file_list, MD5Hash *res_hash_array);
internal void lnk_serialize_pe_resource_tree(LNK_SectionTable *sectab, LNK_SymbolTable *symtab, PE_ResourceDir *root_dir);
internal void lnk_add_resource_debug_s(LNK_SectionTable *sectab, LNK_SymbolTable *symtab, String8 obj_path, String8 cwd_path, String8 exe_path, CV_Arch arch, String8List res_file_list, MD5Hash *res_hash_array);
internal String8 lnk_make_res_obj(TP_Context *tp, Arena *arena, PE_ResourceDir *root_dir, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 path, String8 cwd_path, String8 exe_path, String8List res_file_list, MD5Hash *res_hash_array);
internal String8 lnk_obj_from_res_file_list(TP_Context *tp, Arena *arena, LNK_SectionTable *st, LNK_SymbolTable *symtab, String8List res_file_list, String8List res_path_list, COFF_MachineType machine, U32 time_stamp, String8 work_dir, PathStyle system_path_style, String8 obj_name);
internal String8 lnk_obj_from_res_file_list(TP_Context *tp, Arena *arena, LNK_SectionTable *sectab, LNK_SymbolTable *symtab, String8List res_file_list, String8List res_path_list, COFF_MachineType machine, U32 time_stamp, String8 work_dir, PathStyle system_path_style, String8 obj_name);
////////////////////////////////
// Debug
@@ -275,10 +275,10 @@ internal String8 lnk_make_linker_coff_obj(TP_Context *tp, Arena *arena, COFF_Tim
////////////////////////////////
// Win32 Image Helpers
internal void lnk_build_debug_pdb(LNK_SectionTable *st, LNK_SymbolTable *symtab, LNK_Section *debug_sect, LNK_Chunk *debug_dir_array_chunk, COFF_TimeStamp time_stamp, Guid guid, U32 age, String8 pdb_path);
internal void lnk_build_debug_rdi(LNK_SectionTable *st, LNK_SymbolTable *symtab, LNK_Section *debug_sect, LNK_Chunk *debug_dir_array_chunk, COFF_TimeStamp time_stamp, Guid guid, String8 rdi_path);
internal void lnk_build_guard_tables(TP_Context *tp, LNK_SectionTable *st, LNK_SymbolTable *symtab, LNK_ExportTable *exptab, LNK_ObjList obj_list, COFF_MachineType machine, String8 entry_point_name, LNK_GuardFlags guard_flags, B32 emit_suppress_flag);
internal void lnk_build_base_relocs(TP_Context *tp, TP_Arena *tp_arena, LNK_SectionTable *st, LNK_SymbolTable *symtab, COFF_MachineType machine, U64 page_size, PE_ImageFileCharacteristics file_chars, LNK_ObjList obj_list);
internal void lnk_build_debug_pdb(LNK_SectionTable *sectab, LNK_SymbolTable *symtab, LNK_Section *debug_sect, LNK_Chunk *debug_dir_array_chunk, COFF_TimeStamp time_stamp, Guid guid, U32 age, String8 pdb_path);
internal void lnk_build_debug_rdi(LNK_SectionTable *sectab, LNK_SymbolTable *symtab, LNK_Section *debug_sect, LNK_Chunk *debug_dir_array_chunk, COFF_TimeStamp time_stamp, Guid guid, String8 rdi_path);
internal void lnk_build_guard_tables(TP_Context *tp, LNK_SectionTable *sectab, LNK_SymbolTable *symtab, LNK_ExportTable *exptab, LNK_ObjList obj_list, COFF_MachineType machine, String8 entry_point_name, LNK_GuardFlags guard_flags, B32 emit_suppress_flag);
internal void lnk_build_base_relocs(TP_Context *tp, TP_Arena *tp_arena, LNK_SectionTable *sectab, LNK_SymbolTable *symtab, COFF_MachineType machine, U64 page_size, PE_ImageFileCharacteristics file_chars, LNK_ObjList obj_list);
internal LNK_Chunk * lnk_build_dos_header(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent_chunk);
internal LNK_Chunk * lnk_build_pe_magic(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent);
internal LNK_Chunk * lnk_build_coff_file_header(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent, COFF_MachineType machine, COFF_TimeStamp time_stamp, PE_ImageFileCharacteristics file_characteristics);
@@ -290,15 +290,15 @@ internal LNK_Chunk * lnk_build_win32_image_header(LNK_SymbolTable *symtab, LNK_S
////////////////////////////////
// Relocs
internal void lnk_patch_relocs_linker(TP_Context *tp, LNK_SymbolTable *symtab, LNK_SectionTable *st, LNK_Section **sect_id_map, String8 image_data, U64 base_addr);
internal void lnk_patch_relocs_obj(TP_Context *tp, LNK_ObjList obj_list, LNK_SymbolTable *symtab, LNK_SectionTable *st, LNK_Section **sect_id_map, String8 image_data, U64 base_addr);
internal void lnk_patch_relocs_linker(TP_Context *tp, LNK_SymbolTable *symtab, LNK_SectionTable *sectab, LNK_Section **sect_id_map, String8 image_data, U64 base_addr);
internal void lnk_patch_relocs_obj(TP_Context *tp, LNK_ObjList obj_list, LNK_SymbolTable *symtab, LNK_SectionTable *sectab, LNK_Section **sect_id_map, String8 image_data, U64 base_addr);
internal void lnk_apply_reloc(U64 base_addr, U64 virt_align, U64 file_align, LNK_Section **sect_id_map, LNK_SymbolTable *symtab, String8 chunk_data, LNK_Reloc *reloc);
////////////////////////////////
internal void lnk_log_size_breakdown(LNK_SectionTable *st, LNK_SymbolTable *symtab);
internal void lnk_log_link_stats(LNK_ObjList obj_list, LNK_LibList *lib_index, LNK_SectionTable *st);
internal void lnk_log_size_breakdown(LNK_SectionTable *sectab, LNK_SymbolTable *symtab);
internal void lnk_log_link_stats(LNK_ObjList obj_list, LNK_LibList *lib_index, LNK_SectionTable *sectab);
internal void lnk_log_timers(void);
////////////////////////////////
+2 -2
View File
@@ -171,7 +171,7 @@ lnk_export_array_from_list(Arena *arena, LNK_ExportList list)
}
internal void
lnk_build_edata(LNK_ExportTable *exptab, LNK_SectionTable *st, LNK_SymbolTable *symtab, String8 image_name, COFF_MachineType machine)
lnk_build_edata(LNK_ExportTable *exptab, LNK_SectionTable *sectab, LNK_SymbolTable *symtab, String8 image_name, COFF_MachineType machine)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
@@ -195,7 +195,7 @@ lnk_build_edata(LNK_ExportTable *exptab, LNK_SectionTable *st, LNK_SymbolTable *
}
}
LNK_Section *edata = lnk_section_table_search(st, str8_lit(".edata"));
LNK_Section *edata = lnk_section_table_search(sectab, str8_lit(".edata"));
// push header
PE_ExportTableHeader *header = push_array(edata->arena, PE_ExportTableHeader, 1);
+1 -1
View File
@@ -41,6 +41,6 @@ internal LNK_ExportTable * lnk_export_table_alloc(void);
internal void lnk_export_table_release(LNK_ExportTable **exptab_ptr);
internal LNK_Export * lnk_export_table_search(LNK_ExportTable *exptab, String8 name);
internal void lnk_collect_exports_from_def_files(LNK_ExportTable *exptab, String8List path_list);
internal void lnk_build_edata(LNK_ExportTable *exptab, LNK_SectionTable *st, LNK_SymbolTable *symtab, String8 image_name, COFF_MachineType machine);
internal void lnk_build_edata(LNK_ExportTable *exptab, LNK_SectionTable *sectab, LNK_SymbolTable *symtab, String8 image_name, COFF_MachineType machine);
internal void lnk_collect_exports_from_obj_directives(LNK_ExportTable *exptab, LNK_ObjList obj_list, LNK_SymbolTable *symtab);
+6 -6
View File
@@ -2,12 +2,12 @@
// Licensed under the MIT license (https://opensource.org/license/mit/)
internal LNK_ImportTable *
lnk_import_table_alloc_static(LNK_SectionTable *st, LNK_SymbolTable *symtab, COFF_MachineType machine)
lnk_import_table_alloc_static(LNK_SectionTable *sectab, LNK_SymbolTable *symtab, COFF_MachineType machine)
{
ProfBeginFunction();
LNK_Section *data_sect = lnk_section_table_push(st, str8_lit(".idata"), LNK_IDATA_SECTION_FLAGS);
LNK_Section *code_sect = lnk_section_table_search(st, str8_lit(".text"));
LNK_Section *data_sect = lnk_section_table_push(sectab, str8_lit(".idata"), LNK_IDATA_SECTION_FLAGS);
LNK_Section *code_sect = lnk_section_table_search(sectab, str8_lit(".text"));
LNK_Chunk *dll_table_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero());
LNK_Chunk *int_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero());
@@ -47,12 +47,12 @@ lnk_import_table_alloc_static(LNK_SectionTable *st, LNK_SymbolTable *symtab, COF
}
internal LNK_ImportTable *
lnk_import_table_alloc_delayed(LNK_SectionTable *st, LNK_SymbolTable *symtab, COFF_MachineType machine, B32 is_unloadable, B32 is_bindable)
lnk_import_table_alloc_delayed(LNK_SectionTable *sectab, LNK_SymbolTable *symtab, COFF_MachineType machine, B32 is_unloadable, B32 is_bindable)
{
ProfBeginFunction();
LNK_Section *data_sect = lnk_section_table_push(st, str8_lit(".didat"), LNK_DEBUG_DIR_SECTION_FLAGS);
LNK_Section *code_sect = lnk_section_table_search(st, str8_lit(".text"));
LNK_Section *data_sect = lnk_section_table_push(sectab, str8_lit(".didat"), LNK_DEBUG_DIR_SECTION_FLAGS);
LNK_Section *code_sect = lnk_section_table_search(sectab, str8_lit(".text"));
LNK_Chunk *dll_table_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero());
LNK_Chunk *int_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero());
+2 -2
View File
@@ -59,8 +59,8 @@ typedef struct LNK_ImportTable
HashTable *dll_ht;
} LNK_ImportTable;
internal LNK_ImportTable * lnk_import_table_alloc_static(LNK_SectionTable *st, LNK_SymbolTable *symtab, COFF_MachineType machine);
internal LNK_ImportTable * lnk_import_table_alloc_delayed(LNK_SectionTable *st, LNK_SymbolTable *symtab, COFF_MachineType machine, B32 is_unloadable, B32 is_bindable);
internal LNK_ImportTable * lnk_import_table_alloc_static(LNK_SectionTable *sectab, LNK_SymbolTable *symtab, COFF_MachineType machine);
internal LNK_ImportTable * lnk_import_table_alloc_delayed(LNK_SectionTable *sectab, LNK_SymbolTable *symtab, COFF_MachineType machine, B32 is_unloadable, B32 is_bindable);
internal void lnk_import_table_release(LNK_ImportTable **imptab);
internal LNK_ImportDLL * lnk_import_table_push_dll_static(LNK_ImportTable *imptab, LNK_SymbolTable *symtab, String8 dll_name, COFF_MachineType machine);
internal LNK_ImportDLL * lnk_import_table_push_dll_delayed(LNK_ImportTable *imptab, LNK_SymbolTable *symtab, String8 dll_name, COFF_MachineType machine);
+3 -3
View File
@@ -939,16 +939,16 @@ lnk_build_import_lib(TP_Context *tp, TP_Arena *arena, COFF_MachineType machine,
}
LNK_InputObj **inputs = lnk_array_from_input_obj_list(scratch.arena, input_obj_list);
LNK_SectionTable *st = lnk_section_table_alloc(0,0,0);
LNK_SectionTable *sectab = lnk_section_table_alloc(0,0,0);
LNK_ObjList obj_list = {0};
lnk_obj_list_push_parallel(tp, arena, &obj_list, st, 0, input_obj_list.count, inputs);
lnk_obj_list_push_parallel(tp, arena, &obj_list, sectab, 0, input_obj_list.count, inputs);
LNK_LibBuild import_lib = lnk_build_lib(scratch.arena, machine, time_stamp, dll_name, obj_list, exptab);
B32 emit_second_member = 0; // MSVC linker refuses to link with lib that has the second member.
String8List coff_archive_data = lnk_coff_archive_from_lib_build(arena->v[0], &import_lib, emit_second_member, time_stamp, /* -rw-r--r-- */ 644);
// cleanup memory
lnk_section_table_release(&st);
lnk_section_table_release(&sectab);
scratch_end(scratch);
ProfEnd();
+15 -15
View File
@@ -546,7 +546,7 @@ THREAD_POOL_TASK_FUNC(lnk_chunk_counter)
for (U64 chunk_idx = 0; chunk_idx < obj->chunk_count; chunk_idx += 1) {
String8 name = obj->sect_name_arr[chunk_idx];
LNK_Chunk *chunk = obj->chunk_arr[chunk_idx];
LNK_Section *sect = lnk_section_table_search(task->st, name);
LNK_Section *sect = lnk_section_table_search(task->sectab, name);
U64 count = 0;
lnk_visit_chunks(0, chunk, lnk_chunk_get_count_cb, &count);
@@ -586,7 +586,7 @@ THREAD_POOL_TASK_FUNC(lnk_chunk_ref_assigner)
LNK_Chunk *chunk = obj->chunk_arr[chunk_idx];
// :find_chunk_section
LNK_Section *sect = lnk_section_table_search(task->st, name);
LNK_Section *sect = lnk_section_table_search(task->sectab, name);
// :chunk_ref_assign
LNK_ChunkRefAssign ctx = {0};
@@ -605,7 +605,7 @@ internal LNK_ObjNodeArray
lnk_obj_list_push_parallel(TP_Context *tp,
TP_Arena *arena,
LNK_ObjList *obj_list,
LNK_SectionTable *st,
LNK_SectionTable *sectab,
U64 *function_pad_min,
U64 input_count,
LNK_InputObj **inputs)
@@ -627,7 +627,7 @@ lnk_obj_list_push_parallel(TP_Context *tp,
}
ProfEnd();
if (st) {
if (sectab) {
ProfBegin("Section Table Update");
{
TP_Temp temp = tp_temp_begin(arena);
@@ -647,7 +647,7 @@ lnk_obj_list_push_parallel(TP_Context *tp,
HashTable *ht = hash_table_init(arena->v[0], 128);
for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != 0; sect_node = sect_node->next) {
LNK_Section *sect = &sect_node->data;
hash_table_push_string_u64(arena->v[0], ht, sect->name, sect->flags);
}
@@ -690,7 +690,7 @@ lnk_obj_list_push_parallel(TP_Context *tp,
// push new sections for :find_chunk_section
for (LNK_SectDefn *curr = new_list.first; curr != 0; curr = curr->next) {
lnk_section_table_push(st, curr->name, curr->flags & ~COFF_SectionFlags_LnkFlags);
lnk_section_table_push(sectab, curr->name, curr->flags & ~COFF_SectionFlags_LnkFlags);
}
tp_temp_end(temp);
@@ -700,20 +700,20 @@ lnk_obj_list_push_parallel(TP_Context *tp,
ProfBegin("Count Chunks Per Section");
U64 **chunk_ids;
{
U64 **chunk_counts = push_array_no_zero(scratch.arena, U64 *, st->id_max);
for (U64 sect_idx = 0; sect_idx < st->id_max; sect_idx += 1) {
U64 **chunk_counts = push_array_no_zero(scratch.arena, U64 *, sectab->id_max);
for (U64 sect_idx = 0; sect_idx < sectab->id_max; sect_idx += 1) {
chunk_counts[sect_idx] = push_array(scratch.arena, U64, obj_arr.count);
}
LNK_ChunkCounter task = {0};
task.st = st;
task.sectab = sectab;
task.obj_arr = obj_arr.v;
task.chunk_counts = chunk_counts;
tp_for_parallel(tp, 0, obj_arr.count, lnk_chunk_counter, &task);
chunk_ids = chunk_counts;
for (U64 sect_idx = 1; sect_idx < st->id_max; sect_idx += 1) {
LNK_Section *sect = lnk_section_table_search_id(st, sect_idx);
for (U64 sect_idx = 1; sect_idx < sectab->id_max; sect_idx += 1) {
LNK_Section *sect = lnk_section_table_search_id(sectab, sect_idx);
if (!sect) continue;
for (U64 obj_idx = 0; obj_idx < obj_arr.count; obj_idx += 1) {
U64 chunk_id_base = sect->cman->total_chunk_count;
@@ -727,16 +727,16 @@ lnk_obj_list_push_parallel(TP_Context *tp,
ProfBegin("Assign Chunk Refs");
{
LNK_ChunkRefAssigner task;
task.st = st;
task.sectab = sectab;
task.range_arr = tp_divide_work(scratch.arena, obj_arr.count, tp->worker_count);
task.chunk_ids = chunk_ids;
task.obj_arr = obj_arr.v;
task.nosort_chunk_list_arr_arr = lnk_make_chunk_list_arr_arr(scratch.arena, st->id_max, tp->worker_count);
task.chunk_list_arr_arr = lnk_make_chunk_list_arr_arr(scratch.arena, st->id_max, tp->worker_count);
task.nosort_chunk_list_arr_arr = lnk_make_chunk_list_arr_arr(scratch.arena, sectab->id_max, tp->worker_count);
task.chunk_list_arr_arr = lnk_make_chunk_list_arr_arr(scratch.arena, sectab->id_max, tp->worker_count);
tp_for_parallel(tp, arena, tp->worker_count, lnk_chunk_ref_assigner, &task);
// merge chunks
for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != 0; sect_node = sect_node->next) {
LNK_Section *sect = &sect_node->data;
lnk_chunk_list_concat_in_place_arr(sect->nosort_chunk->u.list, task.nosort_chunk_list_arr_arr[sect->id], tp->worker_count);
lnk_chunk_list_concat_in_place_arr(sect->root->u.list, task.chunk_list_arr_arr[sect->id], tp->worker_count);
+4 -4
View File
@@ -112,7 +112,7 @@ typedef struct
LNK_ObjNode *obj_node_arr;
U64 obj_id_base;
LNK_SectDefnList *defn_arr;
LNK_SectionTable *st;
LNK_SectionTable *sectab;
U64 *function_pad_min;
} LNK_ObjIniter;
@@ -126,7 +126,7 @@ typedef struct
typedef struct
{
LNK_SectionTable *st;
LNK_SectionTable *sectab;
LNK_ObjNode *obj_arr;
U64 **chunk_counts;
} LNK_ChunkCounter;
@@ -139,7 +139,7 @@ typedef struct
typedef struct
{
LNK_SectionTable *st;
LNK_SectionTable *sectab;
Rng1U64 *range_arr;
U64 **chunk_ids;
LNK_ObjNode *obj_arr;
@@ -198,7 +198,7 @@ internal LNK_InputObjList lnk_input_obj_list_from_string_list(Arena *arena, Stri
internal LNK_Obj ** lnk_obj_arr_from_list(Arena *arena, LNK_ObjList list);
internal LNK_ObjNodeArray lnk_obj_list_reserve(Arena *arena, LNK_ObjList *list, U64 count);
internal LNK_ChunkList * lnk_collect_obj_chunks(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8 name, String8 postfix, B32 collect_discarded);
internal LNK_ObjNodeArray lnk_obj_list_push_parallel(TP_Context *tp, TP_Arena *tp_arena, LNK_ObjList *obj_list, LNK_SectionTable *st, U64 *function_pad_min, U64 input_count, LNK_InputObj **inputs);
internal LNK_ObjNodeArray lnk_obj_list_push_parallel(TP_Context *tp, TP_Arena *tp_arena, LNK_ObjList *obj_list, LNK_SectionTable *sectab, U64 *function_pad_min, 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, LNK_Obj *obj, String8 obj_path, String8 lib_path, B32 is_big_obj, U64 function_pad_min, U64 sect_count, COFF_SectionHeader *section_table, U64 symbol_count, void *symbol_table, String8 string_table, LNK_ChunkPtr *chunk_table, LNK_Chunk *master_common_block);
+70 -70
View File
@@ -271,33 +271,33 @@ lnk_section_table_alloc(U64 section_virt_off, U64 sect_align, U64 file_align)
{
ProfBeginFunction();
Arena *arena = arena_alloc();
LNK_SectionTable *st = push_array(arena, LNK_SectionTable, 1);
st->arena = arena;
st->section_virt_off = section_virt_off;
st->sect_align = sect_align;
st->file_align = file_align;
LNK_SectionTable *sectab = push_array(arena, LNK_SectionTable, 1);
sectab->arena = arena;
sectab->section_virt_off = section_virt_off;
sectab->sect_align = sect_align;
sectab->file_align = file_align;
ProfEnd();
return st;
return sectab;
}
internal void
lnk_section_table_release(LNK_SectionTable **st_ptr)
{
ProfBeginFunction();
LNK_SectionTable *st = *st_ptr;
arena_release(st->arena);
LNK_SectionTable *sectab = *st_ptr;
arena_release(sectab->arena);
*st_ptr = NULL;
ProfEnd();
}
internal LNK_Section *
lnk_section_table_push(LNK_SectionTable *st, String8 name, COFF_SectionFlags flags)
lnk_section_table_push(LNK_SectionTable *sectab, String8 name, COFF_SectionFlags flags)
{
ProfBeginFunction();
LNK_SectionList *sect_list = &st->list;
LNK_SectionList *sect_list = &sectab->list;
LNK_SectionNode *sect_node = push_array(st->arena, LNK_SectionNode, 1);
String8 sort_index = lnk_make_section_sort_index(st->arena, name, flags, st->id_max);
LNK_SectionNode *sect_node = push_array(sectab->arena, LNK_SectionNode, 1);
String8 sort_index = lnk_make_section_sort_index(sectab->arena, name, flags, sectab->id_max);
B32 found = 0;
for (LNK_SectionNode *curr = sect_list->first, *prev = NULL; curr != NULL; prev = curr, curr = curr->next) {
@@ -320,8 +320,8 @@ lnk_section_table_push(LNK_SectionTable *st, String8 name, COFF_SectionFlags fla
}
sect_list->count += 1;
U64 sect_id = st->id_max;
st->id_max += 1;
U64 sect_id = sectab->id_max;
sectab->id_max += 1;
LNK_Section *sect = &sect_node->data;
sect->arena = arena_alloc();
@@ -329,7 +329,7 @@ lnk_section_table_push(LNK_SectionTable *st, String8 name, COFF_SectionFlags fla
sect->name = push_str8_copy(sect->arena, name);
sect->sort_index = sort_index;
sect->flags = flags;
sect->cman = lnk_chunk_manager_alloc(sect->arena, sect_id, st->file_align);
sect->cman = lnk_chunk_manager_alloc(sect->arena, sect_id, sectab->file_align);
sect->root = sect->cman->root;
sect->nosort_chunk = lnk_chunk_push_list(sect->arena, sect->cman, sect->root, str8(0,0));
sect->nosort_chunk->sort_chunk = 0;
@@ -345,12 +345,12 @@ lnk_section_table_push(LNK_SectionTable *st, String8 name, COFF_SectionFlags fla
}
internal LNK_Section *
lnk_section_table_push_null(LNK_SectionTable *st)
lnk_section_table_push_null(LNK_SectionTable *sectab)
{
LNK_SectionList *list = &st->list;
SLLQueuePushFront(list->first, list->last, st->null_sect);
LNK_SectionList *list = &sectab->list;
SLLQueuePushFront(list->first, list->last, sectab->null_sect);
list->count += 1;
return &st->null_sect->data;
return &sectab->null_sect->data;
}
LNK_CHUNK_VISITOR_SIG(lnk_chunk_has_leaf)
@@ -375,12 +375,12 @@ LNK_CHUNK_VISITOR_SIG(lnk_chunk_mark_discarded)
}
internal void
lnk_section_table_remove(LNK_SectionTable *st, LNK_SymbolTable *symtab, String8 name)
lnk_section_table_remove(LNK_SectionTable *sectab, LNK_SymbolTable *symtab, String8 name)
{
ProfBeginFunction();
// remove node from list
LNK_SectionNode *sect_node = lnk_section_list_remove(&st->list, name);
LNK_SectionNode *sect_node = lnk_section_list_remove(&sectab->list, name);
LNK_Section *sect = &sect_node->data;
// remove symbol for section root chunk
@@ -390,22 +390,22 @@ lnk_section_table_remove(LNK_SectionTable *st, LNK_SymbolTable *symtab, String8
lnk_visit_chunks(sect->id, sect->root, lnk_chunk_mark_discarded, NULL);
// push to empties
SLLQueuePush(st->empties_list.first, st->empties_list.last, sect_node);
st->empties_list.count += 1;
SLLQueuePush(sectab->empties_list.first, sectab->empties_list.last, sect_node);
sectab->empties_list.count += 1;
ProfEnd();
}
internal LNK_Section *
lnk_section_table_search(LNK_SectionTable *st, String8 name)
lnk_section_table_search(LNK_SectionTable *sectab, String8 name)
{
return lnk_section_list_search(&st->list, name);
return lnk_section_list_search(&sectab->list, name);
}
internal LNK_Section *
lnk_section_table_search_id(LNK_SectionTable *st, U64 id)
lnk_section_table_search_id(LNK_SectionTable *sectab, U64 id)
{
for (LNK_SectionNode *node = st->list.first; node != NULL; node = node->next) {
for (LNK_SectionNode *node = sectab->list.first; node != NULL; node = node->next) {
if (node->data.id == id) {
return &node->data;
}
@@ -414,16 +414,16 @@ lnk_section_table_search_id(LNK_SectionTable *st, U64 id)
}
internal void
lnk_section_table_merge(LNK_SectionTable *st, LNK_MergeDirectiveList merge_list)
lnk_section_table_merge(LNK_SectionTable *sectab, LNK_MergeDirectiveList merge_list)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
LNK_Section **src_dst = push_array(scratch.arena, LNK_Section *, st->id_max);
LNK_Section **src_dst = push_array(scratch.arena, LNK_Section *, sectab->id_max);
for (LNK_MergeDirectiveNode *merge_node = merge_list.first; merge_node != NULL; merge_node = merge_node->next) {
LNK_MergeDirective *merge = &merge_node->data;
// are we trying to merge section that was already merged?
LNK_Section *merge_sect = lnk_section_list_search(&st->merge_list, merge->src);
LNK_Section *merge_sect = lnk_section_list_search(&sectab->merge_list, merge->src);
if (merge_sect) {
LNK_Section *dst = src_dst[merge_sect->id];
B32 is_ambiguous_merge = !str8_match(dst->name, merge->dst, 0);
@@ -436,7 +436,7 @@ lnk_section_table_merge(LNK_SectionTable *st, LNK_MergeDirectiveList merge_list)
}
// find source seciton
LNK_Section *src = lnk_section_table_search(st, merge->src);
LNK_Section *src = lnk_section_table_search(sectab, merge->src);
if (src == NULL) {
lnk_error(LNK_Warning_IllData, "Can't find section \"%S\" to merge with \"%S\"", merge->src, merge->dst);
// TODO: supplement obj path if applicable
@@ -444,7 +444,7 @@ lnk_section_table_merge(LNK_SectionTable *st, LNK_MergeDirectiveList merge_list)
}
// handle case where destination section doesn't exist
LNK_Section *dst = lnk_section_table_search(st, merge->dst);
LNK_Section *dst = lnk_section_table_search(sectab, merge->dst);
if (dst == NULL) {
src->name = push_str8_copy(src->arena, merge->dst);
src_dst[src->id] = src;
@@ -458,24 +458,24 @@ lnk_section_table_merge(LNK_SectionTable *st, LNK_MergeDirectiveList merge_list)
lnk_section_merge(dst, src);
// remove from output section list
LNK_SectionNode *src_node = lnk_section_list_remove(&st->list, src->name);
LNK_SectionNode *src_node = lnk_section_list_remove(&sectab->list, src->name);
// push section to merged list
SLLQueuePush(st->merge_list.first, st->merge_list.last, src_node);
st->merge_list.count += 1;
SLLQueuePush(sectab->merge_list.first, sectab->merge_list.last, src_node);
sectab->merge_list.count += 1;
}
scratch_end(scratch);
ProfEnd();
}
internal void
lnk_section_table_remove_empties(LNK_SectionTable *st, LNK_SymbolTable *symtab)
lnk_section_table_remove_empties(LNK_SectionTable *sectab, LNK_SymbolTable *symtab)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
String8List name_list = {0};
for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != NULL; sect_node = sect_node->next) {
LNK_Section *sect = &sect_node->data;
B32 no_data = 1;
@@ -488,28 +488,28 @@ lnk_section_table_remove_empties(LNK_SectionTable *st, LNK_SymbolTable *symtab)
}
for (String8Node *name = name_list.first; name != NULL; name = name->next) {
lnk_section_table_remove(st, symtab, name->string);
lnk_section_table_remove(sectab, symtab, name->string);
}
scratch_end(scratch);
ProfEnd();
}
internal LNK_SectionArray
lnk_section_table_get_output_sections(Arena *arena, LNK_SectionTable *st)
lnk_section_table_get_output_sections(Arena *arena, LNK_SectionTable *sectab)
{
LNK_SectionArray result = {0};
result.count = 0;
result.v = push_array(arena, LNK_Section, st->list.count);
result.v = push_array(arena, LNK_Section, sectab->list.count);
for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != 0; sect_node = sect_node->next) {
if (sect_node->data.emit_header && sect_node->data.has_layout) {
Assert(result.count < st->list.count);
Assert(result.count < sectab->list.count);
result.v[result.count] = sect_node->data;
result.count += 1;
}
}
U64 unused_entry_count = st->list.count - result.count;
U64 unused_entry_count = sectab->list.count - result.count;
arena_pop(arena, unused_entry_count * sizeof(result.v[0]));
return result;
@@ -526,12 +526,12 @@ THREAD_POOL_TASK_FUNC(lnk_section_data_builder)
}
internal void
lnk_section_table_build_data(TP_Context *tp, LNK_SectionTable *st, COFF_MachineType machine)
lnk_section_table_build_data(TP_Context *tp, LNK_SectionTable *sectab, COFF_MachineType machine)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
LNK_SectionPtrArray sect_arr = lnk_section_ptr_array_from_list(scratch.arena, st->list);
LNK_SectionPtrArray sect_arr = lnk_section_ptr_array_from_list(scratch.arena, sectab->list);
LNK_SectionDataBuilder task = {0};
task.machine = machine;
@@ -544,32 +544,32 @@ lnk_section_table_build_data(TP_Context *tp, LNK_SectionTable *st, COFF_MachineT
}
internal void
lnk_section_table_assign_virtual_offsets(LNK_SectionTable *st)
lnk_section_table_assign_virtual_offsets(LNK_SectionTable *sectab)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st);
U64 cursor = st->section_virt_off;
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, sectab);
U64 cursor = sectab->section_virt_off;
Assert(cursor >= 0x1000);
for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) {
if (sect_node == st->null_sect) continue;
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != NULL; sect_node = sect_node->next) {
if (sect_node == sectab->null_sect) continue;
LNK_Section *sect = &sect_node->data;
if (!sect->has_layout) continue;
sect->virt_off = cursor;
U64 sect_size = lnk_virt_size_from_chunk_ref(sect_id_map, sect->root->ref);
cursor += sect_size;
cursor = AlignPow2(cursor, st->sect_align);
cursor = AlignPow2(cursor, sectab->sect_align);
}
scratch_end(scratch);
ProfEnd();
}
internal void
lnk_section_table_assign_file_offsets(LNK_SectionTable *st)
lnk_section_table_assign_file_offsets(LNK_SectionTable *sectab)
{
ProfBeginFunction();
U64 cursor = 0;
for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != NULL; sect_node = sect_node->next) {
LNK_Section *sect = &sect_node->data;
if (sect->flags & COFF_SectionFlag_CntUninitializedData) {
continue;
@@ -583,11 +583,11 @@ lnk_section_table_assign_file_offsets(LNK_SectionTable *st)
}
internal void
lnk_section_table_assign_indices(LNK_SectionTable *st)
lnk_section_table_assign_indices(LNK_SectionTable *sectab)
{
ProfBeginFunction();
U64 isect = 0;
for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) {
for (LNK_SectionNode *sect_node = sectab->list.first; sect_node != NULL; sect_node = sect_node->next) {
LNK_Section *sect = &sect_node->data;
if (sect->emit_header) {
sect->isect = isect++;
@@ -597,13 +597,13 @@ lnk_section_table_assign_indices(LNK_SectionTable *st)
}
internal String8
lnk_section_table_serialize(TP_Context *tp, Arena *arena, LNK_SectionTable *st, COFF_MachineType machine)
lnk_section_table_serialize(TP_Context *tp, Arena *arena, LNK_SectionTable *sectab, COFF_MachineType machine)
{
ProfBeginFunction();
Temp scratch = scratch_begin(&arena, 1);
U64 image_size = 0;
for (LNK_SectionNode *sect_n = st->list.first; sect_n != 0; sect_n = sect_n->next) {
for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {
LNK_Section *sect = &sect_n->data;
if (sect->has_layout) {
U64 root_size = sect->layout.chunk_file_size_array[sect->root->ref.chunk_id];
@@ -615,7 +615,7 @@ lnk_section_table_serialize(TP_Context *tp, Arena *arena, LNK_SectionTable *st,
String8 image = str8(image_buffer, image_size);
U64 image_cursor = 0;
for (LNK_SectionNode *sect_n = st->list.first; sect_n != 0; sect_n = sect_n->next) {
for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {
LNK_Section *sect = &sect_n->data;
if (sect->has_layout) {
if (sect->flags & COFF_SectionFlag_CntUninitializedData) {
@@ -642,15 +642,15 @@ lnk_section_table_serialize(TP_Context *tp, Arena *arena, LNK_SectionTable *st,
}
internal LNK_ChunkPtr **
lnk_chunk_id_map_from_section_table(Arena *arena, LNK_SectionTable *st)
lnk_chunk_id_map_from_section_table(Arena *arena, LNK_SectionTable *sectab)
{
ProfBeginFunction();
LNK_ChunkPtr **chunk_id_map = push_array(arena, LNK_ChunkPtr *, st->id_max);
for (LNK_SectionNode *node = st->list.first; node != 0; node = node->next) {
LNK_ChunkPtr **chunk_id_map = push_array(arena, LNK_ChunkPtr *, sectab->id_max);
for (LNK_SectionNode *node = sectab->list.first; node != 0; node = node->next) {
LNK_Section *sect = &node->data;
chunk_id_map[sect->id] = lnk_make_chunk_id_map(arena, sect->cman);
}
if (st->list.first->data.id != 0) {
if (sectab->list.first->data.id != 0) {
chunk_id_map[0] = push_array(arena, LNK_ChunkPtr, 1);
chunk_id_map[0][0] = g_null_chunk_ptr;
}
@@ -659,15 +659,15 @@ lnk_chunk_id_map_from_section_table(Arena *arena, LNK_SectionTable *st)
}
internal LNK_Section **
lnk_sect_id_map_from_section_table(Arena *arena, LNK_SectionTable *st)
lnk_sect_id_map_from_section_table(Arena *arena, LNK_SectionTable *sectab)
{
ProfBeginFunction();
LNK_Section **map = push_array(arena, LNK_Section *, st->id_max);
LNK_SectionList *list_arr[] = { &st->list, &st->merge_list, &st->empties_list };
LNK_Section **map = push_array(arena, LNK_Section *, sectab->id_max);
LNK_SectionList *list_arr[] = { &sectab->list, &sectab->merge_list, &sectab->empties_list };
for (U64 list_idx = 0; list_idx < ArrayCount(list_arr); ++list_idx) {
for (LNK_SectionNode *sect_node = list_arr[list_idx]->first; sect_node != NULL; sect_node = sect_node->next) {
LNK_Section *sect = &sect_node->data;
Assert(sect->id < st->id_max);
Assert(sect->id < sectab->id_max);
Assert(map[sect->id] == NULL);
map[sect->id] = sect;
}
@@ -880,12 +880,12 @@ lnk_file_size_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol)
#if LNK_DEBUG_CHUNKS
internal void
lnk_dump_chunks(LNK_SectionTable *st)
lnk_dump_chunks(LNK_SectionTable *sectab)
{
Temp scratch = scratch_begin(0, 0);
LNK_ChunkPtr **chunk_id_map = lnk_chunk_id_map_from_section_table(scratch.arena, st);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st);
for (U64 sect_id = 0; sect_id < st->id_max; ++sect_id) {
LNK_ChunkPtr **chunk_id_map = lnk_chunk_id_map_from_section_table(scratch.arena, sectab);
LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, sectab);
for (U64 sect_id = 0; sect_id < sectab->id_max; ++sect_id) {
LNK_Section *sect = sect_id_map[sect_id];
if (!sect) continue;
if (sect->is_merged) continue;
+15 -15
View File
@@ -110,21 +110,21 @@ internal LNK_Chunk * lnk_section_push_chunk_list(LNK_Section *sect, LNK_Chunk
internal LNK_SectionTable * lnk_section_table_alloc(U64 section_virt_off, U64 sect_align, U64 file_align);
internal void lnk_section_table_release(LNK_SectionTable **st_ptr);
internal LNK_Section * lnk_section_table_push(LNK_SectionTable *st, String8 name, COFF_SectionFlags flags);
internal LNK_Section * lnk_section_table_push_null(LNK_SectionTable *st);
internal void lnk_section_table_remove(LNK_SectionTable *st, LNK_SymbolTable *symtab, String8 name);
internal LNK_Section * lnk_section_table_search(LNK_SectionTable *st, String8 name);
internal LNK_Section * lnk_section_table_search_id(LNK_SectionTable *st, U64 id);
internal void lnk_section_table_merge(LNK_SectionTable *st, LNK_MergeDirectiveList merge_list);
internal void lnk_section_table_remove_empties(LNK_SectionTable *st, LNK_SymbolTable *symtab);
internal void lnk_section_table_build_data(TP_Context *tp, LNK_SectionTable *st, COFF_MachineType machine);
internal void lnk_section_table_assign_virtual_offsets(LNK_SectionTable *st);
internal void lnk_section_table_assign_file_offsets(LNK_SectionTable *st);
internal void lnk_section_table_assign_indices(LNK_SectionTable *st);
internal String8 lnk_section_table_serialize(TP_Context *tp, Arena *arena, LNK_SectionTable *st, COFF_MachineType machine);
internal LNK_Section * lnk_section_table_push(LNK_SectionTable *sectab, String8 name, COFF_SectionFlags flags);
internal LNK_Section * lnk_section_table_push_null(LNK_SectionTable *sectab);
internal void lnk_section_table_remove(LNK_SectionTable *sectab, LNK_SymbolTable *symtab, String8 name);
internal LNK_Section * lnk_section_table_search(LNK_SectionTable *sectab, String8 name);
internal LNK_Section * lnk_section_table_search_id(LNK_SectionTable *sectab, U64 id);
internal void lnk_section_table_merge(LNK_SectionTable *sectab, LNK_MergeDirectiveList merge_list);
internal void lnk_section_table_remove_empties(LNK_SectionTable *sectab, LNK_SymbolTable *symtab);
internal void lnk_section_table_build_data(TP_Context *tp, LNK_SectionTable *sectab, COFF_MachineType machine);
internal void lnk_section_table_assign_virtual_offsets(LNK_SectionTable *sectab);
internal void lnk_section_table_assign_file_offsets(LNK_SectionTable *sectab);
internal void lnk_section_table_assign_indices(LNK_SectionTable *sectab);
internal String8 lnk_section_table_serialize(TP_Context *tp, Arena *arena, LNK_SectionTable *sectab, COFF_MachineType machine);
internal LNK_ChunkPtr ** lnk_chunk_id_map_from_section_table(Arena *arena, LNK_SectionTable *st);
internal LNK_Section ** lnk_sect_id_map_from_section_table(Arena *arena, LNK_SectionTable *st);
internal LNK_ChunkPtr ** lnk_chunk_id_map_from_section_table(Arena *arena, LNK_SectionTable *sectab);
internal LNK_Section ** lnk_sect_id_map_from_section_table(Arena *arena, LNK_SectionTable *sectab);
internal LNK_ChunkRef lnk_get_final_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref);
internal LNK_Section * lnk_sect_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref);
internal LNK_Chunk * lnk_chunk_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkPtr **chunk_id_map, LNK_ChunkRef chunk_ref);
@@ -146,6 +146,6 @@ internal U64 lnk_virt_size_from_symbol(LNK_Section **sect_id_map, LN
internal U64 lnk_file_size_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol);
#if LNK_DEBUG_CHUNKS
internal void lnk_dump_chunks(LNK_SectionTable *st);
internal void lnk_dump_chunks(LNK_SectionTable *sectab);
#endif
+9 -9
View File
@@ -798,7 +798,7 @@ msf_stream_alloc_(Arena *arena, MSF_StreamList *list)
internal MSF_StreamNumber
msf_stream_alloc_ex(MSF_Context *msf, MSF_UInt size)
{
MSF_StreamNode *node = msf_stream_alloc_(msf->arena, &msf->st);
MSF_StreamNode *node = msf_stream_alloc_(msf->arena, &msf->sectab);
MSF_Stream *stream = &node->data;
msf_stream_resize_ex(msf, stream, size);
return stream->sn;
@@ -854,7 +854,7 @@ msf_stream_free(MSF_Context *msf, MSF_StreamNumber sn)
B32 is_free_ok = 0;
MSF_StreamNode *stream_node = msf_find_stream_node(msf, sn);
if (stream_node) {
msf_stream_list_remove(&msf->st, stream_node);
msf_stream_list_remove(&msf->sectab, stream_node);
msf_stream_resize_ex(msf, &stream_node->data, 0);
stream_node->data.size = MSF_DELETED_STREAM_STAMP;
is_free_ok = 1;
@@ -1382,7 +1382,7 @@ internal MSF_StreamNode *
msf_find_stream_node(MSF_Context *msf, MSF_StreamNumber sn)
{
MSF_StreamNode *node;
for (node = msf->st.first; node != 0; node = node->next) {
for (node = msf->sectab.first; node != 0; node = node->next) {
if (node->data.sn == sn) {
break;
}
@@ -1645,7 +1645,7 @@ msf_open(String8 data, MSF_Context **msf_out)
msf->header_page_list = header_page_list;
msf->root_page_list = root_page_list;
msf->st_page_list = st_page_list;
msf->st = stream_list;
msf->sectab = stream_list;
*msf_out = msf;
@@ -1678,19 +1678,19 @@ msf_release(MSF_Context **msf_ptr)
}
internal String8List
msf_build_stream_table_data(Arena *arena, MSF_StreamList *st, MSF_UInt page_size, MSF_UInt page_count)
msf_build_stream_table_data(Arena *arena, MSF_StreamList *sectab, MSF_UInt page_size, MSF_UInt page_count)
{
ProfBeginFunction();
MSF_UInt *stream_count_ptr = push_array(arena, MSF_UInt, 1);
*stream_count_ptr = st->count;
*stream_count_ptr = sectab->count;
MSF_UInt *stream_size_arr = push_array(arena, MSF_UInt, st->count);
MSF_UInt *stream_size_arr = push_array(arena, MSF_UInt, sectab->count);
MSF_UInt stream_page_count = 0;
MSF_PageNumber *stream_pages_arr = push_array(arena, MSF_PageNumber, page_count);
for (MSF_StreamNode *stream_node = st->first; stream_node != 0; stream_node = stream_node->next) {
for (MSF_StreamNode *stream_node = sectab->first; stream_node != 0; stream_node = stream_node->next) {
MSF_Stream *stream = &stream_node->data;
// is page list correct?
@@ -1747,7 +1747,7 @@ msf_build_stream_table(MSF_Context *msf, MSF_UInt *stream_table_size_out)
MSF_Error error = MSF_Error_OK;
String8List st_data_list = msf_build_stream_table_data(scratch.arena, &msf->st, msf->page_size, msf->page_count);
String8List st_data_list = msf_build_stream_table_data(scratch.arena, &msf->sectab, msf->page_size, msf->page_count);
MSF_UInt st_page_count = msf_count_pages(msf->page_size, st_data_list.total_size);
msf_free_pages(msf, &msf->st_page_list); // TODO: page reuse
+1 -1
View File
@@ -82,7 +82,7 @@ typedef struct MSF_Context
MSF_PageList root_page_list;
MSF_PageList st_page_list;
MSF_PageList page_pool;
MSF_StreamList st;
MSF_StreamList sectab;
} MSF_Context;
typedef enum MSF_Error