aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2024-10-21 17:18:00 -0700
committerAndrew Kelley <andrew@ziglang.org>2024-10-23 16:27:39 -0700
commitccac11196b377bf37bed85b03bd53abfc785dc99 (patch)
tree3c1b5745ae1b0d0a45845886d17179e223f63433 /src/link/Elf.zig
parent1c459032743caff33fad7d8d24471baafc0306a0 (diff)
downloadzig-ccac11196b377bf37bed85b03bd53abfc785dc99.tar.gz
zig-ccac11196b377bf37bed85b03bd53abfc785dc99.zip
link.Elf: unstable sort for section headers
using name as tie-breaker.
Diffstat (limited to 'src/link/Elf.zig')
-rw-r--r--src/link/Elf.zig12
1 files 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);