From 0d81b359a79e5cea16be4e207179c6b93825bee9 Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Tue, 31 Mar 2020 14:32:27 -0700 Subject: [PATCH] ANDROID: kbuild: ensure __cfi_check is correctly aligned On modules with no executable code, LLVM generates a __cfi_check stub, but won't align it to page size as expected. This change ensures the function is at the beginning of the .text section and correctly aligned for the CFI shadow. Bug: 148458318 Change-Id: I85ea31fa851bc23988f649b021b3ac7e9d9dcb38 Signed-off-by: Sami Tolvanen --- Makefile | 2 +- scripts/Makefile | 2 ++ scripts/{module-lto.lds => module-lto.lds.S} | 13 ++++++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) rename scripts/{module-lto.lds => module-lto.lds.S} (68%) diff --git a/Makefile b/Makefile index 9b20bccb9af5..f90d3c384592 100644 --- a/Makefile +++ b/Makefile @@ -782,7 +782,7 @@ LD_FLAGS_LTO_CLANG := -mllvm -import-instr-limit=5 KBUILD_LDFLAGS += $(LD_FLAGS_LTO_CLANG) KBUILD_LDFLAGS_MODULE += $(LD_FLAGS_LTO_CLANG) -KBUILD_LDFLAGS_MODULE += -T $(srctree)/scripts/module-lto.lds +KBUILD_LDFLAGS_MODULE += -T scripts/module-lto.lds # allow disabling only clang LTO where needed DISABLE_LTO_CLANG := -fno-lto diff --git a/scripts/Makefile b/scripts/Makefile index 01d64c9a9e7f..2fc930d82620 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -31,6 +31,8 @@ always := $(hostprogs-y) $(hostprogs-m) # The following hostprogs-y programs are only build on demand hostprogs-y += unifdef docproc check-lc_ctype +extra-$(CONFIG_LTO_CLANG) += module-lto.lds + # These targets are used internally to avoid "is up to date" messages PHONY += build_unifdef build_docproc build_check-lc_ctype build_unifdef: $(obj)/unifdef diff --git a/scripts/module-lto.lds b/scripts/module-lto.lds.S similarity index 68% rename from scripts/module-lto.lds rename to scripts/module-lto.lds.S index f5ee544a877d..70ffb3d59ac3 100644 --- a/scripts/module-lto.lds +++ b/scripts/module-lto.lds.S @@ -1,3 +1,6 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#include + /* * With CONFIG_LTO_CLANG, LLD always enables -fdata-sections and * -ffunction-sections, which increases the size of the final module. @@ -18,5 +21,13 @@ SECTIONS { .rela.rodata : { *(.rela.rodata .rela.rodata[.0-9a-zA-Z_]*) } .rela.text : { *(.rela.text .rela.text[.0-9a-zA-Z_]*) } .rodata : { *(.rodata .rodata[.0-9a-zA-Z_]*) } - .text : { *(.text .text[.0-9a-zA-Z_]*) } + + /* + * With CFI_CLANG, ensure __cfi_check is at the beginning of the + * .text section, and that the section is aligned to page size. + */ + .text : ALIGN(PAGE_SIZE) { + *(.text.__cfi_check) + *(.text .text[.0-9a-zA-Z_]* .text..L.cfi*) + } }