From b5669a952babf486f0f8beb1e0a52d9031b3ae84 Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Thu, 29 Sep 2016 16:57:30 +0200 Subject: x86-64: relocation addend is 64bit Some routines were using the wrong type (int) in passing addends, truncating it. This matters when bit 31 isn't set and the high 32 bits are set: the truncation would make it unsigned where in reality it's signed (happen e.g. on the x86-64 with it's load address at top-2GB). --- i386-gen.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'i386-gen.c') diff --git a/i386-gen.c b/i386-gen.c index ae40ca7..cd4cebd 100644 --- a/i386-gen.c +++ b/i386-gen.c @@ -165,14 +165,14 @@ ST_FUNC int oad(int c, int s) } /* output constant with relocation if 'r & VT_SYM' is true */ -ST_FUNC void gen_addr32(int r, Sym *sym, int c) +ST_FUNC void gen_addr32(int r, Sym *sym, long c) { if (r & VT_SYM) greloc(cur_text_section, sym, ind, R_386_32); gen_le32(c); } -ST_FUNC void gen_addrpc32(int r, Sym *sym, int c) +ST_FUNC void gen_addrpc32(int r, Sym *sym, long c) { if (r & VT_SYM) greloc(cur_text_section, sym, ind, R_386_PC32); -- cgit v1.3.1