]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
x86: Add support for 64-bit place relative relocations
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Wed, 19 Sep 2018 06:51:39 +0000 (23:51 -0700)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 27 Sep 2018 15:56:47 +0000 (17:56 +0200)
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
arch/x86/include/asm/elf.h
arch/x86/kernel/module.c
arch/x86/tools/relocs.c
arch/x86/um/asm/elf.h

index 0d157d2a1e2aef98b1e69c452f27d330a5fd7179..a357031d85b59e778b21f1431b0fc1a327443841 100644 (file)
@@ -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.
index f58336af095c9d3050e85c5dea79a164b275e420..b052e883dd8cc35df741a4e18c5236e38a234936 100644 (file)
@@ -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));
index 3a6c8ebc8032eb5c95e70af2e5e4f44000e29350..0b08067c45f3daa6a62b71c1cc9b4663f2c003a1 100644 (file)
@@ -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:
index 548197212a45d622b7efa92be80d357445d8ba69..413f3519d9a12ea4f66c14720c92e918c306c345 100644 (file)
@@ -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.