From 8fad6da751b0094be81eaad5aa43ff074420b470 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 23 May 2025 14:44:03 -0700 Subject: [PATCH] add support for associative COMDAT symbols --- src/coff/coff_obj_writer.c | 16 ++++++++++++---- src/coff/coff_obj_writer.h | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/coff/coff_obj_writer.c b/src/coff/coff_obj_writer.c index 8992ba26..b3ca7645 100644 --- a/src/coff/coff_obj_writer.c +++ b/src/coff/coff_obj_writer.c @@ -112,7 +112,7 @@ coff_obj_writer_serialize(Arena *arena, COFF_ObjWriter *obj_writer) d_sd->length = safe_cast_u32(sect->data.total_size); d_sd->number_of_relocations = (U16)sect->reloc_count; d_sd->check_sum = 0; - d_sd->number_lo = (U16)sect->section_number; + d_sd->number_lo = s_sd->selection == COFF_ComdatSelect_Associative ? safe_cast_u16(s_sd->associate->section_number) : 0; d_sd->selection = s_sd->selection; str8_list_push(scratch.arena, &symbol_table, str8_struct(d_sd)); @@ -300,12 +300,20 @@ internal COFF_ObjSymbol * coff_obj_writer_push_symbol_secdef(COFF_ObjWriter *obj_writer, COFF_ObjSection *section, COFF_ComdatSelectType selection) { COFF_ObjSymbol *s = coff_obj_writer_push_symbol_static(obj_writer, section->name, 0, section); - COFF_ObjSymbolSecDef *sd = push_array(obj_writer->arena, COFF_ObjSymbolSecDef, 1); - sd->selection = selection; - + sd->selection = selection; str8_list_push(obj_writer->arena, &s->aux_symbols, str8_struct(sd)); + return s; +} +internal COFF_ObjSymbol * +coff_obj_writer_push_symbol_associative(COFF_ObjWriter *obj_writer, COFF_ObjSection *head, COFF_ObjSection *associate) +{ + COFF_ObjSymbol *s = coff_obj_writer_push_symbol_static(obj_writer, head->name, 0, head); + COFF_ObjSymbolSecDef *sd = push_array(obj_writer->arena, COFF_ObjSymbolSecDef, 1); + sd->selection = COFF_ComdatSelect_Associative; + sd->associate = associate; + str8_list_push(obj_writer->arena, &s->aux_symbols, str8_struct(sd)); return s; } diff --git a/src/coff/coff_obj_writer.h b/src/coff/coff_obj_writer.h index bcb7ca0a..9e6b9d68 100644 --- a/src/coff/coff_obj_writer.h +++ b/src/coff/coff_obj_writer.h @@ -27,6 +27,7 @@ typedef struct COFF_ObjSymbolWeak typedef struct COFF_ObjSymbolSecDef { COFF_ComdatSelectType selection; + struct COFF_ObjSection *associate; } COFF_ObjSymbolSecDef; typedef struct COFF_ObjSymbol @@ -104,6 +105,7 @@ internal COFF_ObjSymbol* coff_obj_writer_push_symbol(COFF_ObjWriter *obj_writer internal COFF_ObjSymbol * coff_obj_writer_push_symbol_extern(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_ObjSection *section); internal COFF_ObjSymbol * coff_obj_writer_push_symbol_static(COFF_ObjWriter *obj_writer, String8 name, U32 off, COFF_ObjSection *section); internal COFF_ObjSymbol * coff_obj_writer_push_symbol_secdef(COFF_ObjWriter *obj_writer, COFF_ObjSection *section, COFF_ComdatSelectType selection); +internal COFF_ObjSymbol * coff_obj_writer_push_symbol_associative(COFF_ObjWriter *obj_writer, COFF_ObjSection *head, COFF_ObjSection *associate); internal COFF_ObjSymbol * coff_obj_writer_push_symbol_weak(COFF_ObjWriter *obj_writer, String8 name, COFF_WeakExtType characteristics, COFF_ObjSymbol *tag); internal COFF_ObjSymbol * coff_obj_writer_push_symbol_abs(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_SymStorageClass storage_class); internal COFF_ObjSymbol * coff_obj_writer_push_symbol_undef(COFF_ObjWriter *obj_writer, String8 name);