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        *(.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
 686/**
 687 * PERCPU_INPUT - the percpu input sections
 688 * @cacheline: cacheline size
 689 *
 690 * The core percpu section names and core symbols which do not rely
 691 * directly upon load addresses.
 692 *
 693 * @cacheline is used to align subsections to avoid false cacheline
 694 * sharing between subsections for different purposes.
 695 */
 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
 708/**
 709 * PERCPU_VADDR - define output section for percpu area
 710 * @cacheline: cacheline size
 711 * @vaddr: explicit base address (optional)
 712 * @phdr: destination PHDR (optional)
 713 *
 714 * Macro which expands to output section for percpu area.
 715 *
 716 * @cacheline is used to align subsections to avoid false cacheline
 717 * sharing between subsections for different purposes.
 718 *
 719 * If @vaddr is not blank, it specifies explicit base address and all
 720 * percpu symbols will be offset from the given address.  If blank,
 721 * @vaddr always equals @laddr + LOAD_OFFSET.
 722 *
 723 * @phdr defines the output PHDR to use if not blank.  Be warned that
 724 * output PHDR is sticky.  If @phdr is specified, the next output
 725 * section in the linker script will go there too.  @phdr should have
 726 * a leading colon.
 727 *
 728 * Note that this macros defines __per_cpu_load as an absolute symbol.
 729 * If there is no need to put the percpu section at a predetermined
 730 * address, use PERCPU_SECTION.
 731 */
 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
 740/**
 741 * PERCPU_SECTION - define output section for percpu area, simple version
 742 * @cacheline: cacheline size
 743 *
 744 * Align to PAGE_SIZE and outputs output section for percpu area.  This
 745 * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and
 746 * __per_cpu_start will be identical.
 747 *
 748 * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,)
 749 * except that __per_cpu_load is defined as a relative symbol against
 750 * .data..percpu which is required for relocatable x86_32 configuration.
 751 */
 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) = .;
 815
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.