From: Felix Fietkau <nbd@openwrt.org>
-use -ffunction-sections, -fdata-sections and --gc-sections --sort-section=name
+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.
cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
cflags-y += -msoft-float
-LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
-+LDFLAGS_vmlinux += -G 0 -static -n -nostdlib --gc-sections --sort-section=name
++LDFLAGS_vmlinux += -G 0 -static -n -nostdlib --gc-sections
KBUILD_AFLAGS_MODULE += -mlong-calls
KBUILD_CFLAGS_MODULE += -mlong-calls
+KBUILD_CFLAGS_KERNEL += -ffunction-sections -fdata-sections
+endif
+
- cflags-y += -ffreestanding
-
#
+ # pass -msoft-float to GAS if it supports it. However on newer binutils
+ # (specifically newer than 2.24.51.20140728) we then also need to explicitly
--- a/arch/mips/kernel/vmlinux.lds.S
+++ b/arch/mips/kernel/vmlinux.lds.S
@@ -67,7 +67,7 @@ SECTIONS
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
-@@ -87,7 +87,7 @@
+@@ -89,7 +89,7 @@
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
#define MCOUNT_REC() . = ALIGN(8); \
VMLINUX_SYMBOL(__start_mcount_loc) = .; \
VMLINUX_SYMBOL(__stop_mcount_loc) = .;
#else
#define MCOUNT_REC()
-@@ -95,7 +95,7 @@
+@@ -97,7 +97,7 @@
#ifdef CONFIG_TRACE_BRANCH_PROFILING
#define LIKELY_PROFILE() VMLINUX_SYMBOL(__start_annotated_branch_profile) = .; \
VMLINUX_SYMBOL(__stop_annotated_branch_profile) = .;
#else
#define LIKELY_PROFILE()
-@@ -103,7 +103,7 @@
+@@ -105,7 +105,7 @@
#ifdef CONFIG_PROFILE_ALL_BRANCHES
#define BRANCH_PROFILE() VMLINUX_SYMBOL(__start_branch_profile) = .; \
VMLINUX_SYMBOL(__stop_branch_profile) = .;
#else
#define BRANCH_PROFILE()
-@@ -112,7 +112,7 @@
+@@ -114,7 +114,7 @@
+ #ifdef CONFIG_KPROBES
+ #define KPROBE_BLACKLIST() . = ALIGN(8); \
+ VMLINUX_SYMBOL(__start_kprobe_blacklist) = .; \
+- *(_kprobe_blacklist) \
++ KEEP(*(_kprobe_blacklist)) \
+ VMLINUX_SYMBOL(__stop_kprobe_blacklist) = .;
+ #else
+ #define KPROBE_BLACKLIST()
+@@ -123,7 +123,7 @@
#ifdef CONFIG_EVENT_TRACING
#define FTRACE_EVENTS() . = ALIGN(8); \
VMLINUX_SYMBOL(__start_ftrace_events) = .; \
VMLINUX_SYMBOL(__stop_ftrace_events) = .;
#else
#define FTRACE_EVENTS()
-@@ -120,7 +120,7 @@
+@@ -131,7 +131,7 @@
#ifdef CONFIG_TRACING
#define TRACE_PRINTKS() VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .; \
VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .;
#define TRACEPOINT_STR() VMLINUX_SYMBOL(__start___tracepoint_str) = .; \
*(__tracepoint_str) /* Trace_printk fmt' pointer */ \
-@@ -133,7 +133,7 @@
+@@ -144,7 +144,7 @@
#ifdef CONFIG_FTRACE_SYSCALLS
#define TRACE_SYSCALLS() . = ALIGN(8); \
VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \
VMLINUX_SYMBOL(__stop_syscalls_metadata) = .;
#else
#define TRACE_SYSCALLS()
-@@ -142,8 +142,8 @@
- #ifdef CONFIG_CLKSRC_OF
- #define CLKSRC_OF_TABLES() . = ALIGN(8); \
- VMLINUX_SYMBOL(__clksrc_of_table) = .; \
-- *(__clksrc_of_table) \
-- *(__clksrc_of_table_end)
-+ KEEP(*(__clksrc_of_table)) \
-+ KEEP(*(__clksrc_of_table_end))
- #else
- #define CLKSRC_OF_TABLES()
- #endif
-@@ -152,8 +152,8 @@
- #define IRQCHIP_OF_MATCH_TABLE() \
+@@ -158,8 +158,8 @@
+ #define _OF_TABLE_1(name) \
. = ALIGN(8); \
- VMLINUX_SYMBOL(__irqchip_begin) = .; \
-- *(__irqchip_of_table) \
-- *(__irqchip_of_end)
-+ KEEP(*(__irqchip_of_table)) \
-+ KEEP(*(__irqchip_of_end))
- #else
- #define IRQCHIP_OF_MATCH_TABLE()
- #endif
-@@ -161,8 +161,8 @@
- #ifdef CONFIG_COMMON_CLK
- #define CLK_OF_TABLES() . = ALIGN(8); \
- VMLINUX_SYMBOL(__clk_of_table) = .; \
-- *(__clk_of_table) \
-- *(__clk_of_table_end)
-+ KEEP(*(__clk_of_table)) \
-+ KEEP(*(__clk_of_table_end))
- #else
- #define CLK_OF_TABLES()
- #endif
-@@ -170,7 +170,7 @@
+ VMLINUX_SYMBOL(__##name##_of_table) = .; \
+- *(__##name##_of_table) \
+- *(__##name##_of_table_end)
++ KEEP(*(__##name##_of_table)) \
++ KEEP(*(__##name##_of_table_end))
+
+ #define CLKSRC_OF_TABLES() OF_TABLE(CONFIG_CLKSRC_OF, clksrc)
+ #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip)
+@@ -171,7 +171,7 @@
#define KERNEL_DTB() \
STRUCT_ALIGN(); \
VMLINUX_SYMBOL(__dtb_start) = .; \
VMLINUX_SYMBOL(__dtb_end) = .;
/* .data section */
-@@ -186,16 +186,17 @@
+@@ -187,16 +187,17 @@
/* implement dynamic printk debug */ \
. = ALIGN(8); \
VMLINUX_SYMBOL(__start___jump_table) = .; \
/*
* Data section helpers
-@@ -249,32 +250,32 @@
+@@ -250,35 +251,35 @@
/* PCI quirks */ \
.pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \
- *(.pci_fixup_suspend) \
+ KEEP(*(.pci_fixup_suspend)) \
VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .; \
+ VMLINUX_SYMBOL(__start_pci_fixups_suspend_late) = .; \
+- *(.pci_fixup_suspend_late) \
++ KEEP(*(.pci_fixup_suspend_late)) \
+ VMLINUX_SYMBOL(__end_pci_fixups_suspend_late) = .; \
} \
\
/* Built-in firmware blobs */ \
VMLINUX_SYMBOL(__end_builtin_fw) = .; \
} \
\
-@@ -283,49 +284,49 @@
+@@ -287,49 +288,49 @@
/* Kernel symbol table: Normal symbols */ \
__ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start___ksymtab) = .; \
VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \
} \
\
-@@ -339,14 +340,14 @@
+@@ -343,14 +344,14 @@
/* Kernel symbol table: GPL-only unused symbols */ \
__kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \
VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \
} \
\
-@@ -365,14 +366,14 @@
+@@ -369,14 +370,14 @@
/* Built-in module parameters. */ \
__param : AT(ADDR(__param) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start___param) = .; \
VMLINUX_SYMBOL(__stop___modver) = .; \
. = ALIGN((align)); \
VMLINUX_SYMBOL(__end_rodata) = .; \
-@@ -428,7 +429,7 @@
+@@ -432,7 +433,7 @@
#define ENTRY_TEXT \
ALIGN_FUNCTION(); \
VMLINUX_SYMBOL(__entry_text_start) = .; \
VMLINUX_SYMBOL(__entry_text_end) = .;
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
-@@ -456,7 +457,7 @@
+@@ -460,7 +461,7 @@
. = ALIGN(align); \
__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start___ex_table) = .; \
VMLINUX_SYMBOL(__stop___ex_table) = .; \
}
-@@ -472,8 +473,8 @@
+@@ -476,8 +477,8 @@
#ifdef CONFIG_CONSTRUCTORS
#define KERNEL_CTORS() . = ALIGN(8); \
VMLINUX_SYMBOL(__ctors_start) = .; \
VMLINUX_SYMBOL(__ctors_end) = .;
#else
#define KERNEL_CTORS()
-@@ -517,7 +518,7 @@
+@@ -525,7 +526,7 @@
#define SBSS(sbss_align) \
. = ALIGN(sbss_align); \
.sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \
*(.scommon) \
}
-@@ -535,7 +536,7 @@
+@@ -543,7 +544,7 @@
BSS_FIRST_SECTIONS \
*(.bss..page_aligned) \
*(.dynbss) \
*(COMMON) \
}
-@@ -596,7 +597,7 @@
+@@ -592,7 +593,7 @@
+ . = ALIGN(8); \
+ __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \
+ VMLINUX_SYMBOL(__start___bug_table) = .; \
+- *(__bug_table) \
++ KEEP(*(__bug_table)) \
+ VMLINUX_SYMBOL(__stop___bug_table) = .; \
+ }
+ #else
+@@ -604,7 +605,7 @@
. = ALIGN(4); \
.tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__tracedata_start) = .; \
VMLINUX_SYMBOL(__tracedata_end) = .; \
}
#else
-@@ -613,17 +614,17 @@
+@@ -621,17 +622,17 @@
#define INIT_SETUP(initsetup_align) \
. = ALIGN(initsetup_align); \
VMLINUX_SYMBOL(__setup_start) = .; \
INIT_CALLS_LEVEL(0) \
INIT_CALLS_LEVEL(1) \
INIT_CALLS_LEVEL(2) \
-@@ -637,21 +638,21 @@
+@@ -645,21 +646,21 @@
#define CON_INITCALL \
VMLINUX_SYMBOL(__con_initcall_start) = .; \
LDFLAGS_vmlinux += --be8
LDFLAGS_MODULE += --be8
endif
-+LDFLAGS_vmlinux += --gc-sections --sort-section=name
++LDFLAGS_vmlinux += --gc-sections
OBJCOPYFLAGS :=-O binary -R .comment -S
GZFLAGS :=-9
.init.data : {
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
-@@ -120,6 +120,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
+@@ -122,6 +122,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
ORIG_CFLAGS := $(KBUILD_CFLAGS)
KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
endif