From 89d496c855778616537fad9ee045f0e1c24210d0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 20 Aug 2025 14:13:29 -0700 Subject: [PATCH] fix replacement rule for weak search library vs undefined --- src/linker/lnk.c | 5 +---- src/linker/lnk_symbol_table.c | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 7bf2fae5..f1b77591 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1537,9 +1537,6 @@ lnk_build_link_context(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config) if (symbol_ht) { COFF_SymbolValueInterpType interp = lnk_interp_from_symbol(symbol_ht->symbol); if (interp == COFF_SymbolValueInterp_Undefined) { - // clear slot for the weak alternate name that replaces an undefined symbol - symbol_ht->symbol = 0; - // make obj with alternamte name symbol String8 alt_name_obj; { @@ -1556,7 +1553,7 @@ lnk_build_link_context(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config) LNK_InputObj *input = lnk_input_obj_list_push(scratch.arena, &input_obj_list); input->path = alt_name_n->data.obj ? alt_name_n->data.obj->path : str8_lit("RADLINK"); input->exclude_from_debug_info = 1; - input->dedup_id = push_str8f(scratch.arena, "* ALTERNATE NAME FOR %S=%S *", alt_name_n->data.from, alt_name_n->data.to, obj_list.count); + input->dedup_id = push_str8f(scratch.arena, "* ALTERNATE NAME FOR %S=%S %u *", alt_name_n->data.from, alt_name_n->data.to, obj_list.count); input->data = alt_name_obj; input->lib = alt_name_n->data.obj ? alt_name_n->data.obj->lib : 0; } diff --git a/src/linker/lnk_symbol_table.c b/src/linker/lnk_symbol_table.c index 4e7a6a98..a9e95d60 100644 --- a/src/linker/lnk_symbol_table.c +++ b/src/linker/lnk_symbol_table.c @@ -159,7 +159,7 @@ lnk_can_replace_symbol(LNK_SymbolScope scope, LNK_Symbol *dst, LNK_Symbol *src) COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(weak_parsed, weak->u.defined.obj->header.is_big_obj); if (weak_ext->characteristics == COFF_WeakExt_SearchLibrary) { - can_replace = dst_interp == COFF_SymbolValueInterp_Weak; + can_replace = lnk_symbol_defined_is_before(dst, src); } else if (weak_ext->characteristics == COFF_WeakExt_NoLibrary) { can_replace = dst_interp == COFF_SymbolValueInterp_Weak; } else if (weak_ext->characteristics == COFF_WeakExt_SearchAlias) {