diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2020-10-12 13:39:19 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2020-10-12 13:39:19 -0700 |
commit | 34eb62d868d729e9a252aa497277081fb652eeed (patch) | |
tree | dc21a8dc5607e213abff5922cbbfd571b199faa2 /arch/arm/kernel | |
parent | e6412f9833db23740ee848ab3d6e7af18dff82a6 (diff) | |
parent | 6e0bf0e0e55000742a53c5f3b58f8669e0091a11 (diff) |
Merge tag 'core-build-2020-10-12' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull orphan section checking from Ingo Molnar:
"Orphan link sections were a long-standing source of obscure bugs,
because the heuristics that various linkers & compilers use to handle
them (include these bits into the output image vs discarding them
silently) are both highly idiosyncratic and also version dependent.
Instead of this historically problematic mess, this tree by Kees Cook
(et al) adds build time asserts and build time warnings if there's any
orphan section in the kernel or if a section is not sized as expected.
And because we relied on so many silent assumptions in this area, fix
a metric ton of dependencies and some outright bugs related to this,
before we can finally enable the checks on the x86, ARM and ARM64
platforms"
* tag 'core-build-2020-10-12' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (36 commits)
x86/boot/compressed: Warn on orphan section placement
x86/build: Warn on orphan section placement
arm/boot: Warn on orphan section placement
arm/build: Warn on orphan section placement
arm64/build: Warn on orphan section placement
x86/boot/compressed: Add missing debugging sections to output
x86/boot/compressed: Remove, discard, or assert for unwanted sections
x86/boot/compressed: Reorganize zero-size section asserts
x86/build: Add asserts for unwanted sections
x86/build: Enforce an empty .got.plt section
x86/asm: Avoid generating unused kprobe sections
arm/boot: Handle all sections explicitly
arm/build: Assert for unwanted sections
arm/build: Add missing sections
arm/build: Explicitly keep .ARM.attributes sections
arm/build: Refactor linker script headers
arm64/build: Assert for unwanted sections
arm64/build: Add missing DWARF sections
arm64/build: Use common DISCARDS in linker script
arm64/build: Remove .eh_frame* sections due to unwind tables
...
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r-- | arch/arm/kernel/vmlinux-xip.lds.S | 8 | ||||
-rw-r--r-- | arch/arm/kernel/vmlinux.lds.S | 8 | ||||
-rw-r--r-- | arch/arm/kernel/vmlinux.lds.h | 127 |
3 files changed, 10 insertions, 133 deletions
diff --git a/arch/arm/kernel/vmlinux-xip.lds.S b/arch/arm/kernel/vmlinux-xip.lds.S index 6d2be994ae58..50136828f5b5 100644 --- a/arch/arm/kernel/vmlinux-xip.lds.S +++ b/arch/arm/kernel/vmlinux-xip.lds.S @@ -9,15 +9,13 @@ #include <linux/sizes.h> -#include <asm-generic/vmlinux.lds.h> +#include <asm/vmlinux.lds.h> #include <asm/cache.h> #include <asm/thread_info.h> #include <asm/memory.h> #include <asm/mpu.h> #include <asm/page.h> -#include "vmlinux.lds.h" - OUTPUT_ARCH(arm) ENTRY(stext) @@ -152,6 +150,10 @@ SECTIONS _end = .; STABS_DEBUG + DWARF_DEBUG + ARM_DETAILS + + ARM_ASSERTS } /* diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 7f24bc08403e..5f4922e858d0 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S @@ -9,15 +9,13 @@ #else #include <linux/pgtable.h> -#include <asm-generic/vmlinux.lds.h> +#include <asm/vmlinux.lds.h> #include <asm/cache.h> #include <asm/thread_info.h> #include <asm/memory.h> #include <asm/mpu.h> #include <asm/page.h> -#include "vmlinux.lds.h" - OUTPUT_ARCH(arm) ENTRY(stext) @@ -151,6 +149,10 @@ SECTIONS _end = .; STABS_DEBUG + DWARF_DEBUG + ARM_DETAILS + + ARM_ASSERTS } #ifdef CONFIG_STRICT_KERNEL_RWX diff --git a/arch/arm/kernel/vmlinux.lds.h b/arch/arm/kernel/vmlinux.lds.h deleted file mode 100644 index 381a8e105fa5..000000000000 --- a/arch/arm/kernel/vmlinux.lds.h +++ /dev/null @@ -1,127 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ - -#ifdef CONFIG_HOTPLUG_CPU -#define ARM_CPU_DISCARD(x) -#define ARM_CPU_KEEP(x) x -#else -#define ARM_CPU_DISCARD(x) x -#define ARM_CPU_KEEP(x) -#endif - -#if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \ - defined(CONFIG_GENERIC_BUG) || defined(CONFIG_JUMP_LABEL) -#define ARM_EXIT_KEEP(x) x -#define ARM_EXIT_DISCARD(x) -#else -#define ARM_EXIT_KEEP(x) -#define ARM_EXIT_DISCARD(x) x -#endif - -#ifdef CONFIG_MMU -#define ARM_MMU_KEEP(x) x -#define ARM_MMU_DISCARD(x) -#else -#define ARM_MMU_KEEP(x) -#define ARM_MMU_DISCARD(x) x -#endif - -#define PROC_INFO \ - . = ALIGN(4); \ - __proc_info_begin = .; \ - *(.proc.info.init) \ - __proc_info_end = .; - -#define IDMAP_TEXT \ - ALIGN_FUNCTION(); \ - __idmap_text_start = .; \ - *(.idmap.text) \ - __idmap_text_end = .; \ - -#define ARM_DISCARD \ - *(.ARM.exidx.exit.text) \ - *(.ARM.extab.exit.text) \ - *(.ARM.exidx.text.exit) \ - *(.ARM.extab.text.exit) \ - ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text)) \ - ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text)) \ - ARM_EXIT_DISCARD(EXIT_TEXT) \ - ARM_EXIT_DISCARD(EXIT_DATA) \ - EXIT_CALL \ - ARM_MMU_DISCARD(*(.text.fixup)) \ - ARM_MMU_DISCARD(*(__ex_table)) \ - *(.discard) \ - *(.discard.*) - -#define ARM_TEXT \ - IDMAP_TEXT \ - __entry_text_start = .; \ - *(.entry.text) \ - __entry_text_end = .; \ - IRQENTRY_TEXT \ - SOFTIRQENTRY_TEXT \ - TEXT_TEXT \ - SCHED_TEXT \ - CPUIDLE_TEXT \ - LOCK_TEXT \ - KPROBES_TEXT \ - *(.gnu.warning) \ - *(.glue_7) \ - *(.glue_7t) \ - . = ALIGN(4); \ - *(.got) /* Global offset table */ \ - ARM_CPU_KEEP(PROC_INFO) - -/* Stack unwinding tables */ -#define ARM_UNWIND_SECTIONS \ - . = ALIGN(8); \ - .ARM.unwind_idx : { \ - __start_unwind_idx = .; \ - *(.ARM.exidx*) \ - __stop_unwind_idx = .; \ - } \ - .ARM.unwind_tab : { \ - __start_unwind_tab = .; \ - *(.ARM.extab*) \ - __stop_unwind_tab = .; \ - } - -/* - * The vectors and stubs are relocatable code, and the - * only thing that matters is their relative offsets - */ -#define ARM_VECTORS \ - __vectors_start = .; \ - .vectors 0xffff0000 : AT(__vectors_start) { \ - *(.vectors) \ - } \ - . = __vectors_start + SIZEOF(.vectors); \ - __vectors_end = .; \ - \ - __stubs_start = .; \ - .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) { \ - *(.stubs) \ - } \ - . = __stubs_start + SIZEOF(.stubs); \ - __stubs_end = .; \ - \ - PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors)); - -#define ARM_TCM \ - __itcm_start = ALIGN(4); \ - .text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) { \ - __sitcm_text = .; \ - *(.tcm.text) \ - *(.tcm.rodata) \ - . = ALIGN(4); \ - __eitcm_text = .; \ - } \ - . = __itcm_start + SIZEOF(.text_itcm); \ - \ - __dtcm_start = .; \ - .data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) { \ - __sdtcm_data = .; \ - *(.tcm.data) \ - . = ALIGN(4); \ - __edtcm_data = .; \ - } \ - . = __dtcm_start + SIZEOF(.data_dtcm); |