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

Commit d104a6f

Browse files
ardbiesheuvelwilldeacon
authored andcommitted
arm64: scs: Disable LTO for SCS patching code
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 disabling LTO for the compilation unit, which appears to convince the linker that it should still use PAC in the rest of the kernel.. Fixes: 3b619e2 ("arm64: implement dynamic shadow call stack for Clang") Signed-off-by: Ard Biesheuvel <[email protected]> Reviewed-by: Kees Cook <[email protected]> Reviewed-by: Sami Tolvanen <[email protected]> Tested-by: Sami Tolvanen <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Will Deacon <[email protected]>
1 parent 2fa28ab commit d104a6f

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

arch/arm64/kernel/Makefile

Lines changed: 6 additions & 0 deletions
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+
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 disable LTO as well for the compilation unit.
7681
CFLAGS_patch-scs.o += -mbranch-protection=none
82+
CFLAGS_REMOVE_patch-scs.o += $(CC_FLAGS_LTO)
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)