diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2024-10-21 17:18:00 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2024-10-23 16:27:39 -0700 |
| commit | ccac11196b377bf37bed85b03bd53abfc785dc99 (patch) | |
| tree | 3c1b5745ae1b0d0a45845886d17179e223f63433 /src/link/Elf.zig | |
| parent | 1c459032743caff33fad7d8d24471baafc0306a0 (diff) | |
| download | zig-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.zig | 12 |
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); |
