Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
vmlinux.lds.h
Go to the documentation of this file.
1 /*
2  * Helper macros to support writing architecture specific
3  * linker scripts.
4  *
5  * A minimal linker scripts has following content:
6  * [This is a sample, architectures may have special requiriements]
7  *
8  * OUTPUT_FORMAT(...)
9  * OUTPUT_ARCH(...)
10  * ENTRY(...)
11  * SECTIONS
12  * {
13  * . = START;
14  * __init_begin = .;
15  * HEAD_TEXT_SECTION
16  * INIT_TEXT_SECTION(PAGE_SIZE)
17  * INIT_DATA_SECTION(...)
18  * PERCPU_SECTION(CACHELINE_SIZE)
19  * __init_end = .;
20  *
21  * _stext = .;
22  * TEXT_SECTION = 0
23  * _etext = .;
24  *
25  * _sdata = .;
26  * RO_DATA_SECTION(PAGE_SIZE)
27  * RW_DATA_SECTION(...)
28  * _edata = .;
29  *
30  * EXCEPTION_TABLE(...)
31  * NOTES
32  *
33  * BSS_SECTION(0, 0, 0)
34  * _end = .;
35  *
36  * STABS_DEBUG
37  * DWARF_DEBUG
38  *
39  * DISCARDS // must be the last
40  * }
41  *
42  * [__init_begin, __init_end] is the init section that may be freed after init
43  * [_stext, _etext] is the text section
44  * [_sdata, _edata] is the data section
45  *
46  * Some of the included output section have their own set of constants.
47  * Examples are: [__initramfs_start, __initramfs_end] for initramfs and
48  * [__nosave_begin, __nosave_end] for the nosave data
49  */
50 
51 #ifndef LOAD_OFFSET
52 #define LOAD_OFFSET 0
53 #endif
54 
55 #ifndef SYMBOL_PREFIX
56 #define VMLINUX_SYMBOL(sym) sym
57 #else
58 #define PASTE2(x,y) x##y
59 #define PASTE(x,y) PASTE2(x,y)
60 #define VMLINUX_SYMBOL(sym) PASTE(SYMBOL_PREFIX, sym)
61 #endif
62 
63 /* Align . to a 8 byte boundary equals to maximum function alignment. */
64 #define ALIGN_FUNCTION() . = ALIGN(8)
65 
66 /*
67  * Align to a 32 byte boundary equal to the
68  * alignment gcc 4.5 uses for a struct
69  */
70 #define STRUCT_ALIGNMENT 32
71 #define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT)
72 
73 /* The actual configuration determine if the init/exit sections
74  * are handled as text/data or they can be discarded (which
75  * often happens at runtime)
76  */
77 #ifdef CONFIG_HOTPLUG
78 #define DEV_KEEP(sec) *(.dev##sec)
79 #define DEV_DISCARD(sec)
80 #else
81 #define DEV_KEEP(sec)
82 #define DEV_DISCARD(sec) *(.dev##sec)
83 #endif
84 
85 #ifdef CONFIG_HOTPLUG_CPU
86 #define CPU_KEEP(sec) *(.cpu##sec)
87 #define CPU_DISCARD(sec)
88 #else
89 #define CPU_KEEP(sec)
90 #define CPU_DISCARD(sec) *(.cpu##sec)
91 #endif
92 
93 #if defined(CONFIG_MEMORY_HOTPLUG)
94 #define MEM_KEEP(sec) *(.mem##sec)
95 #define MEM_DISCARD(sec)
96 #else
97 #define MEM_KEEP(sec)
98 #define MEM_DISCARD(sec) *(.mem##sec)
99 #endif
100 
101 #ifdef CONFIG_FTRACE_MCOUNT_RECORD
102 #define MCOUNT_REC() . = ALIGN(8); \
103  VMLINUX_SYMBOL(__start_mcount_loc) = .; \
104  *(__mcount_loc) \
105  VMLINUX_SYMBOL(__stop_mcount_loc) = .;
106 #else
107 #define MCOUNT_REC()
108 #endif
109 
110 #ifdef CONFIG_TRACE_BRANCH_PROFILING
111 #define LIKELY_PROFILE() VMLINUX_SYMBOL(__start_annotated_branch_profile) = .; \
112  *(_ftrace_annotated_branch) \
113  VMLINUX_SYMBOL(__stop_annotated_branch_profile) = .;
114 #else
115 #define LIKELY_PROFILE()
116 #endif
117 
118 #ifdef CONFIG_PROFILE_ALL_BRANCHES
119 #define BRANCH_PROFILE() VMLINUX_SYMBOL(__start_branch_profile) = .; \
120  *(_ftrace_branch) \
121  VMLINUX_SYMBOL(__stop_branch_profile) = .;
122 #else
123 #define BRANCH_PROFILE()
124 #endif
125 
126 #ifdef CONFIG_EVENT_TRACING
127 #define FTRACE_EVENTS() . = ALIGN(8); \
128  VMLINUX_SYMBOL(__start_ftrace_events) = .; \
129  *(_ftrace_events) \
130  VMLINUX_SYMBOL(__stop_ftrace_events) = .;
131 #else
132 #define FTRACE_EVENTS()
133 #endif
134 
135 #ifdef CONFIG_TRACING
136 #define TRACE_PRINTKS() VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .; \
137  *(__trace_printk_fmt) /* Trace_printk fmt' pointer */ \
138  VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .;
139 #else
140 #define TRACE_PRINTKS()
141 #endif
142 
143 #ifdef CONFIG_FTRACE_SYSCALLS
144 #define TRACE_SYSCALLS() . = ALIGN(8); \
145  VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \
146  *(__syscalls_metadata) \
147  VMLINUX_SYMBOL(__stop_syscalls_metadata) = .;
148 #else
149 #define TRACE_SYSCALLS()
150 #endif
151 
152 
153 #define KERNEL_DTB() \
154  STRUCT_ALIGN(); \
155  VMLINUX_SYMBOL(__dtb_start) = .; \
156  *(.dtb.init.rodata) \
157  VMLINUX_SYMBOL(__dtb_end) = .;
158 
159 /* .data section */
160 #define DATA_DATA \
161  *(.data) \
162  *(.ref.data) \
163  *(.data..shared_aligned) /* percpu related */ \
164  DEV_KEEP(init.data) \
165  DEV_KEEP(exit.data) \
166  CPU_KEEP(init.data) \
167  CPU_KEEP(exit.data) \
168  MEM_KEEP(init.data) \
169  MEM_KEEP(exit.data) \
170  *(.data.unlikely) \
171  STRUCT_ALIGN(); \
172  *(__tracepoints) \
173  /* implement dynamic printk debug */ \
174  . = ALIGN(8); \
175  VMLINUX_SYMBOL(__start___jump_table) = .; \
176  *(__jump_table) \
177  VMLINUX_SYMBOL(__stop___jump_table) = .; \
178  . = ALIGN(8); \
179  VMLINUX_SYMBOL(__start___verbose) = .; \
180  *(__verbose) \
181  VMLINUX_SYMBOL(__stop___verbose) = .; \
182  LIKELY_PROFILE() \
183  BRANCH_PROFILE() \
184  TRACE_PRINTKS()
185 
186 /*
187  * Data section helpers
188  */
189 #define NOSAVE_DATA \
190  . = ALIGN(PAGE_SIZE); \
191  VMLINUX_SYMBOL(__nosave_begin) = .; \
192  *(.data..nosave) \
193  . = ALIGN(PAGE_SIZE); \
194  VMLINUX_SYMBOL(__nosave_end) = .;
195 
196 #define PAGE_ALIGNED_DATA(page_align) \
197  . = ALIGN(page_align); \
198  *(.data..page_aligned)
199 
200 #define READ_MOSTLY_DATA(align) \
201  . = ALIGN(align); \
202  *(.data..read_mostly) \
203  . = ALIGN(align);
204 
205 #define CACHELINE_ALIGNED_DATA(align) \
206  . = ALIGN(align); \
207  *(.data..cacheline_aligned)
208 
209 #define INIT_TASK_DATA(align) \
210  . = ALIGN(align); \
211  *(.data..init_task)
212 
213 /*
214  * Read only Data
215  */
216 #define RO_DATA_SECTION(align) \
217  . = ALIGN((align)); \
218  .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \
219  VMLINUX_SYMBOL(__start_rodata) = .; \
220  *(.rodata) *(.rodata.*) \
221  *(__vermagic) /* Kernel version magic */ \
222  . = ALIGN(8); \
223  VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .; \
224  *(__tracepoints_ptrs) /* Tracepoints: pointer array */\
225  VMLINUX_SYMBOL(__stop___tracepoints_ptrs) = .; \
226  *(__tracepoints_strings)/* Tracepoints: strings */ \
227  } \
228  \
229  .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \
230  *(.rodata1) \
231  } \
232  \
233  BUG_TABLE \
234  \
235  /* PCI quirks */ \
236  .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \
237  VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \
238  *(.pci_fixup_early) \
239  VMLINUX_SYMBOL(__end_pci_fixups_early) = .; \
240  VMLINUX_SYMBOL(__start_pci_fixups_header) = .; \
241  *(.pci_fixup_header) \
242  VMLINUX_SYMBOL(__end_pci_fixups_header) = .; \
243  VMLINUX_SYMBOL(__start_pci_fixups_final) = .; \
244  *(.pci_fixup_final) \
245  VMLINUX_SYMBOL(__end_pci_fixups_final) = .; \
246  VMLINUX_SYMBOL(__start_pci_fixups_enable) = .; \
247  *(.pci_fixup_enable) \
248  VMLINUX_SYMBOL(__end_pci_fixups_enable) = .; \
249  VMLINUX_SYMBOL(__start_pci_fixups_resume) = .; \
250  *(.pci_fixup_resume) \
251  VMLINUX_SYMBOL(__end_pci_fixups_resume) = .; \
252  VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .; \
253  *(.pci_fixup_resume_early) \
254  VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .; \
255  VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .; \
256  *(.pci_fixup_suspend) \
257  VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .; \
258  } \
259  \
260  /* Built-in firmware blobs */ \
261  .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \
262  VMLINUX_SYMBOL(__start_builtin_fw) = .; \
263  *(.builtin_fw) \
264  VMLINUX_SYMBOL(__end_builtin_fw) = .; \
265  } \
266  \
267  /* RapidIO route ops */ \
268  .rio_ops : AT(ADDR(.rio_ops) - LOAD_OFFSET) { \
269  VMLINUX_SYMBOL(__start_rio_switch_ops) = .; \
270  *(.rio_switch_ops) \
271  VMLINUX_SYMBOL(__end_rio_switch_ops) = .; \
272  } \
273  \
274  TRACEDATA \
275  \
276  /* Kernel symbol table: Normal symbols */ \
277  __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
278  VMLINUX_SYMBOL(__start___ksymtab) = .; \
279  *(SORT(___ksymtab+*)) \
280  VMLINUX_SYMBOL(__stop___ksymtab) = .; \
281  } \
282  \
283  /* Kernel symbol table: GPL-only symbols */ \
284  __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \
285  VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \
286  *(SORT(___ksymtab_gpl+*)) \
287  VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \
288  } \
289  \
290  /* Kernel symbol table: Normal unused symbols */ \
291  __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \
292  VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \
293  *(SORT(___ksymtab_unused+*)) \
294  VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \
295  } \
296  \
297  /* Kernel symbol table: GPL-only unused symbols */ \
298  __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \
299  VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \
300  *(SORT(___ksymtab_unused_gpl+*)) \
301  VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \
302  } \
303  \
304  /* Kernel symbol table: GPL-future-only symbols */ \
305  __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \
306  VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \
307  *(SORT(___ksymtab_gpl_future+*)) \
308  VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \
309  } \
310  \
311  /* Kernel symbol table: Normal symbols */ \
312  __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \
313  VMLINUX_SYMBOL(__start___kcrctab) = .; \
314  *(SORT(___kcrctab+*)) \
315  VMLINUX_SYMBOL(__stop___kcrctab) = .; \
316  } \
317  \
318  /* Kernel symbol table: GPL-only symbols */ \
319  __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \
320  VMLINUX_SYMBOL(__start___kcrctab_gpl) = .; \
321  *(SORT(___kcrctab_gpl+*)) \
322  VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \
323  } \
324  \
325  /* Kernel symbol table: Normal unused symbols */ \
326  __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \
327  VMLINUX_SYMBOL(__start___kcrctab_unused) = .; \
328  *(SORT(___kcrctab_unused+*)) \
329  VMLINUX_SYMBOL(__stop___kcrctab_unused) = .; \
330  } \
331  \
332  /* Kernel symbol table: GPL-only unused symbols */ \
333  __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \
334  VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \
335  *(SORT(___kcrctab_unused_gpl+*)) \
336  VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .; \
337  } \
338  \
339  /* Kernel symbol table: GPL-future-only symbols */ \
340  __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \
341  VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \
342  *(SORT(___kcrctab_gpl_future+*)) \
343  VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \
344  } \
345  \
346  /* Kernel symbol table: strings */ \
347  __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
348  *(__ksymtab_strings) \
349  } \
350  \
351  /* __*init sections */ \
352  __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) { \
353  *(.ref.rodata) \
354  DEV_KEEP(init.rodata) \
355  DEV_KEEP(exit.rodata) \
356  CPU_KEEP(init.rodata) \
357  CPU_KEEP(exit.rodata) \
358  MEM_KEEP(init.rodata) \
359  MEM_KEEP(exit.rodata) \
360  } \
361  \
362  /* Built-in module parameters. */ \
363  __param : AT(ADDR(__param) - LOAD_OFFSET) { \
364  VMLINUX_SYMBOL(__start___param) = .; \
365  *(__param) \
366  VMLINUX_SYMBOL(__stop___param) = .; \
367  } \
368  \
369  /* Built-in module versions. */ \
370  __modver : AT(ADDR(__modver) - LOAD_OFFSET) { \
371  VMLINUX_SYMBOL(__start___modver) = .; \
372  *(__modver) \
373  VMLINUX_SYMBOL(__stop___modver) = .; \
374  . = ALIGN((align)); \
375  VMLINUX_SYMBOL(__end_rodata) = .; \
376  } \
377  . = ALIGN((align));
378 
379 /* RODATA & RO_DATA provided for backward compatibility.
380  * All archs are supposed to use RO_DATA() */
381 #define RODATA RO_DATA_SECTION(4096)
382 #define RO_DATA(align) RO_DATA_SECTION(align)
383 
384 #define SECURITY_INIT \
385  .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \
386  VMLINUX_SYMBOL(__security_initcall_start) = .; \
387  *(.security_initcall.init) \
388  VMLINUX_SYMBOL(__security_initcall_end) = .; \
389  }
390 
391 /* .text section. Map to function alignment to avoid address changes
392  * during second ld run in second ld pass when generating System.map */
393 #define TEXT_TEXT \
394  ALIGN_FUNCTION(); \
395  *(.text.hot) \
396  *(.text) \
397  *(.ref.text) \
398  DEV_KEEP(init.text) \
399  DEV_KEEP(exit.text) \
400  CPU_KEEP(init.text) \
401  CPU_KEEP(exit.text) \
402  MEM_KEEP(init.text) \
403  MEM_KEEP(exit.text) \
404  *(.text.unlikely)
405 
406 
407 /* sched.text is aling to function alignment to secure we have same
408  * address even at second ld pass when generating System.map */
409 #define SCHED_TEXT \
410  ALIGN_FUNCTION(); \
411  VMLINUX_SYMBOL(__sched_text_start) = .; \
412  *(.sched.text) \
413  VMLINUX_SYMBOL(__sched_text_end) = .;
414 
415 /* spinlock.text is aling to function alignment to secure we have same
416  * address even at second ld pass when generating System.map */
417 #define LOCK_TEXT \
418  ALIGN_FUNCTION(); \
419  VMLINUX_SYMBOL(__lock_text_start) = .; \
420  *(.spinlock.text) \
421  VMLINUX_SYMBOL(__lock_text_end) = .;
422 
423 #define KPROBES_TEXT \
424  ALIGN_FUNCTION(); \
425  VMLINUX_SYMBOL(__kprobes_text_start) = .; \
426  *(.kprobes.text) \
427  VMLINUX_SYMBOL(__kprobes_text_end) = .;
428 
429 #define ENTRY_TEXT \
430  ALIGN_FUNCTION(); \
431  VMLINUX_SYMBOL(__entry_text_start) = .; \
432  *(.entry.text) \
433  VMLINUX_SYMBOL(__entry_text_end) = .;
434 
435 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
436 #define IRQENTRY_TEXT \
437  ALIGN_FUNCTION(); \
438  VMLINUX_SYMBOL(__irqentry_text_start) = .; \
439  *(.irqentry.text) \
440  VMLINUX_SYMBOL(__irqentry_text_end) = .;
441 #else
442 #define IRQENTRY_TEXT
443 #endif
444 
445 /* Section used for early init (in .S files) */
446 #define HEAD_TEXT *(.head.text)
447 
448 #define HEAD_TEXT_SECTION \
449  .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) { \
450  HEAD_TEXT \
451  }
452 
453 /*
454  * Exception table
455  */
456 #define EXCEPTION_TABLE(align) \
457  . = ALIGN(align); \
458  __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \
459  VMLINUX_SYMBOL(__start___ex_table) = .; \
460  *(__ex_table) \
461  VMLINUX_SYMBOL(__stop___ex_table) = .; \
462  }
463 
464 /*
465  * Init task
466  */
467 #define INIT_TASK_DATA_SECTION(align) \
468  . = ALIGN(align); \
469  .data..init_task : AT(ADDR(.data..init_task) - LOAD_OFFSET) { \
470  INIT_TASK_DATA(align) \
471  }
472 
473 #ifdef CONFIG_CONSTRUCTORS
474 #define KERNEL_CTORS() . = ALIGN(8); \
475  VMLINUX_SYMBOL(__ctors_start) = .; \
476  *(.ctors) \
477  VMLINUX_SYMBOL(__ctors_end) = .;
478 #else
479 #define KERNEL_CTORS()
480 #endif
481 
482 /* init and exit section handling */
483 #define INIT_DATA \
484  *(.init.data) \
485  DEV_DISCARD(init.data) \
486  CPU_DISCARD(init.data) \
487  MEM_DISCARD(init.data) \
488  KERNEL_CTORS() \
489  MCOUNT_REC() \
490  *(.init.rodata) \
491  FTRACE_EVENTS() \
492  TRACE_SYSCALLS() \
493  DEV_DISCARD(init.rodata) \
494  CPU_DISCARD(init.rodata) \
495  MEM_DISCARD(init.rodata) \
496  KERNEL_DTB()
497 
498 #define INIT_TEXT \
499  *(.init.text) \
500  DEV_DISCARD(init.text) \
501  CPU_DISCARD(init.text) \
502  MEM_DISCARD(init.text)
503 
504 #define EXIT_DATA \
505  *(.exit.data) \
506  DEV_DISCARD(exit.data) \
507  DEV_DISCARD(exit.rodata) \
508  CPU_DISCARD(exit.data) \
509  CPU_DISCARD(exit.rodata) \
510  MEM_DISCARD(exit.data) \
511  MEM_DISCARD(exit.rodata)
512 
513 #define EXIT_TEXT \
514  *(.exit.text) \
515  DEV_DISCARD(exit.text) \
516  CPU_DISCARD(exit.text) \
517  MEM_DISCARD(exit.text)
518 
519 #define EXIT_CALL \
520  *(.exitcall.exit)
521 
522 /*
523  * bss (Block Started by Symbol) - uninitialized data
524  * zeroed during startup
525  */
526 #define SBSS(sbss_align) \
527  . = ALIGN(sbss_align); \
528  .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \
529  *(.sbss) \
530  *(.scommon) \
531  }
532 
533 /*
534  * Allow archectures to redefine BSS_FIRST_SECTIONS to add extra
535  * sections to the front of bss.
536  */
537 #ifndef BSS_FIRST_SECTIONS
538 #define BSS_FIRST_SECTIONS
539 #endif
540 
541 #define BSS(bss_align) \
542  . = ALIGN(bss_align); \
543  .bss : AT(ADDR(.bss) - LOAD_OFFSET) { \
544  BSS_FIRST_SECTIONS \
545  *(.bss..page_aligned) \
546  *(.dynbss) \
547  *(.bss) \
548  *(COMMON) \
549  }
550 
551 /*
552  * DWARF debug sections.
553  * Symbols in the DWARF debugging sections are relative to
554  * the beginning of the section so we begin them at 0.
555  */
556 #define DWARF_DEBUG \
557  /* DWARF 1 */ \
558  .debug 0 : { *(.debug) } \
559  .line 0 : { *(.line) } \
560  /* GNU DWARF 1 extensions */ \
561  .debug_srcinfo 0 : { *(.debug_srcinfo) } \
562  .debug_sfnames 0 : { *(.debug_sfnames) } \
563  /* DWARF 1.1 and DWARF 2 */ \
564  .debug_aranges 0 : { *(.debug_aranges) } \
565  .debug_pubnames 0 : { *(.debug_pubnames) } \
566  /* DWARF 2 */ \
567  .debug_info 0 : { *(.debug_info \
568  .gnu.linkonce.wi.*) } \
569  .debug_abbrev 0 : { *(.debug_abbrev) } \
570  .debug_line 0 : { *(.debug_line) } \
571  .debug_frame 0 : { *(.debug_frame) } \
572  .debug_str 0 : { *(.debug_str) } \
573  .debug_loc 0 : { *(.debug_loc) } \
574  .debug_macinfo 0 : { *(.debug_macinfo) } \
575  /* SGI/MIPS DWARF 2 extensions */ \
576  .debug_weaknames 0 : { *(.debug_weaknames) } \
577  .debug_funcnames 0 : { *(.debug_funcnames) } \
578  .debug_typenames 0 : { *(.debug_typenames) } \
579  .debug_varnames 0 : { *(.debug_varnames) } \
580 
581  /* Stabs debugging sections. */
582 #define STABS_DEBUG \
583  .stab 0 : { *(.stab) } \
584  .stabstr 0 : { *(.stabstr) } \
585  .stab.excl 0 : { *(.stab.excl) } \
586  .stab.exclstr 0 : { *(.stab.exclstr) } \
587  .stab.index 0 : { *(.stab.index) } \
588  .stab.indexstr 0 : { *(.stab.indexstr) } \
589  .comment 0 : { *(.comment) }
590 
591 #ifdef CONFIG_GENERIC_BUG
592 #define BUG_TABLE \
593  . = ALIGN(8); \
594  __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \
595  VMLINUX_SYMBOL(__start___bug_table) = .; \
596  *(__bug_table) \
597  VMLINUX_SYMBOL(__stop___bug_table) = .; \
598  }
599 #else
600 #define BUG_TABLE
601 #endif
602 
603 #ifdef CONFIG_PM_TRACE
604 #define TRACEDATA \
605  . = ALIGN(4); \
606  .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \
607  VMLINUX_SYMBOL(__tracedata_start) = .; \
608  *(.tracedata) \
609  VMLINUX_SYMBOL(__tracedata_end) = .; \
610  }
611 #else
612 #define TRACEDATA
613 #endif
614 
615 #define NOTES \
616  .notes : AT(ADDR(.notes) - LOAD_OFFSET) { \
617  VMLINUX_SYMBOL(__start_notes) = .; \
618  *(.note.*) \
619  VMLINUX_SYMBOL(__stop_notes) = .; \
620  }
621 
622 #define INIT_SETUP(initsetup_align) \
623  . = ALIGN(initsetup_align); \
624  VMLINUX_SYMBOL(__setup_start) = .; \
625  *(.init.setup) \
626  VMLINUX_SYMBOL(__setup_end) = .;
627 
628 #define INIT_CALLS_LEVEL(level) \
629  VMLINUX_SYMBOL(__initcall##level##_start) = .; \
630  *(.initcall##level##.init) \
631  *(.initcall##level##s.init) \
632 
633 #define INIT_CALLS \
634  VMLINUX_SYMBOL(__initcall_start) = .; \
635  *(.initcallearly.init) \
636  INIT_CALLS_LEVEL(0) \
637  INIT_CALLS_LEVEL(1) \
638  INIT_CALLS_LEVEL(2) \
639  INIT_CALLS_LEVEL(3) \
640  INIT_CALLS_LEVEL(4) \
641  INIT_CALLS_LEVEL(5) \
642  INIT_CALLS_LEVEL(rootfs) \
643  INIT_CALLS_LEVEL(6) \
644  INIT_CALLS_LEVEL(7) \
645  VMLINUX_SYMBOL(__initcall_end) = .;
646 
647 #define CON_INITCALL \
648  VMLINUX_SYMBOL(__con_initcall_start) = .; \
649  *(.con_initcall.init) \
650  VMLINUX_SYMBOL(__con_initcall_end) = .;
651 
652 #define SECURITY_INITCALL \
653  VMLINUX_SYMBOL(__security_initcall_start) = .; \
654  *(.security_initcall.init) \
655  VMLINUX_SYMBOL(__security_initcall_end) = .;
656 
657 #ifdef CONFIG_BLK_DEV_INITRD
658 #define INIT_RAM_FS \
659  . = ALIGN(4); \
660  VMLINUX_SYMBOL(__initramfs_start) = .; \
661  *(.init.ramfs) \
662  . = ALIGN(8); \
663  *(.init.ramfs.info)
664 #else
665 #define INIT_RAM_FS
666 #endif
667 
668 /*
669  * Default discarded sections.
670  *
671  * Some archs want to discard exit text/data at runtime rather than
672  * link time due to cross-section references such as alt instructions,
673  * bug table, eh_frame, etc. DISCARDS must be the last of output
674  * section definitions so that such archs put those in earlier section
675  * definitions.
676  */
677 #define DISCARDS \
678  /DISCARD/ : { \
679  EXIT_TEXT \
680  EXIT_DATA \
681  EXIT_CALL \
682  *(.discard) \
683  *(.discard.*) \
684  }
685 
696 #define PERCPU_INPUT(cacheline) \
697  VMLINUX_SYMBOL(__per_cpu_start) = .; \
698  *(.data..percpu..first) \
699  . = ALIGN(PAGE_SIZE); \
700  *(.data..percpu..page_aligned) \
701  . = ALIGN(cacheline); \
702  *(.data..percpu..readmostly) \
703  . = ALIGN(cacheline); \
704  *(.data..percpu) \
705  *(.data..percpu..shared_aligned) \
706  VMLINUX_SYMBOL(__per_cpu_end) = .;
707 
732 #define PERCPU_VADDR(cacheline, vaddr, phdr) \
733  VMLINUX_SYMBOL(__per_cpu_load) = .; \
734  .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \
735  - LOAD_OFFSET) { \
736  PERCPU_INPUT(cacheline) \
737  } phdr \
738  . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data..percpu);
739 
752 #define PERCPU_SECTION(cacheline) \
753  . = ALIGN(PAGE_SIZE); \
754  .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \
755  VMLINUX_SYMBOL(__per_cpu_load) = .; \
756  PERCPU_INPUT(cacheline) \
757  }
758 
759 
760 /*
761  * Definition of the high level *_SECTION macros
762  * They will fit only a subset of the architectures
763  */
764 
765 
766 /*
767  * Writeable data.
768  * All sections are combined in a single .data section.
769  * The sections following CONSTRUCTORS are arranged so their
770  * typical alignment matches.
771  * A cacheline is typical/always less than a PAGE_SIZE so
772  * the sections that has this restriction (or similar)
773  * is located before the ones requiring PAGE_SIZE alignment.
774  * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which
775  * matches the requirement of PAGE_ALIGNED_DATA.
776  *
777  * use 0 as page_align if page_aligned data is not used */
778 #define RW_DATA_SECTION(cacheline, pagealigned, inittask) \
779  . = ALIGN(PAGE_SIZE); \
780  .data : AT(ADDR(.data) - LOAD_OFFSET) { \
781  INIT_TASK_DATA(inittask) \
782  NOSAVE_DATA \
783  PAGE_ALIGNED_DATA(pagealigned) \
784  CACHELINE_ALIGNED_DATA(cacheline) \
785  READ_MOSTLY_DATA(cacheline) \
786  DATA_DATA \
787  CONSTRUCTORS \
788  }
789 
790 #define INIT_TEXT_SECTION(inittext_align) \
791  . = ALIGN(inittext_align); \
792  .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { \
793  VMLINUX_SYMBOL(_sinittext) = .; \
794  INIT_TEXT \
795  VMLINUX_SYMBOL(_einittext) = .; \
796  }
797 
798 #define INIT_DATA_SECTION(initsetup_align) \
799  .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { \
800  INIT_DATA \
801  INIT_SETUP(initsetup_align) \
802  INIT_CALLS \
803  CON_INITCALL \
804  SECURITY_INITCALL \
805  INIT_RAM_FS \
806  }
807 
808 #define BSS_SECTION(sbss_align, bss_align, stop_align) \
809  . = ALIGN(sbss_align); \
810  VMLINUX_SYMBOL(__bss_start) = .; \
811  SBSS(sbss_align) \
812  BSS(bss_align) \
813  . = ALIGN(stop_align); \
814  VMLINUX_SYMBOL(__bss_stop) = .;