mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 21:51:40 +00:00
x86: Add support for 64-bit place relative relocations
Add support for R_X86_64_PC64 relocations, which operate on 64-bit quantities holding a relative symbol reference. Also remove the definition of R_X86_64_NUM: given that it is currently unused, it is unclear what the new value should be. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: linux-arm-kernel@lists.infradead.org Cc: linux-s390@vger.kernel.org Cc: Arnd Bergmann <arnd@arndb.de> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Kees Cook <keescook@chromium.org> Cc: Will Deacon <will.deacon@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Jessica Yu <jeyu@kernel.org> Link: https://lkml.kernel.org/r/20180919065144.25010-5-ard.biesheuvel@linaro.org
This commit is contained in:
parent
c296146c05
commit
b40a142b12
@ -62,8 +62,7 @@ typedef struct user_fxsr_struct elf_fpxregset_t;
|
||||
#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */
|
||||
#define R_X86_64_8 14 /* Direct 8 bit sign extended */
|
||||
#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */
|
||||
|
||||
#define R_X86_64_NUM 16
|
||||
#define R_X86_64_PC64 24 /* Place relative 64-bit signed */
|
||||
|
||||
/*
|
||||
* These are used to set parameters in the core dumps.
|
||||
|
@ -201,6 +201,12 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
|
||||
goto overflow;
|
||||
#endif
|
||||
break;
|
||||
case R_X86_64_PC64:
|
||||
if (*(u64 *)loc != 0)
|
||||
goto invalid_relocation;
|
||||
val -= (u64)loc;
|
||||
*(u64 *)loc = val;
|
||||
break;
|
||||
default:
|
||||
pr_err("%s: Unknown rela relocation: %llu\n",
|
||||
me->name, ELF64_R_TYPE(rel[i].r_info));
|
||||
|
@ -196,6 +196,7 @@ static const char *rel_type(unsigned type)
|
||||
#if ELF_BITS == 64
|
||||
REL_TYPE(R_X86_64_NONE),
|
||||
REL_TYPE(R_X86_64_64),
|
||||
REL_TYPE(R_X86_64_PC64),
|
||||
REL_TYPE(R_X86_64_PC32),
|
||||
REL_TYPE(R_X86_64_GOT32),
|
||||
REL_TYPE(R_X86_64_PLT32),
|
||||
@ -782,6 +783,15 @@ static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
|
||||
add_reloc(&relocs32neg, offset);
|
||||
break;
|
||||
|
||||
case R_X86_64_PC64:
|
||||
/*
|
||||
* Only used by jump labels
|
||||
*/
|
||||
if (is_percpu_sym(sym, symname))
|
||||
die("Invalid R_X86_64_PC64 relocation against per-CPU symbol %s\n",
|
||||
symname);
|
||||
break;
|
||||
|
||||
case R_X86_64_32:
|
||||
case R_X86_64_32S:
|
||||
case R_X86_64_64:
|
||||
|
@ -116,8 +116,7 @@ do { \
|
||||
#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */
|
||||
#define R_X86_64_8 14 /* Direct 8 bit sign extended */
|
||||
#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */
|
||||
|
||||
#define R_X86_64_NUM 16
|
||||
#define R_X86_64_PC64 24 /* Place relative 64-bit signed */
|
||||
|
||||
/*
|
||||
* This is used to ensure we don't load something for the wrong architecture.
|
||||
|
Loading…
Reference in New Issue
Block a user