From 0299b6922f93e0cca36bdbba9d3c12a7b29c281f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 11 Apr 2026 13:42:26 -0700 Subject: [PATCH] sort global symbols deterministically within GSI bucket --- src/linker/lnk_debug_info.c | 1 + src/linker/pdb_ext/pdb_builder.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 1f720f57..b5ecceb0 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1839,6 +1839,7 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) CV_SymbolNode *n = &nodes[i]; n->prev = n->next = 0; n->data = cv_symbol_from_ptr(symbol_arr[i]); + n->data.offset = i; gsi_push_(gsi, symbol_hashes[i], n); } } diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index e0a83335..e88b40b2 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -1827,7 +1827,11 @@ gsi_symbol_is_before(void *raw_a, void *raw_b) if (a_name.size != b_name.size) { is_before = a_name.size < b_name.size; } else { - is_before = str8_compar_ignore_case(&a_name, &b_name) < 0; + int cmp = str8_compar_ignore_case(&a_name, &b_name); + if (cmp == 0) { + cmp = u64_compar(&a->offset, &b->offset); + } + is_before = cmp < 0; } return is_before;