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