Port and adapt Nick Piggin's original patch [1]. This enables dead code and data elimination at linking time (gc-sections) on x86(-64).
openwrt-x86-64-generic-kernel.bin size, with my config: Before: 3138048 bytes After: 2937344 bytes In other words, we save about 200 kB. [1] https://lore.kernel.org/lkml/20170709031333.29443-1-npig...@gmail.com/ Signed-off-by: Rui Salvaterra <rsalvate...@gmail.com> --- v2: move the patch to x86/patches-5.4. ...nable-dead-code-and-data-elimination.patch | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 target/linux/x86/patches-5.4/350-x86-enable-dead-code-and-data-elimination.patch diff --git a/target/linux/x86/patches-5.4/350-x86-enable-dead-code-and-data-elimination.patch b/target/linux/x86/patches-5.4/350-x86-enable-dead-code-and-data-elimination.patch new file mode 100644 index 0000000000..392ddd71ce --- /dev/null +++ b/target/linux/x86/patches-5.4/350-x86-enable-dead-code-and-data-elimination.patch @@ -0,0 +1,127 @@ +From f08a0e4e59f92b4a88501653761cbca08935b9b6 Mon Sep 17 00:00:00 2001 +From: Rui Salvaterra <rsalvate...@gmail.com> +Date: Wed, 4 Nov 2020 19:45:04 +0000 +Subject: [PATCH] x86: enable dead code and data elimination + +Adapt Nick Piggin's original patch [1]. This saves nearly 300 kiB on the final +vmlinuz (zstd-compressed). + +[1] https://lore.kernel.org/lkml/20170709031333.29443-1-npig...@gmail.com/ + +Signed-off-by: Rui Salvaterra <rsalvate...@gmail.com> +--- + arch/x86/Kconfig | 1 + + arch/x86/kernel/vmlinux.lds.S | 24 ++++++++++++------------ + 2 files changed, 13 insertions(+), 12 deletions(-) + +--- a/arch/x86/Kconfig ++++ b/arch/x86/Kconfig +@@ -184,6 +184,7 @@ config X86 + select HAVE_FUNCTION_ERROR_INJECTION + select HAVE_KRETPROBES + select HAVE_KVM ++ select HAVE_LD_DEAD_CODE_DATA_ELIMINATION + select HAVE_LIVEPATCH if X86_64 + select HAVE_MEMBLOCK_NODE_MAP + select HAVE_MIXED_BREAKPOINTS_REGS +--- a/arch/x86/kernel/vmlinux.lds.S ++++ b/arch/x86/kernel/vmlinux.lds.S +@@ -242,14 +242,14 @@ SECTIONS + * See static_cpu_has() for an example. + */ + .altinstr_aux : AT(ADDR(.altinstr_aux) - LOAD_OFFSET) { +- *(.altinstr_aux) ++ KEEP(*(.altinstr_aux)) + } + + INIT_DATA_SECTION(16) + + .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) { + __x86_cpu_dev_start = .; +- *(.x86_cpu_dev.init) ++ KEEP(*(.x86_cpu_dev.init)) + __x86_cpu_dev_end = .; + } + +@@ -257,7 +257,7 @@ SECTIONS + .x86_intel_mid_dev.init : AT(ADDR(.x86_intel_mid_dev.init) - \ + LOAD_OFFSET) { + __x86_intel_mid_dev_start = .; +- *(.x86_intel_mid_dev.init) ++ KEEP(*(.x86_intel_mid_dev.init)) + __x86_intel_mid_dev_end = .; + } + #endif +@@ -271,7 +271,7 @@ SECTIONS + . = ALIGN(8); + .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { + __parainstructions = .; +- *(.parainstructions) ++ KEEP(*(.parainstructions)) + __parainstructions_end = .; + } + +@@ -283,7 +283,7 @@ SECTIONS + . = ALIGN(8); + .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) { + __alt_instructions = .; +- *(.altinstructions) ++ KEEP(*(.altinstructions)) + __alt_instructions_end = .; + } + +@@ -293,7 +293,7 @@ SECTIONS + * get the address and the length of them to patch the kernel safely. + */ + .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) { +- *(.altinstr_replacement) ++ KEEP(*(.altinstr_replacement)) + } + + /* +@@ -304,14 +304,14 @@ SECTIONS + */ + .iommu_table : AT(ADDR(.iommu_table) - LOAD_OFFSET) { + __iommu_table = .; +- *(.iommu_table) ++ KEEP(*(.iommu_table)) + __iommu_table_end = .; + } + + . = ALIGN(8); + .apicdrivers : AT(ADDR(.apicdrivers) - LOAD_OFFSET) { + __apicdrivers = .; +- *(.apicdrivers); ++ KEEP(*(.apicdrivers)) + __apicdrivers_end = .; + } + +@@ -346,7 +346,7 @@ SECTIONS + . = ALIGN(PAGE_SIZE); + .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { + __smp_locks = .; +- *(.smp_locks) ++ KEEP(*(.smp_locks)) + . = ALIGN(PAGE_SIZE); + __smp_locks_end = .; + } +@@ -380,8 +380,8 @@ SECTIONS + . = ALIGN(PAGE_SIZE); + .brk : AT(ADDR(.brk) - LOAD_OFFSET) { + __brk_base = .; +- . += 64 * 1024; /* 64k alignment slop space */ +- *(.brk_reservation) /* areas brk users have reserved */ ++ . += 64 * 1024; /* 64k alignment slop space */ ++ KEEP(*(.brk_reservation)) /* areas brk users have reserved */ + __brk_limit = .; + } + +@@ -407,7 +407,7 @@ SECTIONS + . = ALIGN(HPAGE_SIZE); + .init.scratch : AT(ADDR(.init.scratch) - LOAD_OFFSET) { + __init_scratch_begin = .; +- *(.init.scratch) ++ KEEP(*(.init.scratch)) + . = ALIGN(HPAGE_SIZE); + __init_scratch_end = .; + } -- 2.30.0 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel