| ... | @@ -245,6 +245,9 @@ fn initAtoms(self: *Object, allocator: Allocator, handle: std.fs.File, elf_file: | ... | @@ -245,6 +245,9 @@ fn initAtoms(self: *Object, allocator: Allocator, handle: std.fs.File, elf_file: |
| 245 | atom.rel_index = @intCast(self.relocs.items.len); | 245 | atom.rel_index = @intCast(self.relocs.items.len); |
| 246 | atom.rel_num = @intCast(relocs.len); | 246 | atom.rel_num = @intCast(relocs.len); |
| 247 | try self.relocs.appendUnalignedSlice(allocator, relocs); | 247 | 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 | } |
| 248 | } | 251 | } |
| 249 | }, | 252 | }, |
| 250 | else => {}, | 253 | else => {}, |
| ... | @@ -381,12 +384,15 @@ fn parseEhFrame(self: *Object, allocator: Allocator, handle: std.fs.File, shndx: | ... | @@ -381,12 +384,15 @@ fn parseEhFrame(self: *Object, allocator: Allocator, handle: std.fs.File, shndx: |
| 381 | defer allocator.free(relocs); | 384 | defer allocator.free(relocs); |
| 382 | const rel_start = @as(u32, @intCast(self.relocs.items.len)); | 385 | const rel_start = @as(u32, @intCast(self.relocs.items.len)); |
| 383 | try self.relocs.appendUnalignedSlice(allocator, relocs); | 386 | 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 | } |
| 384 | const fdes_start = self.fdes.items.len; | 390 | const fdes_start = self.fdes.items.len; |
| 385 | const cies_start = self.cies.items.len; | 391 | const cies_start = self.cies.items.len; |
| 386 | | 392 | |
| 387 | var it = eh_frame.Iterator{ .data = raw }; | 393 | var it = eh_frame.Iterator{ .data = raw }; |
| 388 | while (try it.next()) |rec| { | 394 | 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); |
| 390 | switch (rec.tag) { | 396 | switch (rec.tag) { |
| 391 | .cie => try self.cies.append(allocator, .{ | 397 | .cie => try self.cies.append(allocator, .{ |
| 392 | .offset = data_start + rec.offset, | 398 | .offset = data_start + rec.offset, |
| ... | @@ -449,8 +455,18 @@ fn parseEhFrame(self: *Object, allocator: Allocator, handle: std.fs.File, shndx: | ... | @@ -449,8 +455,18 @@ fn parseEhFrame(self: *Object, allocator: Allocator, handle: std.fs.File, shndx: |
| 449 | } | 455 | } |
| 450 | } | 456 | } |
| 451 | | 457 | |
| | 458 | fn 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 | |
| 452 | fn filterRelocs( | 468 | fn filterRelocs( |
| 453 | relocs: []align(1) const elf.Elf64_Rela, | 469 | relocs: []const elf.Elf64_Rela, |
| 454 | start: u64, | 470 | start: u64, |
| 455 | len: u64, | 471 | len: u64, |
| 456 | ) struct { start: u64, len: u64 } { | 472 | ) struct { start: u64, len: u64 } { |