| From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001 |
| From: Felix Fietkau <nbd@nbd.name> |
| Date: Sat, 15 Jul 2017 23:42:36 +0200 |
| Subject: use -ffunction-sections, -fdata-sections and --gc-sections |
| |
| In combination with kernel symbol export stripping this significantly reduces |
| the kernel image size. Used on both ARM and MIPS architectures. |
| |
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |
| Signed-off-by: Jonas Gorski <jogo@openwrt.org> |
| Signed-off-by: Gabor Juhos <juhosg@openwrt.org> |
| --- |
| Makefile | 10 +++---- |
| arch/arm/Kconfig | 1 + |
| arch/arm/boot/compressed/Makefile | 1 + |
| arch/arm/kernel/vmlinux.lds.S | 26 ++++++++-------- |
| arch/mips/Kconfig | 1 + |
| arch/mips/kernel/vmlinux.lds.S | 4 +-- |
| include/asm-generic/vmlinux.lds.h | 63 ++++++++++++++++++++------------------- |
| 7 files changed, 55 insertions(+), 51 deletions(-) |
| |
| --- a/arch/arm/Kconfig |
| +++ b/arch/arm/Kconfig |
| @@ -112,6 +112,7 @@ config ARM |
| select HAVE_UID16 |
| select HAVE_VIRT_CPU_ACCOUNTING_GEN |
| select IRQ_FORCED_THREADING |
| + select HAVE_LD_DEAD_CODE_DATA_ELIMINATION |
| select MODULES_USE_ELF_REL |
| select NEED_DMA_MAP_STATE |
| select OF_EARLY_FLATTREE if OF |
| --- a/arch/arm/boot/compressed/Makefile |
| +++ b/arch/arm/boot/compressed/Makefile |
| @@ -108,6 +108,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y) |
| ORIG_CFLAGS := $(KBUILD_CFLAGS) |
| KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS)) |
| endif |
| +KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL)) |
| |
| # -fstack-protector-strong triggers protection checks in this code, |
| # but it is being used too early to link to meaningful stack_chk logic. |
| --- a/arch/arm/kernel/vmlinux.lds.S |
| +++ b/arch/arm/kernel/vmlinux.lds.S |
| @@ -100,24 +100,24 @@ SECTIONS |
| } |
| .init.arch.info : { |
| __arch_info_begin = .; |
| - *(.arch.info.init) |
| + KEEP(*(.arch.info.init)) |
| __arch_info_end = .; |
| } |
| .init.tagtable : { |
| __tagtable_begin = .; |
| - *(.taglist.init) |
| + KEEP(*(.taglist.init)) |
| __tagtable_end = .; |
| } |
| #ifdef CONFIG_SMP_ON_UP |
| .init.smpalt : { |
| __smpalt_begin = .; |
| - *(.alt.smp.init) |
| + KEEP(*(.alt.smp.init)) |
| __smpalt_end = .; |
| } |
| #endif |
| .init.pv_table : { |
| __pv_table_begin = .; |
| - *(.pv_table) |
| + KEEP(*(.pv_table)) |
| __pv_table_end = .; |
| } |
| |
| --- a/arch/arm/kernel/vmlinux.lds.h |
| +++ b/arch/arm/kernel/vmlinux.lds.h |
| @@ -22,7 +22,7 @@ |
| #define ARM_MMU_DISCARD(x) |
| #else |
| #define ARM_MMU_KEEP(x) |
| -#define ARM_MMU_DISCARD(x) x |
| +#define ARM_MMU_DISCARD(x) KEEP(x) |
| #endif |
| |
| /* |
| @@ -41,7 +41,7 @@ |
| #define PROC_INFO \ |
| . = ALIGN(4); \ |
| __proc_info_begin = .; \ |
| - *(.proc.info.init) \ |
| + KEEP(*(.proc.info.init)) \ |
| __proc_info_end = .; |
| |
| #define HYPERVISOR_TEXT \ |
| @@ -52,11 +52,11 @@ |
| #define IDMAP_TEXT \ |
| ALIGN_FUNCTION(); \ |
| __idmap_text_start = .; \ |
| - *(.idmap.text) \ |
| + KEEP(*(.idmap.text)) \ |
| __idmap_text_end = .; \ |
| . = ALIGN(PAGE_SIZE); \ |
| __hyp_idmap_text_start = .; \ |
| - *(.hyp.idmap.text) \ |
| + KEEP(*(.hyp.idmap.text)) \ |
| __hyp_idmap_text_end = .; |
| |
| #define ARM_DISCARD \ |
| @@ -99,12 +99,12 @@ |
| . = ALIGN(8); \ |
| .ARM.unwind_idx : { \ |
| __start_unwind_idx = .; \ |
| - *(.ARM.exidx*) \ |
| + KEEP(*(.ARM.exidx*)) \ |
| __stop_unwind_idx = .; \ |
| } \ |
| .ARM.unwind_tab : { \ |
| __start_unwind_tab = .; \ |
| - *(.ARM.extab*) \ |
| + KEEP(*(.ARM.extab*)) \ |
| __stop_unwind_tab = .; \ |
| } |
| |
| @@ -116,7 +116,7 @@ |
| __vectors_lma = .; \ |
| OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) { \ |
| .vectors { \ |
| - *(.vectors) \ |
| + KEEP(*(.vectors)) \ |
| } \ |
| .vectors.bhb.loop8 { \ |
| *(.vectors.bhb.loop8) \ |
| @@ -134,7 +134,7 @@ |
| \ |
| __stubs_lma = .; \ |
| .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) { \ |
| - *(.stubs) \ |
| + KEEP(*(.stubs)) \ |
| } \ |
| ARM_LMA(__stubs, .stubs); \ |
| . = __stubs_lma + SIZEOF(.stubs); \ |