mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-07 06:14:33 +00:00
elf: correctly handle overflows on non-64bit hosts
This commit is contained in:
parent
d4c1e85a13
commit
fc86b80b3b
2 changed files with 8 additions and 6 deletions
|
|
@ -19,6 +19,7 @@ pub const Error = error{
|
||||||
EndOfStream,
|
EndOfStream,
|
||||||
LegacyPrefixAfterRex,
|
LegacyPrefixAfterRex,
|
||||||
UnknownOpcode,
|
UnknownOpcode,
|
||||||
|
Overflow,
|
||||||
Todo,
|
Todo,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -368,7 +369,7 @@ fn parseImm(dis: *Disassembler, kind: Encoding.Op) !Immediate {
|
||||||
.imm64 => Immediate.u(try reader.readInt(u64, .Little)),
|
.imm64 => Immediate.u(try reader.readInt(u64, .Little)),
|
||||||
else => unreachable,
|
else => unreachable,
|
||||||
};
|
};
|
||||||
dis.pos += creader.bytes_read;
|
dis.pos += std.math.cast(usize, creader.bytes_read) orelse return error.Overflow;
|
||||||
return imm;
|
return imm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -469,6 +470,6 @@ fn parseDisplacement(dis: *Disassembler, modrm: ModRm, sib: ?Sib) !i32 {
|
||||||
0b11 => unreachable,
|
0b11 => unreachable,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
dis.pos += creader.bytes_read;
|
dis.pos += std.math.cast(usize, creader.bytes_read) orelse return error.Overflow;
|
||||||
return disp;
|
return disp;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -425,6 +425,7 @@ pub fn resolveRelocs(self: Atom, elf_file: *Elf, code: []u8) !void {
|
||||||
.object => |x| elf_file.symbol(x.symbols.items[rel.r_sym()]),
|
.object => |x| elf_file.symbol(x.symbols.items[rel.r_sym()]),
|
||||||
else => unreachable,
|
else => unreachable,
|
||||||
};
|
};
|
||||||
|
const r_offset = std.math.cast(usize, rel.r_offset) orelse return error.Overflow;
|
||||||
|
|
||||||
// We will use equation format to resolve relocations:
|
// We will use equation format to resolve relocations:
|
||||||
// https://intezer.com/blog/malware-analysis/executable-and-linkable-format-101-part-3-relocations/
|
// https://intezer.com/blog/malware-analysis/executable-and-linkable-format-101-part-3-relocations/
|
||||||
|
|
@ -454,14 +455,14 @@ pub fn resolveRelocs(self: Atom, elf_file: *Elf, code: []u8) !void {
|
||||||
|
|
||||||
relocs_log.debug(" {s}: {x}: [{x} => {x}] G({x}) ({s})", .{
|
relocs_log.debug(" {s}: {x}: [{x} => {x}] G({x}) ({s})", .{
|
||||||
fmtRelocType(r_type),
|
fmtRelocType(r_type),
|
||||||
rel.r_offset,
|
r_offset,
|
||||||
P,
|
P,
|
||||||
S + A,
|
S + A,
|
||||||
G + GOT + A,
|
G + GOT + A,
|
||||||
target.name(elf_file),
|
target.name(elf_file),
|
||||||
});
|
});
|
||||||
|
|
||||||
try stream.seekTo(rel.r_offset);
|
try stream.seekTo(r_offset);
|
||||||
|
|
||||||
switch (rel.r_type()) {
|
switch (rel.r_type()) {
|
||||||
elf.R_X86_64_NONE => unreachable,
|
elf.R_X86_64_NONE => unreachable,
|
||||||
|
|
@ -481,7 +482,7 @@ pub fn resolveRelocs(self: Atom, elf_file: *Elf, code: []u8) !void {
|
||||||
|
|
||||||
elf.R_X86_64_GOTPCRELX => {
|
elf.R_X86_64_GOTPCRELX => {
|
||||||
if (!target.flags.import and !target.isIFunc(elf_file) and !target.isAbs(elf_file)) blk: {
|
if (!target.flags.import and !target.isIFunc(elf_file) and !target.isAbs(elf_file)) blk: {
|
||||||
x86_64.relaxGotpcrelx(code[rel.r_offset - 2 ..]) catch break :blk;
|
x86_64.relaxGotpcrelx(code[r_offset - 2 ..]) catch break :blk;
|
||||||
try cwriter.writeIntLittle(i32, @as(i32, @intCast(S + A - P)));
|
try cwriter.writeIntLittle(i32, @as(i32, @intCast(S + A - P)));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -490,7 +491,7 @@ pub fn resolveRelocs(self: Atom, elf_file: *Elf, code: []u8) !void {
|
||||||
|
|
||||||
elf.R_X86_64_REX_GOTPCRELX => {
|
elf.R_X86_64_REX_GOTPCRELX => {
|
||||||
if (!target.flags.import and !target.isIFunc(elf_file) and !target.isAbs(elf_file)) blk: {
|
if (!target.flags.import and !target.isIFunc(elf_file) and !target.isAbs(elf_file)) blk: {
|
||||||
x86_64.relaxRexGotpcrelx(code[rel.r_offset - 3 ..]) catch break :blk;
|
x86_64.relaxRexGotpcrelx(code[r_offset - 3 ..]) catch break :blk;
|
||||||
try cwriter.writeIntLittle(i32, @as(i32, @intCast(S + A - P)));
|
try cwriter.writeIntLittle(i32, @as(i32, @intCast(S + A - P)));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue