kernel: add linux 4.9 support
[openwrt/staging/yousong.git] / target / linux / generic / patches-4.9 / 220-gc_sections.patch
1 From: Felix Fietkau <nbd@nbd.name>
2
3 use -ffunction-sections, -fdata-sections and --gc-sections
4
5 In combination with kernel symbol export stripping this significantly reduces
6 the kernel image size. Used on both ARM and MIPS architectures.
7
8 Signed-off-by: Felix Fietkau <nbd@nbd.name>
9 Signed-off-by: Jonas Gorski <jogo@openwrt.org>
10 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
11 ---
12
13 --- a/arch/mips/kernel/vmlinux.lds.S
14 +++ b/arch/mips/kernel/vmlinux.lds.S
15 @@ -71,7 +71,7 @@ SECTIONS
16 /* Exception table for data bus errors */
17 __dbe_table : {
18 __start___dbe_table = .;
19 - *(__dbe_table)
20 + KEEP(*(__dbe_table))
21 __stop___dbe_table = .;
22 }
23
24 @@ -121,7 +121,7 @@ SECTIONS
25 . = ALIGN(4);
26 .mips.machines.init : AT(ADDR(.mips.machines.init) - LOAD_OFFSET) {
27 __mips_machines_start = .;
28 - *(.mips.machines.init)
29 + KEEP(*(.mips.machines.init))
30 __mips_machines_end = .;
31 }
32
33 --- a/include/asm-generic/vmlinux.lds.h
34 +++ b/include/asm-generic/vmlinux.lds.h
35 @@ -114,7 +114,7 @@
36 #ifdef CONFIG_KPROBES
37 #define KPROBE_BLACKLIST() . = ALIGN(8); \
38 VMLINUX_SYMBOL(__start_kprobe_blacklist) = .; \
39 - *(_kprobe_blacklist) \
40 + KEEP(*(_kprobe_blacklist)) \
41 VMLINUX_SYMBOL(__stop_kprobe_blacklist) = .;
42 #else
43 #define KPROBE_BLACKLIST()
44 @@ -123,10 +123,10 @@
45 #ifdef CONFIG_EVENT_TRACING
46 #define FTRACE_EVENTS() . = ALIGN(8); \
47 VMLINUX_SYMBOL(__start_ftrace_events) = .; \
48 - *(_ftrace_events) \
49 + KEEP(*(_ftrace_events)) \
50 VMLINUX_SYMBOL(__stop_ftrace_events) = .; \
51 VMLINUX_SYMBOL(__start_ftrace_enum_maps) = .; \
52 - *(_ftrace_enum_map) \
53 + KEEP(*(_ftrace_enum_map)) \
54 VMLINUX_SYMBOL(__stop_ftrace_enum_maps) = .;
55 #else
56 #define FTRACE_EVENTS()
57 @@ -147,7 +147,7 @@
58 #ifdef CONFIG_FTRACE_SYSCALLS
59 #define TRACE_SYSCALLS() . = ALIGN(8); \
60 VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \
61 - *(__syscalls_metadata) \
62 + KEEP(*(__syscalls_metadata)) \
63 VMLINUX_SYMBOL(__stop_syscalls_metadata) = .;
64 #else
65 #define TRACE_SYSCALLS()
66 @@ -169,8 +169,8 @@
67 #define _OF_TABLE_1(name) \
68 . = ALIGN(8); \
69 VMLINUX_SYMBOL(__##name##_of_table) = .; \
70 - *(__##name##_of_table) \
71 - *(__##name##_of_table_end)
72 + KEEP(*(__##name##_of_table)) \
73 + KEEP(*(__##name##_of_table_end))
74
75 #define CLKSRC_OF_TABLES() OF_TABLE(CONFIG_CLKSRC_OF, clksrc)
76 #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip)
77 @@ -193,7 +193,7 @@
78 #define KERNEL_DTB() \
79 STRUCT_ALIGN(); \
80 VMLINUX_SYMBOL(__dtb_start) = .; \
81 - *(.dtb.init.rodata) \
82 + KEEP(*(.dtb.init.rodata)) \
83 VMLINUX_SYMBOL(__dtb_end) = .;
84
85 /*
86 @@ -214,16 +214,17 @@
87 /* implement dynamic printk debug */ \
88 . = ALIGN(8); \
89 VMLINUX_SYMBOL(__start___jump_table) = .; \
90 - *(__jump_table) \
91 + KEEP(*(__jump_table)) \
92 VMLINUX_SYMBOL(__stop___jump_table) = .; \
93 . = ALIGN(8); \
94 VMLINUX_SYMBOL(__start___verbose) = .; \
95 - *(__verbose) \
96 + KEEP(*(__verbose)) \
97 VMLINUX_SYMBOL(__stop___verbose) = .; \
98 LIKELY_PROFILE() \
99 BRANCH_PROFILE() \
100 TRACE_PRINTKS() \
101 - TRACEPOINT_STR()
102 + TRACEPOINT_STR() \
103 + *(.data.[a-zA-Z_]*)
104
105 /*
106 * Data section helpers
107 @@ -291,35 +292,35 @@
108 /* PCI quirks */ \
109 .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \
110 VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \
111 - *(.pci_fixup_early) \
112 + KEEP(*(.pci_fixup_early)) \
113 VMLINUX_SYMBOL(__end_pci_fixups_early) = .; \
114 VMLINUX_SYMBOL(__start_pci_fixups_header) = .; \
115 - *(.pci_fixup_header) \
116 + KEEP(*(.pci_fixup_header)) \
117 VMLINUX_SYMBOL(__end_pci_fixups_header) = .; \
118 VMLINUX_SYMBOL(__start_pci_fixups_final) = .; \
119 - *(.pci_fixup_final) \
120 + KEEP(*(.pci_fixup_final)) \
121 VMLINUX_SYMBOL(__end_pci_fixups_final) = .; \
122 VMLINUX_SYMBOL(__start_pci_fixups_enable) = .; \
123 - *(.pci_fixup_enable) \
124 + KEEP(*(.pci_fixup_enable)) \
125 VMLINUX_SYMBOL(__end_pci_fixups_enable) = .; \
126 VMLINUX_SYMBOL(__start_pci_fixups_resume) = .; \
127 - *(.pci_fixup_resume) \
128 + KEEP(*(.pci_fixup_resume)) \
129 VMLINUX_SYMBOL(__end_pci_fixups_resume) = .; \
130 VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .; \
131 - *(.pci_fixup_resume_early) \
132 + KEEP(*(.pci_fixup_resume_early)) \
133 VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .; \
134 VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .; \
135 - *(.pci_fixup_suspend) \
136 + KEEP(*(.pci_fixup_suspend)) \
137 VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .; \
138 VMLINUX_SYMBOL(__start_pci_fixups_suspend_late) = .; \
139 - *(.pci_fixup_suspend_late) \
140 + KEEP(*(.pci_fixup_suspend_late)) \
141 VMLINUX_SYMBOL(__end_pci_fixups_suspend_late) = .; \
142 } \
143 \
144 /* Built-in firmware blobs */ \
145 .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \
146 VMLINUX_SYMBOL(__start_builtin_fw) = .; \
147 - *(.builtin_fw) \
148 + KEEP(*(.builtin_fw)) \
149 VMLINUX_SYMBOL(__end_builtin_fw) = .; \
150 } \
151 \
152 @@ -397,7 +398,7 @@
153 \
154 /* Kernel symbol table: strings */ \
155 __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
156 - KEEP(*(__ksymtab_strings)) \
157 + *(__ksymtab_strings) \
158 } \
159 \
160 /* __*init sections */ \
161 @@ -410,14 +411,14 @@
162 /* Built-in module parameters. */ \
163 __param : AT(ADDR(__param) - LOAD_OFFSET) { \
164 VMLINUX_SYMBOL(__start___param) = .; \
165 - *(__param) \
166 + KEEP(*(__param)) \
167 VMLINUX_SYMBOL(__stop___param) = .; \
168 } \
169 \
170 /* Built-in module versions. */ \
171 __modver : AT(ADDR(__modver) - LOAD_OFFSET) { \
172 VMLINUX_SYMBOL(__start___modver) = .; \
173 - *(__modver) \
174 + KEEP(*(__modver)) \
175 VMLINUX_SYMBOL(__stop___modver) = .; \
176 . = ALIGN((align)); \
177 VMLINUX_SYMBOL(__end_rodata) = .; \
178 @@ -482,7 +483,7 @@
179 #define ENTRY_TEXT \
180 ALIGN_FUNCTION(); \
181 VMLINUX_SYMBOL(__entry_text_start) = .; \
182 - *(.entry.text) \
183 + KEEP(*(.entry.text)) \
184 VMLINUX_SYMBOL(__entry_text_end) = .;
185
186 #if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN)
187 @@ -520,7 +521,7 @@
188 . = ALIGN(align); \
189 __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \
190 VMLINUX_SYMBOL(__start___ex_table) = .; \
191 - *(__ex_table) \
192 + KEEP(*(__ex_table)) \
193 VMLINUX_SYMBOL(__stop___ex_table) = .; \
194 }
195
196 @@ -536,9 +537,9 @@
197 #ifdef CONFIG_CONSTRUCTORS
198 #define KERNEL_CTORS() . = ALIGN(8); \
199 VMLINUX_SYMBOL(__ctors_start) = .; \
200 - *(.ctors) \
201 + KEEP(*(.ctors)) \
202 *(SORT(.init_array.*)) \
203 - *(.init_array) \
204 + KEEP(*(.init_array)) \
205 VMLINUX_SYMBOL(__ctors_end) = .;
206 #else
207 #define KERNEL_CTORS()
208 @@ -595,7 +596,7 @@
209 #define SBSS(sbss_align) \
210 . = ALIGN(sbss_align); \
211 .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \
212 - *(.sbss) \
213 + *(.sbss .sbss.*) \
214 *(.scommon) \
215 }
216
217 @@ -662,7 +663,7 @@
218 . = ALIGN(8); \
219 __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \
220 VMLINUX_SYMBOL(__start___bug_table) = .; \
221 - *(__bug_table) \
222 + KEEP(*(__bug_table)) \
223 VMLINUX_SYMBOL(__stop___bug_table) = .; \
224 }
225 #else
226 @@ -674,7 +675,7 @@
227 . = ALIGN(4); \
228 .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \
229 VMLINUX_SYMBOL(__tracedata_start) = .; \
230 - *(.tracedata) \
231 + KEEP(*(.tracedata)) \
232 VMLINUX_SYMBOL(__tracedata_end) = .; \
233 }
234 #else
235 @@ -691,7 +692,7 @@
236 #define INIT_SETUP(initsetup_align) \
237 . = ALIGN(initsetup_align); \
238 VMLINUX_SYMBOL(__setup_start) = .; \
239 - *(.init.setup) \
240 + KEEP(*(.init.setup)) \
241 VMLINUX_SYMBOL(__setup_end) = .;
242
243 #define INIT_CALLS_LEVEL(level) \
244 --- a/arch/arm/kernel/vmlinux.lds.S
245 +++ b/arch/arm/kernel/vmlinux.lds.S
246 @@ -17,7 +17,7 @@
247 #define PROC_INFO \
248 . = ALIGN(4); \
249 VMLINUX_SYMBOL(__proc_info_begin) = .; \
250 - *(.proc.info.init) \
251 + KEEP(*(.proc.info.init)) \
252 VMLINUX_SYMBOL(__proc_info_end) = .;
253
254 #define HYPERVISOR_TEXT \
255 @@ -28,11 +28,11 @@
256 #define IDMAP_TEXT \
257 ALIGN_FUNCTION(); \
258 VMLINUX_SYMBOL(__idmap_text_start) = .; \
259 - *(.idmap.text) \
260 + KEEP(*(.idmap.text)) \
261 VMLINUX_SYMBOL(__idmap_text_end) = .; \
262 . = ALIGN(PAGE_SIZE); \
263 VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \
264 - *(.hyp.idmap.text) \
265 + KEEP(*(.hyp.idmap.text)) \
266 VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
267
268 #ifdef CONFIG_HOTPLUG_CPU
269 @@ -105,7 +105,7 @@ SECTIONS
270 _stext = .; /* Text and read-only data */
271 IDMAP_TEXT
272 __exception_text_start = .;
273 - *(.exception.text)
274 + KEEP(*(.exception.text))
275 __exception_text_end = .;
276 IRQENTRY_TEXT
277 SOFTIRQENTRY_TEXT
278 @@ -134,7 +134,7 @@ SECTIONS
279 __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
280 __start___ex_table = .;
281 #ifdef CONFIG_MMU
282 - *(__ex_table)
283 + KEEP(*(__ex_table))
284 #endif
285 __stop___ex_table = .;
286 }
287 @@ -146,12 +146,12 @@ SECTIONS
288 . = ALIGN(8);
289 .ARM.unwind_idx : {
290 __start_unwind_idx = .;
291 - *(.ARM.exidx*)
292 + KEEP(*(.ARM.exidx*))
293 __stop_unwind_idx = .;
294 }
295 .ARM.unwind_tab : {
296 __start_unwind_tab = .;
297 - *(.ARM.extab*)
298 + KEEP(*(.ARM.extab*))
299 __stop_unwind_tab = .;
300 }
301 #endif
302 @@ -171,14 +171,14 @@ SECTIONS
303 */
304 __vectors_start = .;
305 .vectors 0xffff0000 : AT(__vectors_start) {
306 - *(.vectors)
307 + KEEP(*(.vectors))
308 }
309 . = __vectors_start + SIZEOF(.vectors);
310 __vectors_end = .;
311
312 __stubs_start = .;
313 .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {
314 - *(.stubs)
315 + KEEP(*(.stubs))
316 }
317 . = __stubs_start + SIZEOF(.stubs);
318 __stubs_end = .;
319 @@ -194,24 +194,24 @@ SECTIONS
320 }
321 .init.arch.info : {
322 __arch_info_begin = .;
323 - *(.arch.info.init)
324 + KEEP(*(.arch.info.init))
325 __arch_info_end = .;
326 }
327 .init.tagtable : {
328 __tagtable_begin = .;
329 - *(.taglist.init)
330 + KEEP(*(.taglist.init))
331 __tagtable_end = .;
332 }
333 #ifdef CONFIG_SMP_ON_UP
334 .init.smpalt : {
335 __smpalt_begin = .;
336 - *(.alt.smp.init)
337 + KEEP(*(.alt.smp.init))
338 __smpalt_end = .;
339 }
340 #endif
341 .init.pv_table : {
342 __pv_table_begin = .;
343 - *(.pv_table)
344 + KEEP(*(.pv_table))
345 __pv_table_end = .;
346 }
347 .init.data : {
348 --- a/arch/arm/boot/compressed/Makefile
349 +++ b/arch/arm/boot/compressed/Makefile
350 @@ -102,6 +102,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
351 ORIG_CFLAGS := $(KBUILD_CFLAGS)
352 KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
353 endif
354 +KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL))
355
356 # -fstack-protector-strong triggers protection checks in this code,
357 # but it is being used too early to link to meaningful stack_chk logic.
358 --- a/arch/arm/Kconfig
359 +++ b/arch/arm/Kconfig
360 @@ -81,6 +81,7 @@ config ARM
361 select HAVE_UID16
362 select HAVE_VIRT_CPU_ACCOUNTING_GEN
363 select IRQ_FORCED_THREADING
364 + select LD_DEAD_CODE_DATA_ELIMINATION
365 select MODULES_USE_ELF_REL
366 select NO_BOOTMEM
367 select OF_EARLY_FLATTREE if OF
368 --- a/arch/mips/Kconfig
369 +++ b/arch/mips/Kconfig
370 @@ -55,6 +55,7 @@ config MIPS
371 select CLONE_BACKWARDS
372 select HAVE_DEBUG_STACKOVERFLOW
373 select HAVE_CC_STACKPROTECTOR
374 + select LD_DEAD_CODE_DATA_ELIMINATION
375 select CPU_PM if CPU_IDLE
376 select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
377 select ARCH_BINFMT_ELF_STATE
378 --- a/Makefile
379 +++ b/Makefile
380 @@ -409,6 +409,11 @@ KBUILD_AFLAGS_MODULE := -DMODULE
381 KBUILD_CFLAGS_MODULE := -DMODULE
382 KBUILD_LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds $(if $(CONFIG_PROFILING),,-s)
383
384 +ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
385 +KBUILD_CFLAGS_KERNEL += $(call cc-option,-ffunction-sections,)
386 +KBUILD_CFLAGS_KERNEL += $(call cc-option,-fdata-sections,)
387 +endif
388 +
389 # Read KERNELRELEASE from include/config/kernel.release (if it exists)
390 KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
391 KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
392 @@ -630,11 +635,6 @@ include arch/$(SRCARCH)/Makefile
393 KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,)
394 KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
395
396 -ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
397 -KBUILD_CFLAGS += $(call cc-option,-ffunction-sections,)
398 -KBUILD_CFLAGS += $(call cc-option,-fdata-sections,)
399 -endif
400 -
401 ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
402 KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,) $(EXTRA_OPTIMIZATION)
403 else