public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Brian Gerst <brgerst@gmail.com>
To: linux-kernel@vger.kernel.org, x86@kernel.org
Cc: Ingo Molnar <mingo@kernel.org>, "H . Peter Anvin" <hpa@zytor.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Borislav Petkov <bp@alien8.de>, Ard Biesheuvel <ardb@kernel.org>,
	Uros Bizjak <ubizjak@gmail.com>, Brian Gerst <brgerst@gmail.com>
Subject: [PATCH v6 06/15] x86/module: Deal with GOT based stack cookie load on Clang < 17
Date: Thu, 23 Jan 2025 14:07:38 -0500	[thread overview]
Message-ID: <20250123190747.745588-7-brgerst@gmail.com> (raw)
In-Reply-To: <20250123190747.745588-1-brgerst@gmail.com>

From: Ard Biesheuvel <ardb@kernel.org>

Clang versions before 17 will not honour -fdirect-access-external-data
for the load of the stack cookie emitted into each function's prologue
and epilogue.

This is not an issue for the core kernel, as the linker will relax these
loads into LEA instructions that take the address of __stack_chk_guard
directly. For modules, however, we need to work around this, by dealing
with R_X86_64_REX_GOTPCRELX relocations that refer to __stack_chk_guard.

In this case, given that this is a GOT load, the reference should not
refer to __stack_chk_guard directly, but to a memory location that holds
its address. So take the address of __stack_chk_guard into a static
variable, and fix up the relocations to refer to that.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/elf.h |  3 ++-
 arch/x86/kernel/module.c   | 15 +++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h
index 1fb83d47711f..0d6ca771549d 100644
--- a/arch/x86/include/asm/elf.h
+++ b/arch/x86/include/asm/elf.h
@@ -55,7 +55,8 @@ typedef struct user_i387_struct elf_fpregset_t;
 #define R_X86_64_JUMP_SLOT	7	/* Create PLT entry */
 #define R_X86_64_RELATIVE	8	/* Adjust by program base */
 #define R_X86_64_GOTPCREL	9	/* 32 bit signed pc relative
-					   offset to GOT */
+#define R_X86_64_GOTPCRELX	41	   offset to GOT */
+#define R_X86_64_REX_GOTPCRELX	42
 #define R_X86_64_32		10	/* Direct 32 bit zero extended */
 #define R_X86_64_32S		11	/* Direct 32 bit sign extended */
 #define R_X86_64_16		12	/* Direct 16 bit zero extended */
diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c
index 8984abd91c00..a286f32c5503 100644
--- a/arch/x86/kernel/module.c
+++ b/arch/x86/kernel/module.c
@@ -19,6 +19,7 @@
 #include <linux/jump_label.h>
 #include <linux/random.h>
 #include <linux/memory.h>
+#include <linux/stackprotector.h>
 
 #include <asm/text-patching.h>
 #include <asm/page.h>
