mirror of
https://github.com/frida/tinycc
synced 2024-11-24 00:29:38 +03:00
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).
This commit is contained in:
parent
975c74c1f5
commit
b5669a952b
@ -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);
|
||||
|
4
tcc.h
4
tcc.h
@ -1478,8 +1478,8 @@ ST_FUNC void g(int c);
|
||||
ST_FUNC int oad(int c, int s);
|
||||
ST_FUNC void gen_le16(int c);
|
||||
ST_FUNC void gen_le32(int c);
|
||||
ST_FUNC void gen_addr32(int r, Sym *sym, int c);
|
||||
ST_FUNC void gen_addrpc32(int r, Sym *sym, int c);
|
||||
ST_FUNC void gen_addr32(int r, Sym *sym, long c);
|
||||
ST_FUNC void gen_addrpc32(int r, Sym *sym, long c);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TCC_BCHECK
|
||||
|
@ -239,7 +239,7 @@ ST_FUNC int oad(int c, int s)
|
||||
return s;
|
||||
}
|
||||
|
||||
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)
|
||||
greloca(cur_text_section, sym, ind, R_X86_64_32S, c), c=0;
|
||||
@ -255,7 +255,7 @@ ST_FUNC void gen_addr64(int r, Sym *sym, int64_t c)
|
||||
}
|
||||
|
||||
/* output constant with relocation if 'r & VT_SYM' is true */
|
||||
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)
|
||||
greloca(cur_text_section, sym, ind, R_X86_64_PC32, c-4), c=4;
|
||||
|
Loading…
Reference in New Issue
Block a user