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 <samitolvanen@google.com>
This commit is contained in:
Sami Tolvanen
2020-03-31 14:32:27 -07:00
parent 4e8ed5ad98
commit 325c844151
3 changed files with 16 additions and 2 deletions

View File

@@ -886,7 +886,7 @@ LD_FLAGS_LTO_CLANG := -mllvm -import-instr-limit=5
KBUILD_LDFLAGS += $(LD_FLAGS_LTO_CLANG)
KBUILD_LDFLAGS_MODULE += $(LD_FLAGS_LTO_CLANG)
KBUILD_LDS_MODULE += $(srctree)/scripts/module-lto.lds
KBUILD_LDS_MODULE += scripts/module-lto.lds
endif
ifdef CONFIG_LTO

View File

@@ -35,6 +35,8 @@ hostprogs := $(always-y) $(always-m)
# The following programs are only built on demand
hostprogs += unifdef
extra-$(CONFIG_LTO_CLANG) += module-lto.lds
subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
subdir-$(CONFIG_MODVERSIONS) += genksyms
subdir-$(CONFIG_SECURITY_SELINUX) += selinux

View File

@@ -1,3 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0 */
#include <asm/page.h>
/*
* With CONFIG_LTO_CLANG, LLD always enables -fdata-sections and
* -ffunction-sections, which increases the size of the final module.
@@ -18,5 +21,14 @@ 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*)
}
}