linux/include/asm-generic/vmlinux.lds.h
<<
>>
Prefs
   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        STRUCT_ALIGN();                                                 \
 171        *(__tracepoints)                                                \
 172        /* implement dynamic printk debug */                            \
 173        . = ALIGN(8);                                                   \
 174        VMLINUX_SYMBOL(__start___jump_table) = .;                       \
 175        *(__jump_table)                                                 \
 176        VMLINUX_SYMBOL(__stop___jump_table) = .;                        \
 177        . = ALIGN(8);                                                   \
 178        VMLINUX_SYMBOL(__start___verbose) = .;                          \
 179        *(__verbose)                                                    \
 180        VMLINUX_SYMBOL(__stop___verbose) = .;                           \
 181        LIKELY_PROFILE()                                                \
 182        BRANCH_PROFILE()                                                \
 183        TRACE_PRINTKS()
 184
 185/*
 186 * Data section helpers
 187 */
 188#define NOSAVE_DATA                                                     \
 189        . = ALIGN(PAGE_SIZE);                                           \
 190        VMLINUX_SYMBOL(__nosave_begin) = .;                             \
 191        *(.data..nosave)                                                \
 192        . = ALIGN(PAGE_SIZE);                                           \
 193        VMLINUX_SYMBOL(__nosave_end) = .;
 194
 195#define PAGE_ALIGNED_DATA(page_align)                                   \
 196        . = ALIGN(page_align);                                          \
 197        *(.data..page_aligned)
 198
 199#define READ_MOSTLY_DATA(align)                                         \
 200        . = ALIGN(align);                                               \
 201        *(.data..read_mostly)                                           \
 202        . = ALIGN(align);
 203
 204#define CACHELINE_ALIGNED_DATA(align)                                   \
 205        . = ALIGN(align);                                               \
 206        *(.data..cacheline_aligned)
 207
 208#define INIT_TASK_DATA(align)                                           \
 209        . = ALIGN(align);                                               \
 210        *(.data..init_task)
 211
 212/*
 213 * Read only Data
 214 */
 215#define RO_DATA_SECTION(align)                                          \
 216        . = ALIGN((align));                                             \
 217        .rodata           : AT(ADDR(.rodata) - LOAD_OFFSET) {           \
 218                VMLINUX_SYMBOL(__start_rodata) = .;                     \
 219                *(.rodata) *(.rodata.*)                                 \
 220                *(__vermagic)           /* Kernel version magic */      \
 221                . = ALIGN(8);                                           \
 222                VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .;         \
 223                *(__tracepoints_ptrs)   /* Tracepoints: pointer array */\
 224                VMLINUX_SYMBOL(__stop___tracepoints_ptrs) = .;          \
 225                *(__tracepoints_strings)/* Tracepoints: strings */      \
 226        }                                                               \
 227                                                                        \
 228        .rodata1          : AT(ADDR(.rodata1) - LOAD_OFFSET) {          \
 229                *(.rodata1)                                             \
 230        }                                                               \
 231                                                                        \
 232        BUG_TABLE                                                       \
 233                                                                        \
 234        /* PCI quirks */                                                \
 235        .pci_fixup        : AT(ADDR(.pci_fixup) - LOAD_OFFSET) {        \
 236                VMLINUX_SYMBOL(__start_pci_fixups_early) = .;           \
 237                *(.pci_fixup_early)                                     \
 238                VMLINUX_SYMBOL(__end_pci_fixups_early) = .;             \
 239                VMLINUX_SYMBOL(__start_pci_fixups_header) = .;          \
 240                *(.pci_fixup_header)                                    \
 241                VMLINUX_SYMBOL(__end_pci_fixups_header) = .;            \
 242                VMLINUX_SYMBOL(__start_pci_fixups_final) = .;           \
 243                *(.pci_fixup_final)                                     \
 244                VMLINUX_SYMBOL(__end_pci_fixups_final) = .;             \
 245                VMLINUX_SYMBOL(__start_pci_fixups_enable) = .;          \
 246                *(.pci_fixup_enable)                                    \
 247                VMLINUX_SYMBOL(__end_pci_fixups_enable) = .;            \
 248                VMLINUX_SYMBOL(__start_pci_fixups_resume) = .;          \
 249                *(.pci_fixup_resume)                                    \
 250                VMLINUX_SYMBOL(__end_pci_fixups_resume) = .;            \
 251                VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .;    \
 252                *(.pci_fixup_resume_early)                              \
 253                VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .;      \
 254                VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .;         \
 255                *(.pci_fixup_suspend)                                   \
 256                VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .;           \
 257        }                                                               \
 258                                                                        \
 259        /* Built-in firmware blobs */                                   \
 260        .builtin_fw        : AT(ADDR(.builtin_fw) - LOAD_OFFSET) {      \
 261                VMLINUX_SYMBOL(__start_builtin_fw) = .;                 \
 262                *(.builtin_fw)                                          \
 263                VMLINUX_SYMBOL(__end_builtin_fw) = .;                   \
 264        }                                                               \
 265                                                                        \
 266        /* RapidIO route ops */                                         \
 267        .rio_ops        : AT(ADDR(.rio_ops) - LOAD_OFFSET) {            \
 268                VMLINUX_SYMBOL(__start_rio_switch_ops) = .;             \
 269                *(.rio_switch_ops)                                      \
 270                VMLINUX_SYMBOL(__end_rio_switch_ops) = .;               \
 271        }                                                               \
 272                                                                        \
 273        TRACEDATA                                                       \
 274                                                                        \
 275        /* Kernel symbol table: Normal symbols */                       \
 276        __ksymtab         : AT(ADDR(__ksymtab) - LOAD_OFFSET) {         \
 277                VMLINUX_SYMBOL(__start___ksymtab) = .;                  \
 278                *(SORT(___ksymtab+*))                                   \
 279                VMLINUX_SYMBOL(__stop___ksymtab) = .;                   \
 280        }                                                               \
 281                                                                        \
 282        /* Kernel symbol table: GPL-only symbols */                     \
 283        __ksymtab_gpl     : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) {     \
 284                VMLINUX_SYMBOL(__start___ksymtab_gpl) = .;              \
 285                *(SORT(___ksymtab_gpl+*))                               \
 286                VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .;               \
 287        }                                                               \
 288                                                                        \
 289        /* Kernel symbol table: Normal unused symbols */                \
 290        __ksymtab_unused  : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) {  \
 291                VMLINUX_SYMBOL(__start___ksymtab_unused) = .;           \
 292                *(SORT(___ksymtab_unused+*))                            \
 293                VMLINUX_SYMBOL(__stop___ksymtab_unused) = .;            \
 294        }                                                               \
 295                                                                        \
 296        /* Kernel symbol table: GPL-only unused symbols */              \
 297        __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \
 298                VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .;       \
 299                *(SORT(___ksymtab_unused_gpl+*))                        \
 300                VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .;        \
 301        }                                                               \
 302                                                                        \
 303        /* Kernel symbol table: GPL-future-only symbols */              \
 304        __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \
 305                VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .;       \
 306                *(SORT(___ksymtab_gpl_future+*))                        \
 307                VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .;        \
 308        }                                                               \
 309                                                                        \
 310        /* Kernel symbol table: Normal symbols */                       \
 311        __kcrctab         : AT(ADDR(__kcrctab) - LOAD_OFFSET) {         \
 312                VMLINUX_SYMBOL(__start___kcrctab) = .;                  \
 313                *(SORT(___kcrctab+*))                                   \
 314                VMLINUX_SYMBOL(__stop___kcrctab) = .;                   \
 315        }                                                               \
 316                                                                        \
 317        /* Kernel symbol table: GPL-only symbols */                     \
 318        __kcrctab_gpl     : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) {     \
 319                VMLINUX_SYMBOL(__start___kcrctab_gpl) = .;              \
 320                *(SORT(___kcrctab_gpl+*))                               \
 321                VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .;               \
 322        }                                                               \
 323                                                                        \
 324        /* Kernel symbol table: Normal unused symbols */                \
 325        __kcrctab_unused  : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) {  \
 326                VMLINUX_SYMBOL(__start___kcrctab_unused) = .;           \
 327                *(SORT(___kcrctab_unused+*))                            \
 328                VMLINUX_SYMBOL(__stop___kcrctab_unused) = .;            \
 329        }                                                               \
 330                                                                        \
 331        /* Kernel symbol table: GPL-only unused symbols */              \
 332        __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \
 333                VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .;       \
 334                *(SORT(___kcrctab_unused_gpl+*))                        \
 335                VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .;        \
 336        }                                                               \
 337                                                                        \
 338        /* Kernel symbol table: GPL-future-only symbols */              \
 339        __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \
 340                VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .;       \
 341                *(SORT(___kcrctab_gpl_future+*))                        \
 342                VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .;        \
 343        }                                                               \
 344                                                                        \
 345        /* Kernel symbol table: strings */                              \
 346        __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
 347                *(__ksymtab_strings)                                    \
 348        }                                                               \
 349                                                                        \
 350        /* __*init sections */                                          \
 351        __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) {         \
 352                *(.ref.rodata)                                          \
 353                DEV_KEEP(init.rodata)                                   \
 354                DEV_KEEP(exit.rodata)                                   \
 355                CPU_KEEP(init.rodata)                                   \
 356                CPU_KEEP(exit.rodata)                                   \
 357                MEM_KEEP(init.rodata)                                   \
 358                MEM_KEEP(exit.rodata)                                   \
 359        }                                                               \
 360                                                                        \
 361        /* Built-in module parameters. */                               \
 362        __param : AT(ADDR(__param) - LOAD_OFFSET) {                     \
 363                VMLINUX_SYMBOL(__start___param) = .;                    \
 364                *(__param)                                              \
 365                VMLINUX_SYMBOL(__stop___param) = .;                     \
 366        }                                                               \
 367                                                                        \
 368        /* Built-in module versions. */                                 \
 369        __modver : AT(ADDR(__modver) - LOAD_OFFSET) {                   \
 370                VMLINUX_SYMBOL(__start___modver) = .;                   \
 371                *(__modver)                                             \
 372                VMLINUX_SYMBOL(__stop___modver) = .;                    \
 373                . = ALIGN((align));                                     \
 374                VMLINUX_SYMBOL(__end_rodata) = .;                       \
 375        }                                                               \
 376        . = ALIGN((align));
 377
 378/* RODATA & RO_DATA provided for backward compatibility.
 379 * All archs are supposed to use RO_DATA() */
 380#define RODATA          RO_DATA_SECTION(4096)
 381#define RO_DATA(align)  RO_DATA_SECTION(align)
 382
 383#define SECURITY_INIT                                                   \
 384        .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \
 385                VMLINUX_SYMBOL(__security_initcall_start) = .;          \
 386                *(.security_initcall.init)                              \
 387                VMLINUX_SYMBOL(__security_initcall_end) = .;            \
 388        }
 389
 390/* .text section. Map to function alignment to avoid address changes
 391 * during second ld run in second ld pass when generating System.map */
 392#define TEXT_TEXT                                                       \
 393                ALIGN_FUNCTION();                                       \
 394                *(.text.hot)                                            \
 395                *(.text)                                                \
 396                *(.ref.text)                                            \
 397        DEV_KEEP(init.text)                                             \
 398        DEV_KEEP(exit.text)                                             \
 399        CPU_KEEP(init.text)                                             \
 400        CPU_KEEP(exit.text)                                             \
 401        MEM_KEEP(init.text)                                             \
 402        MEM_KEEP(exit.text)                                             \
 403                *(.text.unlikely)
 404
 405
 406/* sched.text is aling to function alignment to secure we have same
 407 * address even at second ld pass when generating System.map */
 408#define SCHED_TEXT                                                      \
 409                ALIGN_FUNCTION();                                       \
 410                VMLINUX_SYMBOL(__sched_text_start) = .;                 \
 411                *(.sched.text)                                          \
 412                VMLINUX_SYMBOL(__sched_text_end) = .;
 413
 414/* spinlock.text is aling to function alignment to secure we have same
 415 * address even at second ld pass when generating System.map */
 416#define LOCK_TEXT                                                       \
 417                ALIGN_FUNCTION();                                       \
 418                VMLINUX_SYMBOL(__lock_text_start) = .;                  \
 419                *(.spinlock.text)                                       \
 420                VMLINUX_SYMBOL(__lock_text_end) = .;
 421
 422#define KPROBES_TEXT                                                    \
 423                ALIGN_FUNCTION();                                       \
 424                VMLINUX_SYMBOL(__kprobes_text_start) = .;               \
 425                *(.kprobes.text)                                        \
 426                VMLINUX_SYMBOL(__kprobes_text_end) = .;
 427
 428#define ENTRY_TEXT                                                      \
 429                ALIGN_FUNCTION();                                       \
 430                VMLINUX_SYMBOL(__entry_text_start) = .;                 \
 431                *(.entry.text)                                          \
 432                VMLINUX_SYMBOL(__entry_text_end) = .;
 433
 434#ifdef CONFIG_FUNCTION_GRAPH_TRACER
 435#define IRQENTRY_TEXT                                                   \
 436                ALIGN_FUNCTION();                                       \
 437                VMLINUX_SYMBOL(__irqentry_text_start) = .;              \
 438                *(.irqentry.text)                                       \
 439                VMLINUX_SYMBOL(__irqentry_text_end) = .;
 440#else
 441#define IRQENTRY_TEXT
 442#endif
 443
 444/* Section used for early init (in .S files) */
 445#define HEAD_TEXT  *(.head.text)
 446
 447#define HEAD_TEXT_SECTION                                                       \
 448        .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) {               \
 449                HEAD_TEXT                                               \
 450        }
 451
 452/*
 453 * Exception table
 454 */
 455#define EXCEPTION_TABLE(align)                                          \
 456        . = ALIGN(align);                                               \
 457        __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {               \
 458                VMLINUX_SYMBOL(__start___ex_table) = .;                 \
 459                *(__ex_table)                                           \
 460                VMLINUX_SYMBOL(__stop___ex_table) = .;                  \
 461        }
 462
 463/*
 464 * Init task
 465 */
 466#define INIT_TASK_DATA_SECTION(align)                                   \
 467        . = ALIGN(align);                                               \
 468        .data..init_task :  AT(ADDR(.data..init_task) - LOAD_OFFSET) {  \
 469                INIT_TASK_DATA(align)                                   \
 470        }
 471
 472#ifdef CONFIG_CONSTRUCTORS
 473#define KERNEL_CTORS()  . = ALIGN(8);                      \
 474                        VMLINUX_SYMBOL(__ctors_start) = .; \
 475                        *(.ctors)                          \
 476                        VMLINUX_SYMBOL(__ctors_end) = .;
 477#else
 478#define KERNEL_CTORS()
 479#endif
 480
 481/* init and exit section handling */
 482#define INIT_DATA                                                       \
 483        *(.init.data)                                                   \
 484        DEV_DISCARD(init.data)                                          \
 485        CPU_DISCARD(init.data)                                          \
 486        MEM_DISCARD(init.data)                                          \
 487        KERNEL_CTORS()                                                  \
 488        *(.init.rodata)                                                 \
 489        MCOUNT_REC()                                                    \
 490        FTRACE_EVENTS()                                                 \
 491        TRACE_SYSCALLS()                                                \
 492        DEV_DISCARD(init.rodata)                                        \
 493        CPU_DISCARD(init.rodata)                                        \
 494        MEM_DISCARD(init.rodata)                                        \
 495        KERNEL_DTB()
 496
 497#define INIT_TEXT                                                       \
 498        *(.init.text)                                                   \
 499        DEV_DISCARD(init.text)                                          \
 500        CPU_DISCARD(init.text)                                          \
 501        MEM_DISCARD(init.text)
 502
 503#define EXIT_DATA                                                       \
 504        *(.exit.data)                                                   \
 505        DEV_DISCARD(exit.data)                                          \
 506        DEV_DISCARD(exit.rodata)                                        \
 507        CPU_DISCARD(exit.data)                                          \
 508        CPU_DISCARD(exit.rodata)                                        \
 509        MEM_DISCARD(exit.data)                                          \
 510        MEM_DISCARD(exit.rodata)
 511
 512#define EXIT_TEXT                                                       \
 513        *(.exit.text)                                                   \
 514        DEV_DISCARD(exit.text)                                          \
 515        CPU_DISCARD(exit.text)                                          \
 516        MEM_DISCARD(exit.text)
 517
 518#define EXIT_CALL                                                       \
 519        *(.exitcall.exit)
 520
 521/*
 522 * bss (Block Started by Symbol) - uninitialized data
 523 * zeroed during startup
 524 */
 525#define SBSS(sbss_align)                                                \
 526        . = ALIGN(sbss_align);                                          \
 527        .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) {                         \
 528                *(.sbss)                                                \
 529                *(.scommon)                                             \
 530        }
 531
 532#define BSS(bss_align)                                                  \
 533        . = ALIGN(bss_align);                                           \
 534        .bss : AT(ADDR(.bss) - LOAD_OFFSET) {                           \
 535                *(.bss..page_aligned)                                   \
 536                *(.dynbss)                                              \
 537                *(.bss)                                                 \
 538                *(COMMON)                                               \
 539        }
 540
 541/*
 542 * DWARF debug sections.
 543 * Symbols in the DWARF debugging sections are relative to
 544 * the beginning of the section so we begin them at 0.
 545 */
 546#define DWARF_DEBUG                                                     \
 547                /* DWARF 1 */                                           \
 548                .debug          0 : { *(.debug) }                       \
 549                .line           0 : { *(.line) }                        \
 550                /* GNU DWARF 1 extensions */                            \
 551                .debug_srcinfo  0 : { *(.debug_srcinfo) }               \
 552                .debug_sfnames  0 : { *(.debug_sfnames) }               \
 553                /* DWARF 1.1 and DWARF 2 */                             \
 554                .debug_aranges  0 : { *(.debug_aranges) }               \
 555                .debug_pubnames 0 : { *(.debug_pubnames) }              \
 556                /* DWARF 2 */                                           \
 557                .debug_info     0 : { *(.debug_info                     \
 558                                .gnu.linkonce.wi.*) }                   \
 559                .debug_abbrev   0 : { *(.debug_abbrev) }                \
 560                .debug_line     0 : { *(.debug_line) }                  \
 561                .debug_frame    0 : { *(.debug_frame) }                 \
 562                .debug_str      0 : { *(.debug_str) }                   \
 563                .debug_loc      0 : { *(.debug_loc) }                   \
 564                .debug_macinfo  0 : { *(.debug_macinfo) }               \
 565                /* SGI/MIPS DWARF 2 extensions */                       \
 566                .debug_weaknames 0 : { *(.debug_weaknames) }            \
 567                .debug_funcnames 0 : { *(.debug_funcnames) }            \
 568                .debug_typenames 0 : { *(.debug_typenames) }            \
 569                .debug_varnames  0 : { *(.debug_varnames) }             \
 570
 571                /* Stabs debugging sections.  */
 572#define STABS_DEBUG                                                     \
 573                .stab 0 : { *(.stab) }                                  \
 574                .stabstr 0 : { *(.stabstr) }                            \
 575                .stab.excl 0 : { *(.stab.excl) }                        \
 576                .stab.exclstr 0 : { *(.stab.exclstr) }                  \
 577                .stab.index 0 : { *(.stab.index) }                      \
 578                .stab.indexstr 0 : { *(.stab.indexstr) }                \
 579                .comment 0 : { *(.comment) }
 580
 581#ifdef CONFIG_GENERIC_BUG
 582#define BUG_TABLE                                                       \
 583        . = ALIGN(8);                                                   \
 584        __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) {             \
 585                VMLINUX_SYMBOL(__start___bug_table) = .;                \
 586                *(__bug_table)                                          \
 587                VMLINUX_SYMBOL(__stop___bug_table) = .;                 \
 588        }
 589#else
 590#define BUG_TABLE
 591#endif
 592
 593#ifdef CONFIG_PM_TRACE
 594#define TRACEDATA                                                       \
 595        . = ALIGN(4);                                                   \
 596        .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {               \
 597                VMLINUX_SYMBOL(__tracedata_start) = .;                  \
 598                *(.tracedata)                                           \
 599                VMLINUX_SYMBOL(__tracedata_end) = .;                    \
 600        }
 601#else
 602#define TRACEDATA
 603#endif
 604
 605#define NOTES                                                           \
 606        .notes : AT(ADDR(.notes) - LOAD_OFFSET) {                       \
 607                VMLINUX_SYMBOL(__start_notes) = .;                      \
 608                *(.note.*)                                              \
 609                VMLINUX_SYMBOL(__stop_notes) = .;                       \
 610        }
 611
 612#define INIT_SETUP(initsetup_align)                                     \
 613                . = ALIGN(initsetup_align);                             \
 614                VMLINUX_SYMBOL(__setup_start) = .;                      \
 615                *(.init.setup)                                          \
 616                VMLINUX_SYMBOL(__setup_end) = .;
 617
 618#define INITCALLS                                                       \
 619        *(.initcallearly.init)                                          \
 620        VMLINUX_SYMBOL(__early_initcall_end) = .;                       \
 621        *(.initcall0.init)                                              \
 622        *(.initcall0s.init)                                             \
 623        *(.initcall1.init)                                              \
 624        *(.initcall1s.init)                                             \
 625        *(.initcall2.init)                                              \
 626        *(.initcall2s.init)                                             \
 627        *(.initcall3.init)                                              \
 628        *(.initcall3s.init)                                             \
 629        *(.initcall4.init)                                              \
 630        *(.initcall4s.init)                                             \
 631        *(.initcall5.init)                                              \
 632        *(.initcall5s.init)                                             \
 633        *(.initcallrootfs.init)                                         \
 634        *(.initcall6.init)                                              \
 635        *(.initcall6s.init)                                             \
 636        *(.initcall7.init)                                              \
 637        *(.initcall7s.init)
 638
 639#define INIT_CALLS                                                      \
 640                VMLINUX_SYMBOL(__initcall_start) = .;                   \
 641                INITCALLS                                               \
 642                VMLINUX_SYMBOL(__initcall_end) = .;
 643
 644#define CON_INITCALL                                                    \
 645                VMLINUX_SYMBOL(__con_initcall_start) = .;               \
 646                *(.con_initcall.init)                                   \
 647                VMLINUX_SYMBOL(__con_initcall_end) = .;
 648
 649#define SECURITY_INITCALL                                               \
 650                VMLINUX_SYMBOL(__security_initcall_start) = .;          \
 651                *(.security_initcall.init)                              \
 652                VMLINUX_SYMBOL(__security_initcall_end) = .;
 653
 654#ifdef CONFIG_BLK_DEV_INITRD
 655#define INIT_RAM_FS                                                     \
 656        . = ALIGN(4);                                                   \
 657        VMLINUX_SYMBOL(__initramfs_start) = .;                          \
 658        *(.init.ramfs)                                                  \
 659        . = ALIGN(8);                                                   \
 660        *(.init.ramfs.info)
 661#else
 662#define INIT_RAM_FS
 663#endif
 664
 665/*
 666 * Default discarded sections.
 667 *
 668 * Some archs want to discard exit text/data at runtime rather than
 669 * link time due to cross-section references such as alt instructions,
 670 * bug table, eh_frame, etc.  DISCARDS must be the last of output
 671 * section definitions so that such archs put those in earlier section
 672 * definitions.
 673 */
 674#define DISCARDS                                                        \
 675        /DISCARD/ : {                                                   \
 676        EXIT_TEXT                                                       \
 677        EXIT_DATA                                                       \
 678        EXIT_CALL                                                       \
 679        *(.discard)                                                     \
 680        *(.discard.*)                                                   \
 681        }
 682
 683/**
 684 * PERCPU_INPUT - the percpu input sections
 685 * @cacheline: cacheline size
 686 *
 687 * The core percpu section names and core symbols which do not rely
 688 * directly upon load addresses.
 689 *
 690 * @cacheline is used to align subsections to avoid false cacheline
 691 * sharing between subsections for different purposes.
 692 */
 693#define PERCPU_INPUT(cacheline)                                         \
 694        VMLINUX_SYMBOL(__per_cpu_start) = .;                            \
 695        *(.data..percpu..first)                                         \
 696        . = ALIGN(PAGE_SIZE);                                           \
 697        *(.data..percpu..page_aligned)                                  \
 698        . = ALIGN(cacheline);                                           \
 699        *(.data..percpu..readmostly)                                    \
 700        . = ALIGN(cacheline);                                           \
 701        *(.data..percpu)                                                \
 702        *(.data..percpu..shared_aligned)                                \
 703        VMLINUX_SYMBOL(__per_cpu_end) = .;
 704
 705/**
 706 * PERCPU_VADDR - define output section for percpu area
 707 * @cacheline: cacheline size
 708 * @vaddr: explicit base address (optional)
 709 * @phdr: destination PHDR (optional)
 710 *
 711 * Macro which expands to output section for percpu area.
 712 *
 713 * @cacheline is used to align subsections to avoid false cacheline
 714 * sharing between subsections for different purposes.
 715 *
 716 * If @vaddr is not blank, it specifies explicit base address and all
 717 * percpu symbols will be offset from the given address.  If blank,
 718 * @vaddr always equals @laddr + LOAD_OFFSET.
 719 *
 720 * @phdr defines the output PHDR to use if not blank.  Be warned that
 721 * output PHDR is sticky.  If @phdr is specified, the next output
 722 * section in the linker script will go there too.  @phdr should have
 723 * a leading colon.
 724 *
 725 * Note that this macros defines __per_cpu_load as an absolute symbol.
 726 * If there is no need to put the percpu section at a predetermined
 727 * address, use PERCPU_SECTION.
 728 */
 729#define PERCPU_VADDR(cacheline, vaddr, phdr)                            \
 730        VMLINUX_SYMBOL(__per_cpu_load) = .;                             \
 731        .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load)         \
 732                                - LOAD_OFFSET) {                        \
 733                PERCPU_INPUT(cacheline)                                 \
 734        } phdr                                                          \
 735        . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data..percpu);
 736
 737/**
 738 * PERCPU_SECTION - define output section for percpu area, simple version
 739 * @cacheline: cacheline size
 740 *
 741 * Align to PAGE_SIZE and outputs output section for percpu area.  This
 742 * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and
 743 * __per_cpu_start will be identical.
 744 *
 745 * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,)
 746 * except that __per_cpu_load is defined as a relative symbol against
 747 * .data..percpu which is required for relocatable x86_32 configuration.
 748 */
 749#define PERCPU_SECTION(cacheline)                                       \
 750        . = ALIGN(PAGE_SIZE);                                           \
 751        .data..percpu   : AT(ADDR(.data..percpu) - LOAD_OFFSET) {       \
 752                VMLINUX_SYMBOL(__per_cpu_load) = .;                     \
 753                PERCPU_INPUT(cacheline)                                 \
 754        }
 755
 756
 757/*
 758 * Definition of the high level *_SECTION macros
 759 * They will fit only a subset of the architectures
 760 */
 761
 762
 763/*
 764 * Writeable data.
 765 * All sections are combined in a single .data section.
 766 * The sections following CONSTRUCTORS are arranged so their
 767 * typical alignment matches.
 768 * A cacheline is typical/always less than a PAGE_SIZE so
 769 * the sections that has this restriction (or similar)
 770 * is located before the ones requiring PAGE_SIZE alignment.
 771 * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which
 772 * matches the requirement of PAGE_ALIGNED_DATA.
 773 *
 774 * use 0 as page_align if page_aligned data is not used */
 775#define RW_DATA_SECTION(cacheline, pagealigned, inittask)               \
 776        . = ALIGN(PAGE_SIZE);                                           \
 777        .data : AT(ADDR(.data) - LOAD_OFFSET) {                         \
 778                INIT_TASK_DATA(inittask)                                \
 779                NOSAVE_DATA                                             \
 780                PAGE_ALIGNED_DATA(pagealigned)                          \
 781                CACHELINE_ALIGNED_DATA(cacheline)                       \
 782                READ_MOSTLY_DATA(cacheline)                             \
 783                DATA_DATA                                               \
 784                CONSTRUCTORS                                            \
 785        }
 786
 787#define INIT_TEXT_SECTION(inittext_align)                               \
 788        . = ALIGN(inittext_align);                                      \
 789        .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {               \
 790                VMLINUX_SYMBOL(_sinittext) = .;                         \
 791                INIT_TEXT                                               \
 792                VMLINUX_SYMBOL(_einittext) = .;                         \
 793        }
 794
 795#define INIT_DATA_SECTION(initsetup_align)                              \
 796        .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {               \
 797                INIT_DATA                                               \
 798                INIT_SETUP(initsetup_align)                             \
 799                INIT_CALLS                                              \
 800                CON_INITCALL                                            \
 801                SECURITY_INITCALL                                       \
 802                INIT_RAM_FS                                             \
 803        }
 804
 805#define BSS_SECTION(sbss_align, bss_align, stop_align)                  \
 806        . = ALIGN(sbss_align);                                          \
 807        VMLINUX_SYMBOL(__bss_start) = .;                                \
 808        SBSS(sbss_align)                                                \
 809        BSS(bss_align)                                                  \
 810        . = ALIGN(stop_align);                                          \
 811        VMLINUX_SYMBOL(__bss_stop) = .;
 812
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.