OpenWrt – Blame information for rev 3
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 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) |
||
3 | office | 36 | @@ -637,11 +642,6 @@ KBUILD_CFLAGS += $(call cc-disable-warni |
1 | office | 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 |
||
3 | office | 46 | KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,) $(EXTRA_OPTIMIZATION) |
47 | else |
||
1 | office | 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) \ |