Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit 8c5a19c

Browse files
ardbiesheuvelwilldeacon
authored andcommitted
arm64: scs: Work around full LTO issue with dynamic SCS
Full LTO takes the '-mbranch-protection=none' passed to the compiler when generating the dynamic shadow call stack patching code as a hint to stop emitting PAC instructions altogether. (Thin LTO appears unaffected by this) Work around this by stripping unwind tables from the object in question, which should be sufficient to prevent the patching code from attempting to patch itself. Fixes: 3b619e2 ("arm64: implement dynamic shadow call stack for Clang") Signed-off-by: Ard Biesheuvel <[email protected]> Reviewed-by: Sami Tolvanen <[email protected]> Reviewed-by: Kees Cook <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Will Deacon <[email protected]>
1 parent b95df3b commit 8c5a19c

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

arch/arm64/kernel/Makefile

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,13 @@ obj-$(CONFIG_ARM64_MTE) += mte.o
7373
obj-y += vdso-wrap.o
7474
obj-$(CONFIG_COMPAT_VDSO) += vdso32-wrap.o
7575
obj-$(CONFIG_UNWIND_PATCH_PAC_INTO_SCS) += patch-scs.o
76-
CFLAGS_patch-scs.o += -mbranch-protection=none
76+
77+
# We need to prevent the SCS patching code from patching itself. Using
78+
# -mbranch-protection=none here to avoid the patchable PAC opcodes from being
79+
# generated triggers an issue with full LTO on Clang, which stops emitting PAC
80+
# instructions altogether. So instead, omit the unwind tables used by the
81+
# patching code, so it will not be able to locate its own PAC instructions.
82+
CFLAGS_patch-scs.o += -fno-asynchronous-unwind-tables -fno-unwind-tables
7783

7884
# Force dependency (vdso*-wrap.S includes vdso.so through incbin)
7985
$(obj)/vdso-wrap.o: $(obj)/vdso/vdso.so

0 commit comments

Comments
 (0)