Messages in this thread Patch in this message | | | From | WANG Xuerui <> | Subject | [PATCH v2] LoongArch: Replace -ffreestanding with finer-grained -fno-builtin's | Date | Sun, 6 Aug 2023 16:30:21 +0800 |
| |
From: WANG Xuerui <git@xen0n.name>
As explained by Nick in the original issue: the kernel usually does a good job of providing library helpers that have similar semantics as their ordinary userspace libc equivalents, but -ffreestanding disables such libcall optimization and other related features in the compiler, which can lead to unexpected things such as CONFIG_FORTIFY_SOURCE not working (!).
As it turns out to be the case, only the memory operations really need to be prevented from expansion by the compiler, and this is doable with finer-grained -fno-builtin-* toggles. So only disable memcpy, memmove and memset, while leaving other builtins enabled, to fix source fortification among others.
Closes: https://github.com/ClangBuiltLinux/linux/issues/1897 Reported-by: Nathan Chancellor <nathan@kernel.org> Suggested-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: WANG Xuerui <git@xen0n.name> ---
Changes in v2:
- Keep the memory operation builtins disabled, add comments, and tweak the commit message along the way.
arch/loongarch/Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile index b1e5db51b61c..34fc48df87f2 100644 --- a/arch/loongarch/Makefile +++ b/arch/loongarch/Makefile @@ -83,7 +83,14 @@ KBUILD_CFLAGS_KERNEL += -fPIE LDFLAGS_vmlinux += -static -pie --no-dynamic-linker -z notext endif -cflags-y += -ffreestanding +# Make sure the memory libcalls are not expanded by the compiler, for better +# control over unaligned accesses with respect to CONFIG_ARCH_STRICT_ALIGN, +# and also for avoiding https://gcc.gnu.org/PR109465. +# +# The overly broad -ffreestanding is undesirable as it disables *all* libcall +# handling, that unfortunately includes proper FORTIFY_SOURCE instrumentation. +cflags-y += -fno-builtin-memcpy -fno-builtin-memmove -fno-builtin-memset + cflags-y += $(call cc-option, -mno-check-zero-division) load-y = 0x9000000000200000 -- 2.40.0
| |