elf: sort input relocs if targeting riscv64
This commit is contained in:
@@ -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 } {
|
||||
|
||||
Reference in New Issue
Block a user