From 870271ea071971002fa556e09e1873db316fa1a9 Mon Sep 17 00:00:00 2001 From: Zdenek Pavlas Date: Mon, 11 Sep 2017 05:56:47 -0700 Subject: [PATCH] gen_addrpc32: absolute ptr needs *ABS* relocation Dereferencing of absolute pointers is broken on x86_64, eg: *(int*)NULL does not segfault but returns -4 instead *(char*)(-10L << 20) does not return 0x55 (vsyscall page, push rbp) --- x86_64-gen.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x86_64-gen.c b/x86_64-gen.c index a71e209..72842d6 100644 --- a/x86_64-gen.c +++ b/x86_64-gen.c @@ -257,8 +257,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) { - if (r & VT_SYM) - greloca(cur_text_section, sym, ind, R_X86_64_PC32, c-4), c=4; + greloca(cur_text_section, sym, ind, R_X86_64_PC32, 0); gen_le32(c-4); }