From ccac11196b377bf37bed85b03bd53abfc785dc99 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 21 Oct 2024 17:18:00 -0700 Subject: [PATCH] link.Elf: unstable sort for section headers using name as tie-breaker. --- src/link/Elf.zig | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/link/Elf.zig b/src/link/Elf.zig index ac1664ffa7..c6d4f3317c 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -3079,8 +3079,14 @@ pub fn sortShdrs( }; pub fn lessThan(ctx: Context, lhs: @This(), rhs: @This()) bool { - return shdrRank(ctx.shdrs[lhs.shndx], ctx.shstrtab) < - shdrRank(ctx.shdrs[rhs.shndx], ctx.shstrtab); + const lhs_rank = shdrRank(ctx.shdrs[lhs.shndx], ctx.shstrtab); + const rhs_rank = shdrRank(ctx.shdrs[rhs.shndx], ctx.shstrtab); + if (lhs_rank == rhs_rank) { + const lhs_name = shString(ctx.shstrtab, ctx.shdrs[lhs.shndx].sh_name); + const rhs_name = shString(ctx.shstrtab, ctx.shdrs[rhs.shndx].sh_name); + return std.mem.lessThan(u8, lhs_name, rhs_name); + } + return lhs_rank < rhs_rank; } }; @@ -3096,7 +3102,7 @@ pub fn sortShdrs( .shdrs = shdrs, .shstrtab = shstrtab, }; - mem.sort(Entry, entries, sort_context, Entry.lessThan); + mem.sortUnstable(Entry, entries, sort_context, Entry.lessThan); const backlinks = try gpa.alloc(u32, entries.len); defer gpa.free(backlinks);