Commit 8ba31ed39a

Jakub Konka <kubkon@jakubkonka.com>
2024-02-21 22:47:52
elf: sort input relocs if targeting riscv64
1 parent 55dadc3
Changed files (1)
src
link
src/link/Elf/Object.zig
@@ -245,6 +245,9 @@ fn initAtoms(self: *Object, allocator: Allocator, handle: std.fs.File, elf_file:
                 atom.rel_index = @intCast(self.relocs.items.len);
                 atom.rel_num = @intCast(relocs.len);
                 try self.relocs.appendUnalignedSlice(allocator, relocs);
+                if (elf_file.getTarget().cpu.arch == .riscv64) {
+                    sortRelocs(self.relocs.items[atom.rel_index..][0..atom.rel_num]);
+                }
             }
         },
         else => {},
@@ -381,12 +384,15 @@ fn parseEhFrame(self: *Object, allocator: Allocator, handle: std.fs.File, shndx:
     defer allocator.free(relocs);
     const rel_start = @as(u32, @intCast(self.relocs.items.len));
     try self.relocs.appendUnalignedSlice(allocator, relocs);
+    if (elf_file.getTarget().cpu.arch == .riscv64) {
+        sortRelocs(self.relocs.items[rel_start..][0..relocs.len]);
+    }
     const fdes_start = self.fdes.items.len;
     const cies_start = self.cies.items.len;
 
     var it = eh_frame.Iterator{ .data = raw };
     while (try it.next()) |rec| {
-        const rel_range = filterRelocs(relocs, rec.offset, rec.size + 4);
+        const rel_range = filterRelocs(self.relocs.items[rel_start..][0..relocs.len], rec.offset, rec.size + 4);
         switch (rec.tag) {
             .cie => try self.cies.append(allocator, .{
                 .offset = data_start + rec.offset,
@@ -449,8 +455,18 @@ fn parseEhFrame(self: *Object, allocator: Allocator, handle: std.fs.File, shndx:
     }
 }
 
+fn sortRelocs(relocs: []elf.Elf64_Rela) void {
+    const sortFn = struct {
+        fn lessThan(c: void, lhs: elf.Elf64_Rela, rhs: elf.Elf64_Rela) bool {
+            _ = c;
+            return lhs.r_offset < rhs.r_offset;
+        }
+    }.lessThan;
+    mem.sort(elf.Elf64_Rela, relocs, {}, sortFn);
+}
+
 fn filterRelocs(
-    relocs: []align(1) const elf.Elf64_Rela,
+    relocs: []const elf.Elf64_Rela,
     start: u64,
     len: u64,
 ) struct { start: u64, len: u64 } {