authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-10-21 17:18:00-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-10-23 16:27:39-07:00
logccac11196b377bf37bed85b03bd53abfc785dc99
tree3c1b5745ae1b0d0a45845886d17179e223f63433
parent1c459032743caff33fad7d8d24471baafc0306a0

link.Elf: unstable sort for section headers

using name as tie-breaker.

1 files changed, 9 insertions(+), 3 deletions(-)

src/link/Elf.zig+9-3
...@@ -3079,8 +3079,14 @@ pub fn sortShdrs(...@@ -3079,8 +3079,14 @@ pub fn sortShdrs(
3079 };3079 };
30803080
3081 pub fn lessThan(ctx: Context, lhs: @This(), rhs: @This()) bool {3081 pub fn lessThan(ctx: Context, lhs: @This(), rhs: @This()) bool {
3082 return shdrRank(ctx.shdrs[lhs.shndx], ctx.shstrtab) <3082 const lhs_rank = shdrRank(ctx.shdrs[lhs.shndx], ctx.shstrtab);
3083 shdrRank(ctx.shdrs[rhs.shndx], ctx.shstrtab);3083 const rhs_rank = shdrRank(ctx.shdrs[rhs.shndx], ctx.shstrtab);
3084 if (lhs_rank == rhs_rank) {
3085 const lhs_name = shString(ctx.shstrtab, ctx.shdrs[lhs.shndx].sh_name);
3086 const rhs_name = shString(ctx.shstrtab, ctx.shdrs[rhs.shndx].sh_name);
3087 return std.mem.lessThan(u8, lhs_name, rhs_name);
3088 }
3089 return lhs_rank < rhs_rank;
3084 }3090 }
3085 };3091 };
30863092
...@@ -3096,7 +3102,7 @@ pub fn sortShdrs(...@@ -3096,7 +3102,7 @@ pub fn sortShdrs(
3096 .shdrs = shdrs,3102 .shdrs = shdrs,
3097 .shstrtab = shstrtab,3103 .shstrtab = shstrtab,
3098 };3104 };
3099 mem.sort(Entry, entries, sort_context, Entry.lessThan);3105 mem.sortUnstable(Entry, entries, sort_context, Entry.lessThan);
31003106
3101 const backlinks = try gpa.alloc(u32, entries.len);3107 const backlinks = try gpa.alloc(u32, entries.len);
3102 defer gpa.free(backlinks);3108 defer gpa.free(backlinks);