@@ -130,6 +131,20 @@ static int __write_relocate_add(Elf64_Shdr *sechdrs,
 				goto overflow;
 			size = 4;
 			break;
+#if defined(CONFIG_STACKPROTECTOR) && \
+    defined(CONFIG_CC_IS_CLANG) && CONFIG_CLANG_VERSION < 170000
+		case R_X86_64_REX_GOTPCRELX: {
+			static unsigned long __percpu *const addr = &__stack_chk_guard;
+
+			if (sym->st_value != (u64)addr) {
+				pr_err("%s: Unsupported GOTPCREL relocation\n", me->name);
+				return -ENOEXEC;
+			}
+
+			val = (u64)&addr + rel[i].r_addend;
+			fallthrough;
+		}
+#endif
 		case R_X86_64_PC32:
 		case R_X86_64_PLT32:
 			val -= (u64)loc;
-- 
2.47.1


  parent reply	other threads:[~2025-01-23 19:08 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-23 19:07 [PATCH v6 00/15] x86-64: Stack protector and percpu improvements Brian Gerst
2025-01-23 19:07 ` [PATCH v6 01/15] x86: Raise minimum GCC version to 8.1 Brian Gerst
2025-02-18 12:11   ` [tip: x86/asm] x86/build: Raise the " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 02/15] x86/stackprotector: Remove stack protector test scripts Brian Gerst
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 03/15] x86/boot: Disable stack protector for early boot code Brian Gerst
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 04/15] x86/pvh: Use fixed_percpu_data for early boot GSBASE Brian Gerst
2025-01-25 15:06   ` Borislav Petkov
2025-01-25 16:51     ` Brian Gerst
2025-01-26  3:57       ` Borislav Petkov
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-03-04 22:26   ` [PATCH v6 04/15] " Mateusz Guzik
2025-03-04 23:44     ` H. Peter Anvin
2025-03-04 23:49       ` Mateusz Guzik
2025-03-05  7:16         ` Uros Bizjak
2025-03-05 12:01           ` Mateusz Guzik
2025-01-23 19:07 ` [PATCH v6 05/15] x86/relocs: Handle R_X86_64_REX_GOTPCRELX relocations Brian Gerst
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` Brian Gerst [this message]
2025-02-18  9:07   ` [PATCH v6 06/15] x86/module: Deal with GOT based stack cookie load on Clang < 17 Ingo Molnar
2025-02-18 14:05     ` Brian Gerst
2025-02-18 21:52       ` H. Peter Anvin
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Ard Biesheuvel
2025-01-23 19:07 ` [PATCH v6 07/15] x86/stackprotector/64: Convert to normal percpu variable Brian Gerst
2025-02-18  9:14   ` Ingo Molnar
2025-02-18 12:11   ` [tip: x86/asm] x86/stackprotector/64: Convert to normal per-CPU variable tip-bot2 for Brian Gerst
2025-02-19 19:59   ` [PATCH v6 07/15] x86/stackprotector/64: Convert to normal percpu variable Nathan Chancellor
2025-02-20  9:23     ` Ard Biesheuvel
2025-03-12 11:59   ` [tip: x86/asm] x86/stackprotector/64: Only export __ref_stack_chk_guard on CONFIG_SMP tip-bot2 for Ingo Molnar
2025-03-19 11:03   ` [tip: x86/core] " tip-bot2 for Ingo Molnar
2025-01-23 19:07 ` [PATCH v6 08/15] x86/percpu/64: Use relative percpu offsets Brian Gerst
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 09/15] x86/percpu/64: Remove fixed_percpu_data Brian Gerst
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 10/15] x86/boot/64: Remove inverse relocations Brian Gerst
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 11/15] x86/percpu/64: Remove INIT_PER_CPU macros Brian Gerst
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 12/15] percpu: Remove PER_CPU_FIRST_SECTION Brian Gerst
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 13/15] percpu: Remove PERCPU_VADDR() Brian Gerst
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 14/15] percpu: Remove __per_cpu_load Brian Gerst
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-01-23 19:07 ` [PATCH v6 15/15] kallsyms: Remove KALLSYMS_ABSOLUTE_PERCPU Brian Gerst
2025-02-18 12:11   ` [tip: x86/asm] " tip-bot2 for Brian Gerst
2025-02-18  9:22 ` [PATCH v6 00/15] x86-64: Stack protector and percpu improvements Ingo Molnar
2025-02-18 17:46   ` Uros Bizjak
2025-02-19 11:47     ` Ingo Molnar
2025-02-19 13:18       ` Brian Gerst
2025-02-20  9:51         ` Uros Bizjak
2025-02-20 10:05           ` Ard Biesheuvel
2025-02-20 10:46             ` Uros Bizjak
2025-02-20 10:52               ` Ard Biesheuvel
2025-02-20 10:56                 ` Uros Bizjak
2025-02-20 17:24                 ` Brian Gerst
2025-02-20 17:35                   ` Ard Biesheuvel
2025-02-20 17:47                     ` Brian Gerst
2025-02-20 17:59                       ` Brian Gerst
2025-02-20 20:09                         ` Uros Bizjak
2025-02-20 13:26         ` Ingo Molnar
2025-02-20 17:05           ` Brian Gerst
2025-02-22 12:25             ` Ingo Molnar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250123190747.745588-7-brgerst@gmail.com \
    --to=brgerst@gmail.com \
    --cc=ardb@kernel.org \
    --cc=bp@alien8.de \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=ubizjak@gmail.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox