OpenWrt – Blame information for rev 2
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 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/Makefile |
||
14 | +++ b/arch/mips/Makefile |
||
15 | @@ -89,10 +89,14 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin |
||
16 | # |
||
17 | cflags-y += -G 0 -mno-abicalls -fno-pic -pipe |
||
18 | cflags-y += -msoft-float |
||
19 | -LDFLAGS_vmlinux += -G 0 -static -n -nostdlib |
||
20 | +LDFLAGS_vmlinux += -G 0 -static -n -nostdlib --gc-sections |
||
21 | KBUILD_AFLAGS_MODULE += -mlong-calls |
||
22 | KBUILD_CFLAGS_MODULE += -mlong-calls |
||
23 | |||
24 | +ifndef CONFIG_FUNCTION_TRACER |
||
25 | +KBUILD_CFLAGS_KERNEL += -ffunction-sections -fdata-sections |
||
26 | +endif |
||
27 | + |
||
28 | # |
||
29 | # pass -msoft-float to GAS if it supports it. However on newer binutils |
||
30 | # (specifically newer than 2.24.51.20140728) we then also need to explicitly |
||
31 | --- a/arch/mips/kernel/vmlinux.lds.S |
||
32 | +++ b/arch/mips/kernel/vmlinux.lds.S |
||
33 | @@ -67,7 +67,7 @@ SECTIONS |
||
34 | /* Exception table for data bus errors */ |
||
35 | __dbe_table : { |
||
36 | __start___dbe_table = .; |
||
37 | - *(__dbe_table) |
||
38 | + KEEP(*(__dbe_table)) |
||
39 | __stop___dbe_table = .; |
||
40 | } |
||
41 | |||
42 | @@ -112,7 +112,7 @@ SECTIONS |
||
43 | . = ALIGN(4); |
||
44 | .mips.machines.init : AT(ADDR(.mips.machines.init) - LOAD_OFFSET) { |
||
45 | __mips_machines_start = .; |
||
46 | - *(.mips.machines.init) |
||
47 | + KEEP(*(.mips.machines.init)) |
||
48 | __mips_machines_end = .; |
||
49 | } |
||
50 | |||
51 | --- a/include/asm-generic/vmlinux.lds.h |
||
52 | +++ b/include/asm-generic/vmlinux.lds.h |
||
53 | @@ -89,7 +89,7 @@ |
||
54 | #ifdef CONFIG_FTRACE_MCOUNT_RECORD |
||
55 | #define MCOUNT_REC() . = ALIGN(8); \ |
||
56 | VMLINUX_SYMBOL(__start_mcount_loc) = .; \ |
||
57 | - *(__mcount_loc) \ |
||
58 | + KEEP(*(__mcount_loc)) \ |
||
59 | VMLINUX_SYMBOL(__stop_mcount_loc) = .; |
||
60 | #else |
||
61 | #define MCOUNT_REC() |
||
62 | @@ -97,7 +97,7 @@ |
||
63 | |||
64 | #ifdef CONFIG_TRACE_BRANCH_PROFILING |
||
65 | #define LIKELY_PROFILE() VMLINUX_SYMBOL(__start_annotated_branch_profile) = .; \ |
||
66 | - *(_ftrace_annotated_branch) \ |
||
67 | + KEEP(*(_ftrace_annotated_branch)) \ |
||
68 | VMLINUX_SYMBOL(__stop_annotated_branch_profile) = .; |
||
69 | #else |
||
70 | #define LIKELY_PROFILE() |
||
71 | @@ -105,7 +105,7 @@ |
||
72 | |||
73 | #ifdef CONFIG_PROFILE_ALL_BRANCHES |
||
74 | #define BRANCH_PROFILE() VMLINUX_SYMBOL(__start_branch_profile) = .; \ |
||
75 | - *(_ftrace_branch) \ |
||
76 | + KEEP(*(_ftrace_branch)) \ |
||
77 | VMLINUX_SYMBOL(__stop_branch_profile) = .; |
||
78 | #else |
||
79 | #define BRANCH_PROFILE() |
||
80 | @@ -114,7 +114,7 @@ |
||
81 | #ifdef CONFIG_KPROBES |
||
82 | #define KPROBE_BLACKLIST() . = ALIGN(8); \ |
||
83 | VMLINUX_SYMBOL(__start_kprobe_blacklist) = .; \ |
||
84 | - *(_kprobe_blacklist) \ |
||
85 | + KEEP(*(_kprobe_blacklist)) \ |
||
86 | VMLINUX_SYMBOL(__stop_kprobe_blacklist) = .; |
||
87 | #else |
||
88 | #define KPROBE_BLACKLIST() |
||
89 | @@ -123,7 +123,7 @@ |
||
90 | #ifdef CONFIG_EVENT_TRACING |
||
91 | #define FTRACE_EVENTS() . = ALIGN(8); \ |
||
92 | VMLINUX_SYMBOL(__start_ftrace_events) = .; \ |
||
93 | - *(_ftrace_events) \ |
||
94 | + KEEP(*(_ftrace_events)) \ |
||
95 | VMLINUX_SYMBOL(__stop_ftrace_events) = .; |
||
96 | #else |
||
97 | #define FTRACE_EVENTS() |
||
98 | @@ -131,7 +131,7 @@ |
||
99 | |||
100 | #ifdef CONFIG_TRACING |
||
101 | #define TRACE_PRINTKS() VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .; \ |
||
102 | - *(__trace_printk_fmt) /* Trace_printk fmt' pointer */ \ |
||
103 | + KEEP(*(__trace_printk_fmt)) /* Trace_printk fmt' pointer */ \ |
||
104 | VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .; |
||
105 | #define TRACEPOINT_STR() VMLINUX_SYMBOL(__start___tracepoint_str) = .; \ |
||
106 | *(__tracepoint_str) /* Trace_printk fmt' pointer */ \ |
||
107 | @@ -144,7 +144,7 @@ |
||
108 | #ifdef CONFIG_FTRACE_SYSCALLS |
||
109 | #define TRACE_SYSCALLS() . = ALIGN(8); \ |
||
110 | VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \ |
||
111 | - *(__syscalls_metadata) \ |
||
112 | + KEEP(*(__syscalls_metadata)) \ |
||
113 | VMLINUX_SYMBOL(__stop_syscalls_metadata) = .; |
||
114 | #else |
||
115 | #define TRACE_SYSCALLS() |
||
116 | @@ -158,8 +158,8 @@ |
||
117 | #define _OF_TABLE_1(name) \ |
||
118 | . = ALIGN(8); \ |
||
119 | VMLINUX_SYMBOL(__##name##_of_table) = .; \ |
||
120 | - *(__##name##_of_table) \ |
||
121 | - *(__##name##_of_table_end) |
||
122 | + KEEP(*(__##name##_of_table)) \ |
||
123 | + KEEP(*(__##name##_of_table_end)) |
||
124 | |||
125 | #define CLKSRC_OF_TABLES() OF_TABLE(CONFIG_CLKSRC_OF, clksrc) |
||
126 | #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip) |
||
127 | @@ -171,7 +171,7 @@ |
||
128 | #define KERNEL_DTB() \ |
||
129 | STRUCT_ALIGN(); \ |
||
130 | VMLINUX_SYMBOL(__dtb_start) = .; \ |
||
131 | - *(.dtb.init.rodata) \ |
||
132 | + KEEP(*(.dtb.init.rodata)) \ |
||
133 | VMLINUX_SYMBOL(__dtb_end) = .; |
||
134 | |||
135 | /* .data section */ |
||
136 | @@ -187,16 +187,17 @@ |
||
137 | /* implement dynamic printk debug */ \ |
||
138 | . = ALIGN(8); \ |
||
139 | VMLINUX_SYMBOL(__start___jump_table) = .; \ |
||
140 | - *(__jump_table) \ |
||
141 | + KEEP(*(__jump_table)) \ |
||
142 | VMLINUX_SYMBOL(__stop___jump_table) = .; \ |
||
143 | . = ALIGN(8); \ |
||
144 | VMLINUX_SYMBOL(__start___verbose) = .; \ |
||
145 | - *(__verbose) \ |
||
146 | + KEEP(*(__verbose)) \ |
||
147 | VMLINUX_SYMBOL(__stop___verbose) = .; \ |
||
148 | LIKELY_PROFILE() \ |
||
149 | BRANCH_PROFILE() \ |
||
150 | TRACE_PRINTKS() \ |
||
151 | - TRACEPOINT_STR() |
||
152 | + TRACEPOINT_STR() \ |
||
153 | + *(.data.[a-zA-Z_]*) |
||
154 | |||
155 | /* |
||
156 | * Data section helpers |
||
157 | @@ -250,35 +251,35 @@ |
||
158 | /* PCI quirks */ \ |
||
159 | .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ |
||
160 | VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \ |
||
161 | - *(.pci_fixup_early) \ |
||
162 | + KEEP(*(.pci_fixup_early)) \ |
||
163 | VMLINUX_SYMBOL(__end_pci_fixups_early) = .; \ |
||
164 | VMLINUX_SYMBOL(__start_pci_fixups_header) = .; \ |
||
165 | - *(.pci_fixup_header) \ |
||
166 | + KEEP(*(.pci_fixup_header)) \ |
||
167 | VMLINUX_SYMBOL(__end_pci_fixups_header) = .; \ |
||
168 | VMLINUX_SYMBOL(__start_pci_fixups_final) = .; \ |
||
169 | - *(.pci_fixup_final) \ |
||
170 | + KEEP(*(.pci_fixup_final)) \ |
||
171 | VMLINUX_SYMBOL(__end_pci_fixups_final) = .; \ |
||
172 | VMLINUX_SYMBOL(__start_pci_fixups_enable) = .; \ |
||
173 | - *(.pci_fixup_enable) \ |
||
174 | + KEEP(*(.pci_fixup_enable)) \ |
||
175 | VMLINUX_SYMBOL(__end_pci_fixups_enable) = .; \ |
||
176 | VMLINUX_SYMBOL(__start_pci_fixups_resume) = .; \ |
||
177 | - *(.pci_fixup_resume) \ |
||
178 | + KEEP(*(.pci_fixup_resume)) \ |
||
179 | VMLINUX_SYMBOL(__end_pci_fixups_resume) = .; \ |
||
180 | VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .; \ |
||
181 | - *(.pci_fixup_resume_early) \ |
||
182 | + KEEP(*(.pci_fixup_resume_early)) \ |
||
183 | VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .; \ |
||
184 | VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .; \ |
||
185 | - *(.pci_fixup_suspend) \ |
||
186 | + KEEP(*(.pci_fixup_suspend)) \ |
||
187 | VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .; \ |
||
188 | VMLINUX_SYMBOL(__start_pci_fixups_suspend_late) = .; \ |
||
189 | - *(.pci_fixup_suspend_late) \ |
||
190 | + KEEP(*(.pci_fixup_suspend_late)) \ |
||
191 | VMLINUX_SYMBOL(__end_pci_fixups_suspend_late) = .; \ |
||
192 | } \ |
||
193 | \ |
||
194 | /* Built-in firmware blobs */ \ |
||
195 | .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \ |
||
196 | VMLINUX_SYMBOL(__start_builtin_fw) = .; \ |
||
197 | - *(.builtin_fw) \ |
||
198 | + KEEP(*(.builtin_fw)) \ |
||
199 | VMLINUX_SYMBOL(__end_builtin_fw) = .; \ |
||
200 | } \ |
||
201 | \ |
||
202 | @@ -287,49 +288,49 @@ |
||
203 | /* Kernel symbol table: Normal symbols */ \ |
||
204 | __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ |
||
205 | VMLINUX_SYMBOL(__start___ksymtab) = .; \ |
||
206 | - *(SORT(___ksymtab+*)) \ |
||
207 | + KEEP(*(SORT(___ksymtab+*))) \ |
||
208 | VMLINUX_SYMBOL(__stop___ksymtab) = .; \ |
||
209 | } \ |
||
210 | \ |
||
211 | /* Kernel symbol table: GPL-only symbols */ \ |
||
212 | __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ |
||
213 | VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \ |
||
214 | - *(SORT(___ksymtab_gpl+*)) \ |
||
215 | + KEEP(*(SORT(___ksymtab_gpl+*))) \ |
||
216 | VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \ |
||
217 | } \ |
||
218 | \ |
||
219 | /* Kernel symbol table: Normal unused symbols */ \ |
||
220 | __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ |
||
221 | VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \ |
||
222 | - *(SORT(___ksymtab_unused+*)) \ |
||
223 | + KEEP(*(SORT(___ksymtab_unused+*))) \ |
||
224 | VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \ |
||
225 | } \ |
||
226 | \ |
||
227 | /* Kernel symbol table: GPL-only unused symbols */ \ |
||
228 | __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ |
||
229 | VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \ |
||
230 | - *(SORT(___ksymtab_unused_gpl+*)) \ |
||
231 | + KEEP(*(SORT(___ksymtab_unused_gpl+*))) \ |
||
232 | VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \ |
||
233 | } \ |
||
234 | \ |
||
235 | /* Kernel symbol table: GPL-future-only symbols */ \ |
||
236 | __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ |
||
237 | VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \ |
||
238 | - *(SORT(___ksymtab_gpl_future+*)) \ |
||
239 | + KEEP(*(SORT(___ksymtab_gpl_future+*))) \ |
||
240 | VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \ |
||
241 | } \ |
||
242 | \ |
||
243 | /* Kernel symbol table: Normal symbols */ \ |
||
244 | __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ |
||
245 | VMLINUX_SYMBOL(__start___kcrctab) = .; \ |
||
246 | - *(SORT(___kcrctab+*)) \ |
||
247 | + KEEP(*(SORT(___kcrctab+*))) \ |
||
248 | VMLINUX_SYMBOL(__stop___kcrctab) = .; \ |
||
249 | } \ |
||
250 | \ |
||
251 | /* Kernel symbol table: GPL-only symbols */ \ |
||
252 | __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ |
||
253 | VMLINUX_SYMBOL(__start___kcrctab_gpl) = .; \ |
||
254 | - *(SORT(___kcrctab_gpl+*)) \ |
||
255 | + KEEP(*(SORT(___kcrctab_gpl+*))) \ |
||
256 | VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \ |
||
257 | } \ |
||
258 | \ |
||
259 | @@ -343,14 +344,14 @@ |
||
260 | /* Kernel symbol table: GPL-only unused symbols */ \ |
||
261 | __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ |
||
262 | VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \ |
||
263 | - *(SORT(___kcrctab_unused_gpl+*)) \ |
||
264 | + KEEP(*(SORT(___kcrctab_unused_gpl+*))) \ |
||
265 | VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .; \ |
||
266 | } \ |
||
267 | \ |
||
268 | /* Kernel symbol table: GPL-future-only symbols */ \ |
||
269 | __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ |
||
270 | VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \ |
||
271 | - *(SORT(___kcrctab_gpl_future+*)) \ |
||
272 | + KEEP(*(SORT(___kcrctab_gpl_future+*))) \ |
||
273 | VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \ |
||
274 | } \ |
||
275 | \ |
||
276 | @@ -369,14 +370,14 @@ |
||
277 | /* Built-in module parameters. */ \ |
||
278 | __param : AT(ADDR(__param) - LOAD_OFFSET) { \ |
||
279 | VMLINUX_SYMBOL(__start___param) = .; \ |
||
280 | - *(__param) \ |
||
281 | + KEEP(*(__param)) \ |
||
282 | VMLINUX_SYMBOL(__stop___param) = .; \ |
||
283 | } \ |
||
284 | \ |
||
285 | /* Built-in module versions. */ \ |
||
286 | __modver : AT(ADDR(__modver) - LOAD_OFFSET) { \ |
||
287 | VMLINUX_SYMBOL(__start___modver) = .; \ |
||
288 | - *(__modver) \ |
||
289 | + KEEP(*(__modver)) \ |
||
290 | VMLINUX_SYMBOL(__stop___modver) = .; \ |
||
291 | . = ALIGN((align)); \ |
||
292 | VMLINUX_SYMBOL(__end_rodata) = .; \ |
||
293 | @@ -432,7 +433,7 @@ |
||
294 | #define ENTRY_TEXT \ |
||
295 | ALIGN_FUNCTION(); \ |
||
296 | VMLINUX_SYMBOL(__entry_text_start) = .; \ |
||
297 | - *(.entry.text) \ |
||
298 | + KEEP(*(.entry.text)) \ |
||
299 | VMLINUX_SYMBOL(__entry_text_end) = .; |
||
300 | |||
301 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
||
302 | @@ -460,7 +461,7 @@ |
||
303 | . = ALIGN(align); \ |
||
304 | __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \ |
||
305 | VMLINUX_SYMBOL(__start___ex_table) = .; \ |
||
306 | - *(__ex_table) \ |
||
307 | + KEEP(*(__ex_table)) \ |
||
308 | VMLINUX_SYMBOL(__stop___ex_table) = .; \ |
||
309 | } |
||
310 | |||
311 | @@ -476,8 +477,8 @@ |
||
312 | #ifdef CONFIG_CONSTRUCTORS |
||
313 | #define KERNEL_CTORS() . = ALIGN(8); \ |
||
314 | VMLINUX_SYMBOL(__ctors_start) = .; \ |
||
315 | - *(.ctors) \ |
||
316 | - *(.init_array) \ |
||
317 | + KEEP(*(.ctors)) \ |
||
318 | + KEEP(*(.init_array)) \ |
||
319 | VMLINUX_SYMBOL(__ctors_end) = .; |
||
320 | #else |
||
321 | #define KERNEL_CTORS() |
||
322 | @@ -525,7 +526,7 @@ |
||
323 | #define SBSS(sbss_align) \ |
||
324 | . = ALIGN(sbss_align); \ |
||
325 | .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \ |
||
326 | - *(.sbss) \ |
||
327 | + *(.sbss .sbss.*) \ |
||
328 | *(.scommon) \ |
||
329 | } |
||
330 | |||
331 | @@ -543,7 +544,7 @@ |
||
332 | BSS_FIRST_SECTIONS \ |
||
333 | *(.bss..page_aligned) \ |
||
334 | *(.dynbss) \ |
||
335 | - *(.bss) \ |
||
336 | + *(.bss .bss.*) \ |
||
337 | *(COMMON) \ |
||
338 | } |
||
339 | |||
340 | @@ -592,7 +593,7 @@ |
||
341 | . = ALIGN(8); \ |
||
342 | __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \ |
||
343 | VMLINUX_SYMBOL(__start___bug_table) = .; \ |
||
344 | - *(__bug_table) \ |
||
345 | + KEEP(*(__bug_table)) \ |
||
346 | VMLINUX_SYMBOL(__stop___bug_table) = .; \ |
||
347 | } |
||
348 | #else |
||
349 | @@ -604,7 +605,7 @@ |
||
350 | . = ALIGN(4); \ |
||
351 | .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \ |
||
352 | VMLINUX_SYMBOL(__tracedata_start) = .; \ |
||
353 | - *(.tracedata) \ |
||
354 | + KEEP(*(.tracedata)) \ |
||
355 | VMLINUX_SYMBOL(__tracedata_end) = .; \ |
||
356 | } |
||
357 | #else |
||
358 | @@ -621,17 +622,17 @@ |
||
359 | #define INIT_SETUP(initsetup_align) \ |
||
360 | . = ALIGN(initsetup_align); \ |
||
361 | VMLINUX_SYMBOL(__setup_start) = .; \ |
||
362 | - *(.init.setup) \ |
||
363 | + KEEP(*(.init.setup)) \ |
||
364 | VMLINUX_SYMBOL(__setup_end) = .; |
||
365 | |||
366 | #define INIT_CALLS_LEVEL(level) \ |
||
367 | VMLINUX_SYMBOL(__initcall##level##_start) = .; \ |
||
368 | - *(.initcall##level##.init) \ |
||
369 | - *(.initcall##level##s.init) \ |
||
370 | + KEEP(*(.initcall##level##.init)) \ |
||
371 | + KEEP(*(.initcall##level##s.init)) \ |
||
372 | |||
373 | #define INIT_CALLS \ |
||
374 | VMLINUX_SYMBOL(__initcall_start) = .; \ |
||
375 | - *(.initcallearly.init) \ |
||
376 | + KEEP(*(.initcallearly.init)) \ |
||
377 | INIT_CALLS_LEVEL(0) \ |
||
378 | INIT_CALLS_LEVEL(1) \ |
||
379 | INIT_CALLS_LEVEL(2) \ |
||
380 | @@ -645,21 +646,21 @@ |
||
381 | |||
382 | #define CON_INITCALL \ |
||
383 | VMLINUX_SYMBOL(__con_initcall_start) = .; \ |
||
384 | - *(.con_initcall.init) \ |
||
385 | + KEEP(*(.con_initcall.init)) \ |
||
386 | VMLINUX_SYMBOL(__con_initcall_end) = .; |
||
387 | |||
388 | #define SECURITY_INITCALL \ |
||
389 | VMLINUX_SYMBOL(__security_initcall_start) = .; \ |
||
390 | - *(.security_initcall.init) \ |
||
391 | + KEEP(*(.security_initcall.init)) \ |
||
392 | VMLINUX_SYMBOL(__security_initcall_end) = .; |
||
393 | |||
394 | #ifdef CONFIG_BLK_DEV_INITRD |
||
395 | #define INIT_RAM_FS \ |
||
396 | . = ALIGN(4); \ |
||
397 | VMLINUX_SYMBOL(__initramfs_start) = .; \ |
||
398 | - *(.init.ramfs) \ |
||
399 | + KEEP(*(.init.ramfs)) \ |
||
400 | . = ALIGN(8); \ |
||
401 | - *(.init.ramfs.info) |
||
402 | + KEEP(*(.init.ramfs.info)) |
||
403 | #else |
||
404 | #define INIT_RAM_FS |
||
405 | #endif |
||
406 | --- a/arch/arm/Makefile |
||
407 | +++ b/arch/arm/Makefile |
||
408 | @@ -18,11 +18,16 @@ ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) |
||
409 | LDFLAGS_vmlinux += --be8 |
||
410 | LDFLAGS_MODULE += --be8 |
||
411 | endif |
||
412 | +LDFLAGS_vmlinux += --gc-sections |
||
413 | |||
414 | OBJCOPYFLAGS :=-O binary -R .comment -S |
||
415 | GZFLAGS :=-9 |
||
416 | #KBUILD_CFLAGS +=-pipe |
||
417 | |||
418 | +ifndef CONFIG_FUNCTION_TRACER |
||
419 | +KBUILD_CFLAGS_KERNEL += -ffunction-sections -fdata-sections |
||
420 | +endif |
||
421 | + |
||
422 | # Never generate .eh_frame |
||
423 | KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm) |
||
424 | |||
425 | --- a/arch/arm/kernel/vmlinux.lds.S |
||
426 | +++ b/arch/arm/kernel/vmlinux.lds.S |
||
427 | @@ -12,13 +12,13 @@ |
||
428 | #define PROC_INFO \ |
||
429 | . = ALIGN(4); \ |
||
430 | VMLINUX_SYMBOL(__proc_info_begin) = .; \ |
||
431 | - *(.proc.info.init) \ |
||
432 | + KEEP(*(.proc.info.init)) \ |
||
433 | VMLINUX_SYMBOL(__proc_info_end) = .; |
||
434 | |||
435 | #define IDMAP_TEXT \ |
||
436 | ALIGN_FUNCTION(); \ |
||
437 | VMLINUX_SYMBOL(__idmap_text_start) = .; \ |
||
438 | - *(.idmap.text) \ |
||
439 | + KEEP(*(.idmap.text)) \ |
||
440 | VMLINUX_SYMBOL(__idmap_text_end) = .; \ |
||
441 | . = ALIGN(32); \ |
||
442 | VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \ |
||
443 | @@ -93,7 +93,7 @@ SECTIONS |
||
444 | .text : { /* Real text segment */ |
||
445 | _stext = .; /* Text and read-only data */ |
||
446 | __exception_text_start = .; |
||
447 | - *(.exception.text) |
||
448 | + KEEP(*(.exception.text)) |
||
449 | __exception_text_end = .; |
||
450 | IRQENTRY_TEXT |
||
451 | TEXT_TEXT |
||
452 | @@ -118,7 +118,7 @@ SECTIONS |
||
453 | __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { |
||
454 | __start___ex_table = .; |
||
455 | #ifdef CONFIG_MMU |
||
456 | - *(__ex_table) |
||
457 | + KEEP(*(__ex_table)) |
||
458 | #endif |
||
459 | __stop___ex_table = .; |
||
460 | } |
||
461 | @@ -130,12 +130,12 @@ SECTIONS |
||
462 | . = ALIGN(8); |
||
463 | .ARM.unwind_idx : { |
||
464 | __start_unwind_idx = .; |
||
465 | - *(.ARM.exidx*) |
||
466 | + KEEP(*(.ARM.exidx*)) |
||
467 | __stop_unwind_idx = .; |
||
468 | } |
||
469 | .ARM.unwind_tab : { |
||
470 | __start_unwind_tab = .; |
||
471 | - *(.ARM.extab*) |
||
472 | + KEEP(*(.ARM.extab*)) |
||
473 | __stop_unwind_tab = .; |
||
474 | } |
||
475 | #endif |
||
476 | @@ -154,14 +154,14 @@ SECTIONS |
||
477 | */ |
||
478 | __vectors_start = .; |
||
479 | .vectors 0 : AT(__vectors_start) { |
||
480 | - *(.vectors) |
||
481 | + KEEP(*(.vectors)) |
||
482 | } |
||
483 | . = __vectors_start + SIZEOF(.vectors); |
||
484 | __vectors_end = .; |
||
485 | |||
486 | __stubs_start = .; |
||
487 | .stubs 0x1000 : AT(__stubs_start) { |
||
488 | - *(.stubs) |
||
489 | + KEEP(*(.stubs)) |
||
490 | } |
||
491 | . = __stubs_start + SIZEOF(.stubs); |
||
492 | __stubs_end = .; |
||
493 | @@ -175,24 +175,24 @@ SECTIONS |
||
494 | } |
||
495 | .init.arch.info : { |
||
496 | __arch_info_begin = .; |
||
497 | - *(.arch.info.init) |
||
498 | + KEEP(*(.arch.info.init)) |
||
499 | __arch_info_end = .; |
||
500 | } |
||
501 | .init.tagtable : { |
||
502 | __tagtable_begin = .; |
||
503 | - *(.taglist.init) |
||
504 | + KEEP(*(.taglist.init)) |
||
505 | __tagtable_end = .; |
||
506 | } |
||
507 | #ifdef CONFIG_SMP_ON_UP |
||
508 | .init.smpalt : { |
||
509 | __smpalt_begin = .; |
||
510 | - *(.alt.smp.init) |
||
511 | + KEEP(*(.alt.smp.init)) |
||
512 | __smpalt_end = .; |
||
513 | } |
||
514 | #endif |
||
515 | .init.pv_table : { |
||
516 | __pv_table_begin = .; |
||
517 | - *(.pv_table) |
||
518 | + KEEP(*(.pv_table)) |
||
519 | __pv_table_end = .; |
||
520 | } |
||
521 | .init.data : { |
||
522 | --- a/arch/arm/boot/compressed/Makefile |
||
523 | +++ b/arch/arm/boot/compressed/Makefile |
||
524 | @@ -122,6 +122,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y) |
||
525 | ORIG_CFLAGS := $(KBUILD_CFLAGS) |
||
526 | KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS)) |
||
527 | endif |
||
528 | +KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL)) |
||
529 | |||
530 | ccflags-y := -fpic -mno-single-pic-base -fno-builtin -I$(obj) |
||
531 | asflags-y := -DZIMAGE |