x86/relocs: Handle R_X86_64_REX_GOTPCRELX relocations
authorBrian Gerst <brgerst@gmail.com>
Thu, 23 Jan 2025 19:07:37 +0000 (14:07 -0500)
committerIngo Molnar <mingo@kernel.org>
Tue, 18 Feb 2025 09:15:02 +0000 (10:15 +0100)
Clang may produce R_X86_64_REX_GOTPCRELX relocations when redefining the
stack protector location.  Treat them as another type of PC-relative
relocation.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: https://lore.kernel.org/r/20250123190747.745588-6-brgerst@gmail.com
arch/x86/tools/relocs.c

index e937be979ec86dbed2db19512c3b8287c10959ce..92a1e503305ef5871807709ce60cd8694c77149c 100644 (file)
@@ -32,6 +32,11 @@ static struct relocs         relocs32;
 static struct relocs           relocs32neg;
 static struct relocs           relocs64;
 # define FMT PRIu64
+
+#ifndef R_X86_64_REX_GOTPCRELX
+# define R_X86_64_REX_GOTPCRELX 42
+#endif
+
 #else
 # define FMT PRIu32
 #endif
@@ -227,6 +232,7 @@ static const char *rel_type(unsigned type)
                REL_TYPE(R_X86_64_PC16),
                REL_TYPE(R_X86_64_8),
                REL_TYPE(R_X86_64_PC8),
+               REL_TYPE(R_X86_64_REX_GOTPCRELX),
 #else
                REL_TYPE(R_386_NONE),
                REL_TYPE(R_386_32),
@@ -861,6 +867,7 @@ static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
 
        case R_X86_64_PC32:
        case R_X86_64_PLT32:
+       case R_X86_64_REX_GOTPCRELX:
                /*
                 * PC relative relocations don't need to be adjusted unless
                 * referencing a percpu symbol.