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