authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-02-21 22:47:52+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-02-21 22:47:52+01:00
log8ba31ed39a84ba00e85c456e74d0ea4d682d86c0
tree639f26db58c739f78fb320a7e715b2013e642143
parent55dadc3d85299a61877b4130716f67c92be5f537

elf: sort input relocs if targeting riscv64


1 files changed, 18 insertions(+), 2 deletions(-)

src/link/Elf/Object.zig+18-2
......@@ -245,6 +245,9 @@ fn initAtoms(self: *Object, allocator: Allocator, handle: std.fs.File, elf_file:
245245 atom.rel_index = @intCast(self.relocs.items.len);
246246 atom.rel_num = @intCast(relocs.len);
247247 try self.relocs.appendUnalignedSlice(allocator, relocs);
248 if (elf_file.getTarget().cpu.arch == .riscv64) {
249 sortRelocs(self.relocs.items[atom.rel_index..][0..atom.rel_num]);
250 }
248251 }
249252 },
250253 else => {},
......@@ -381,12 +384,15 @@ fn parseEhFrame(self: *Object, allocator: Allocator, handle: std.fs.File, shndx:
381384 defer allocator.free(relocs);
382385 const rel_start = @as(u32, @intCast(self.relocs.items.len));
383386 try self.relocs.appendUnalignedSlice(allocator, relocs);
387 if (elf_file.getTarget().cpu.arch == .riscv64) {
388 sortRelocs(self.relocs.items[rel_start..][0..relocs.len]);
389 }
384390 const fdes_start = self.fdes.items.len;
385391 const cies_start = self.cies.items.len;
386392
387393 var it = eh_frame.Iterator{ .data = raw };
388394 while (try it.next()) |rec| {
389 const rel_range = filterRelocs(relocs, rec.offset, rec.size + 4);
395 const rel_range = filterRelocs(self.relocs.items[rel_start..][0..relocs.len], rec.offset, rec.size + 4);
390396 switch (rec.tag) {
391397 .cie => try self.cies.append(allocator, .{
392398 .offset = data_start + rec.offset,
......@@ -449,8 +455,18 @@ fn parseEhFrame(self: *Object, allocator: Allocator, handle: std.fs.File, shndx:
449455 }
450456}
451457
458fn sortRelocs(relocs: []elf.Elf64_Rela) void {
459 const sortFn = struct {
460 fn lessThan(c: void, lhs: elf.Elf64_Rela, rhs: elf.Elf64_Rela) bool {
461 _ = c;
462 return lhs.r_offset < rhs.r_offset;
463 }
464 }.lessThan;
465 mem.sort(elf.Elf64_Rela, relocs, {}, sortFn);
466}
467
452468fn filterRelocs(
453 relocs: []align(1) const elf.Elf64_Rela,
469 relocs: []const elf.Elf64_Rela,
454470 start: u64,
455471 len: u64,
456472) struct { start: u64, len: u64 } {