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 *      // __init_begin and __init_end should be page aligned, so that we can
  44 *      // free the whole .init memory
  45 * [_stext, _etext] is the text section
  46 * [_sdata, _edata] is the data section
  47 *
  48 * Some of the included output section have their own set of constants.
  49 * Examples are: [__initramfs_start, __initramfs_end] for initramfs and
  50 *               [__nosave_begin, __nosave_end] for the nosave data
  51 */
  52
  53#ifndef LOAD_OFFSET
  54#define LOAD_OFFSET 0
  55#endif
  56
  57#include <linux/export.h>
  58
  59/* Align . to a 8 byte boundary equals to maximum function alignment. */
  60#define ALIGN_FUNCTION()  . = ALIGN(8)
  61
  62/*
  63 * LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections, which
  64 * generates .data.identifier sections, which need to be pulled in with
  65 * .data. We don't want to pull in .data..other sections, which Linux
  66 * has defined. Same for text and bss.
  67 *
  68 * RODATA_MAIN is not used because existing code already defines .rodata.x
  69 * sections to be brought in with rodata.
  70 */
  71#ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
  72#define TEXT_MAIN .text .text.[0-9a-zA-Z_]*
  73#define DATA_MAIN .data .data.[0-9a-zA-Z_]*
  74#define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]*
  75#define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]*
  76#define BSS_MAIN .bss .bss.[0-9a-zA-Z_]*
  77#define SBSS_MAIN .sbss .sbss.[0-9a-zA-Z_]*
  78#else
  79#define TEXT_MAIN .text
  80#define DATA_MAIN .data
  81#define SDATA_MAIN .sdata
  82#define RODATA_MAIN .rodata
  83#define BSS_MAIN .bss
  84#define SBSS_MAIN .sbss
  85#endif
  86
  87/*
  88 * Align to a 32 byte boundary equal to the
  89 * alignment gcc 4.5 uses for a struct
  90 */
  91#define STRUCT_ALIGNMENT 32
  92#define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT)
  93
  94/* The actual configuration determine if the init/exit sections
  95 * are handled as text/data or they can be discarded (which
  96 * often happens at runtime)
  97 */
  98#ifdef CONFIG_HOTPLUG_CPU
  99#define CPU_KEEP(sec)    *(.cpu##sec)
 100#define CPU_DISCARD(sec)
 101#else
 102#define CPU_KEEP(sec)
 103#define CPU_DISCARD(sec) *(.cpu##sec)
 104#endif
 105
 106#if defined(CONFIG_MEMORY_HOTPLUG)
 107#define MEM_KEEP(sec)    *(.mem##sec)
 108#define MEM_DISCARD(sec)
 109#else
 110#define MEM_KEEP(sec)
 111#define MEM_DISCARD(sec) *(.mem##sec)
 112#endif
 113
 114#ifdef CONFIG_FTRACE_MCOUNT_RECORD
 115#define MCOUNT_REC()    . = ALIGN(8);                           \
 116                        __start_mcount_loc = .;                 \
 117                        KEEP(*(__mcount_loc))                   \
 118                        __stop_mcount_loc = .;
 119#else
 120#define MCOUNT_REC()
 121#endif
 122
 123#ifdef CONFIG_TRACE_BRANCH_PROFILING
 124#define LIKELY_PROFILE()        __start_annotated_branch_profile = .;   \
 125                                KEEP(*(_ftrace_annotated_branch))       \
 126                                __stop_annotated_branch_profile = .;
 127#else
 128#define LIKELY_PROFILE()
 129#endif
 130
 131#ifdef CONFIG_PROFILE_ALL_BRANCHES
 132#define BRANCH_PROFILE()        __start_branch_profile = .;             \
 133                                KEEP(*(_ftrace_branch))                 \
 134                                __stop_branch_profile = .;
 135#else
 136#define BRANCH_PROFILE()
 137#endif
 138
 139#ifdef CONFIG_KPROBES
 140#define KPROBE_BLACKLIST()      . = ALIGN(8);                                 \
 141                                __start_kprobe_blacklist = .;                 \
 142                                KEEP(*(_kprobe_blacklist))                    \
 143                                __stop_kprobe_blacklist = .;
 144#else
 145#define KPROBE_BLACKLIST()
 146#endif
 147
 148#ifdef CONFIG_FUNCTION_ERROR_INJECTION
 149#define ERROR_INJECT_WHITELIST()        STRUCT_ALIGN();                       \
 150                        __start_error_injection_whitelist = .;                \
 151                        KEEP(*(_error_injection_whitelist))                   \
 152                        __stop_error_injection_whitelist = .;
 153#else
 154#define ERROR_INJECT_WHITELIST()
 155#endif
 156
 157#ifdef CONFIG_EVENT_TRACING
 158#define FTRACE_EVENTS() . = ALIGN(8);                                   \
 159                        __start_ftrace_events = .;                      \
 160                        KEEP(*(_ftrace_events))                         \
 161                        __stop_ftrace_events = .;                       \
 162                        __start_ftrace_eval_maps = .;                   \
 163                        KEEP(*(_ftrace_eval_map))                       \
 164                        __stop_ftrace_eval_maps = .;
 165#else
 166#define FTRACE_EVENTS()
 167#endif
 168
 169#ifdef CONFIG_TRACING
 170#define TRACE_PRINTKS()  __start___trace_bprintk_fmt = .;      \
 171                         KEEP(*(__trace_printk_fmt)) /* Trace_printk fmt' pointer */ \
 172                         __stop___trace_bprintk_fmt = .;
 173#define TRACEPOINT_STR() __start___tracepoint_str = .;  \
 174                         KEEP(*(__tracepoint_str)) /* Trace_printk fmt' pointer */ \
 175                         __stop___tracepoint_str = .;
 176#else
 177#define TRACE_PRINTKS()
 178#define TRACEPOINT_STR()
 179#endif
 180
 181#ifdef CONFIG_FTRACE_SYSCALLS
 182#define TRACE_SYSCALLS() . = ALIGN(8);                                  \
 183                         __start_syscalls_metadata = .;                 \
 184                         KEEP(*(__syscalls_metadata))                   \
 185                         __stop_syscalls_metadata = .;
 186#else
 187#define TRACE_SYSCALLS()
 188#endif
 189
 190#ifdef CONFIG_BPF_EVENTS
 191#define BPF_RAW_TP() STRUCT_ALIGN();                                    \
 192                         __start__bpf_raw_tp = .;                       \
 193                         KEEP(*(__bpf_raw_tp_map))                      \
 194                         __stop__bpf_raw_tp = .;
 195#else
 196#define BPF_RAW_TP()
 197#endif
 198
 199#ifdef CONFIG_SERIAL_EARLYCON
 200#define EARLYCON_TABLE() . = ALIGN(8);                          \
 201                         __earlycon_table = .;                  \
 202                         KEEP(*(__earlycon_table))              \
 203                         __earlycon_table_end = .;
 204#else
 205#define EARLYCON_TABLE()
 206#endif
 207
 208#define ___OF_TABLE(cfg, name)  _OF_TABLE_##cfg(name)
 209#define __OF_TABLE(cfg, name)   ___OF_TABLE(cfg, name)
 210#define OF_TABLE(cfg, name)     __OF_TABLE(IS_ENABLED(cfg), name)
 211#define _OF_TABLE_0(name)
 212#define _OF_TABLE_1(name)                                               \
 213        . = ALIGN(8);                                                   \
 214        __##name##_of_table = .;                                        \
 215        KEEP(*(__##name##_of_table))                                    \
 216        KEEP(*(__##name##_of_table_end))
 217
 218#define TIMER_OF_TABLES()       OF_TABLE(CONFIG_TIMER_OF, timer)
 219#define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip)
 220#define CLK_OF_TABLES()         OF_TABLE(CONFIG_COMMON_CLK, clk)
 221#define IOMMU_OF_TABLES()       OF_TABLE(CONFIG_OF_IOMMU, iommu)
 222#define RESERVEDMEM_OF_TABLES() OF_TABLE(CONFIG_OF_RESERVED_MEM, reservedmem)
 223#define CPU_METHOD_OF_TABLES()  OF_TABLE(CONFIG_SMP, cpu_method)
 224#define CPUIDLE_METHOD_OF_TABLES() OF_TABLE(CONFIG_CPU_IDLE, cpuidle_method)
 225
 226#ifdef CONFIG_ACPI
 227#define ACPI_PROBE_TABLE(name)                                          \
 228        . = ALIGN(8);                                                   \
 229        __##name##_acpi_probe_table = .;                                \
 230        KEEP(*(__##name##_acpi_probe_table))                            \
 231        __##name##_acpi_probe_table_end = .;
 232#else
 233#define ACPI_PROBE_TABLE(name)
 234#endif
 235
 236#define KERNEL_DTB()                                                    \
 237        STRUCT_ALIGN();                                                 \
 238        __dtb_start = .;                                                \
 239        KEEP(*(.dtb.init.rodata))                                       \
 240        __dtb_end = .;
 241
 242/*
 243 * .data section
 244 */
 245#define DATA_DATA                                                       \
 246        *(.xiptext)                                                     \
 247        *(DATA_MAIN)                                                    \
 248        *(.ref.data)                                                    \
 249        *(.data..shared_aligned) /* percpu related */                   \
 250        MEM_KEEP(init.data*)                                            \
 251        MEM_KEEP(exit.data*)                                            \
 252        *(.data.unlikely)                                               \
 253        __start_once = .;                                               \
 254        *(.data.once)                                                   \
 255        __end_once = .;                                                 \
 256        STRUCT_ALIGN();                                                 \
 257        *(__tracepoints)                                                \
 258        /* implement dynamic printk debug */                            \
 259        . = ALIGN(8);                                                   \
 260        __start___jump_table = .;                                       \
 261        KEEP(*(__jump_table))                                           \
 262        __stop___jump_table = .;                                        \
 263        . = ALIGN(8);                                                   \
 264        __start___verbose = .;                                          \
 265        KEEP(*(__verbose))                                              \
 266        __stop___verbose = .;                                           \
 267        LIKELY_PROFILE()                                                \
 268        BRANCH_PROFILE()                                                \
 269        TRACE_PRINTKS()                                                 \
 270        BPF_RAW_TP()                                                    \
 271        TRACEPOINT_STR()
 272
 273/*
 274 * Data section helpers
 275 */
 276#define NOSAVE_DATA                                                     \
 277        . = ALIGN(PAGE_SIZE);                                           \
 278        __nosave_begin = .;                                             \
 279        *(.data..nosave)                                                \
 280        . = ALIGN(PAGE_SIZE);                                           \
 281        __nosave_end = .;
 282
 283#define PAGE_ALIGNED_DATA(page_align)                                   \
 284        . = ALIGN(page_align);                                          \
 285        *(.data..page_aligned)
 286
 287#define READ_MOSTLY_DATA(align)                                         \
 288        . = ALIGN(align);                                               \
 289        *(.data..read_mostly)                                           \
 290        . = ALIGN(align);
 291
 292#define CACHELINE_ALIGNED_DATA(align)                                   \
 293        . = ALIGN(align);                                               \
 294        *(.data..cacheline_aligned)
 295
 296#define INIT_TASK_DATA(align)                                           \
 297        . = ALIGN(align);                                               \
 298        __start_init_task = .;                                          \
 299        init_thread_union = .;                                          \
 300        init_stack = .;                                                 \
 301        KEEP(*(.data..init_task))                                       \
 302        KEEP(*(.data..init_thread_info))                                \
 303        . = __start_init_task + THREAD_SIZE;                            \
 304        __end_init_task = .;
 305
 306/*
 307 * Allow architectures to handle ro_after_init data on their
 308 * own by defining an empty RO_AFTER_INIT_DATA.
 309 */
 310#ifndef RO_AFTER_INIT_DATA
 311#define RO_AFTER_INIT_DATA                                              \
 312        __start_ro_after_init = .;                                      \
 313        *(.data..ro_after_init)                                         \
 314        __end_ro_after_init = .;
 315#endif
 316
 317/*
 318 * Read only Data
 319 */
 320#define RO_DATA_SECTION(align)                                          \
 321        . = ALIGN((align));                                             \
 322        .rodata           : AT(ADDR(.rodata) - LOAD_OFFSET) {           \
 323                __start_rodata = .;                                     \
 324                *(.rodata) *(.rodata.*)                                 \
 325                RO_AFTER_INIT_DATA      /* Read only after init */      \
 326                KEEP(*(__vermagic))     /* Kernel version magic */      \
 327                . = ALIGN(8);                                           \
 328                __start___tracepoints_ptrs = .;                         \
 329                KEEP(*(__tracepoints_ptrs)) /* Tracepoints: pointer array */ \
 330                __stop___tracepoints_ptrs = .;                          \
 331                *(__tracepoints_strings)/* Tracepoints: strings */      \
 332        }                                                               \
 333                                                                        \
 334        .rodata1          : AT(ADDR(.rodata1) - LOAD_OFFSET) {          \
 335                *(.rodata1)                                             \
 336        }                                                               \
 337                                                                        \
 338        /* PCI quirks */                                                \
 339        .pci_fixup        : AT(ADDR(.pci_fixup) - LOAD_OFFSET) {        \
 340                __start_pci_fixups_early = .;                           \
 341                KEEP(*(.pci_fixup_early))                               \
 342                __end_pci_fixups_early = .;                             \
 343                __start_pci_fixups_header = .;                          \
 344                KEEP(*(.pci_fixup_header))                              \
 345                __end_pci_fixups_header = .;                            \
 346                __start_pci_fixups_final = .;                           \
 347                KEEP(*(.pci_fixup_final))                               \
 348                __end_pci_fixups_final = .;                             \
 349                __start_pci_fixups_enable = .;                          \
 350                KEEP(*(.pci_fixup_enable))                              \
 351                __end_pci_fixups_enable = .;                            \
 352                __start_pci_fixups_resume = .;                          \
 353                KEEP(*(.pci_fixup_resume))                              \
 354                __end_pci_fixups_resume = .;                            \
 355                __start_pci_fixups_resume_early = .;                    \
 356                KEEP(*(.pci_fixup_resume_early))                        \
 357                __end_pci_fixups_resume_early = .;                      \
 358                __start_pci_fixups_suspend = .;                         \
 359                KEEP(*(.pci_fixup_suspend))                             \
 360                __end_pci_fixups_suspend = .;                           \
 361                __start_pci_fixups_suspend_late = .;                    \
 362                KEEP(*(.pci_fixup_suspend_late))                        \
 363                __end_pci_fixups_suspend_late = .;                      \
 364        }                                                               \
 365                                                                        \
 366        /* Built-in firmware blobs */                                   \
 367        .builtin_fw        : AT(ADDR(.builtin_fw) - LOAD_OFFSET) {      \
 368                __start_builtin_fw = .;                                 \
 369                KEEP(*(.builtin_fw))                                    \
 370                __end_builtin_fw = .;                                   \
 371        }                                                               \
 372                                                                        \
 373        TRACEDATA                                                       \
 374                                                                        \
 375        /* Kernel symbol table: Normal symbols */                       \
 376        __ksymtab         : AT(ADDR(__ksymtab) - LOAD_OFFSET) {         \
 377                __start___ksymtab = .;                                  \
 378                KEEP(*(SORT(___ksymtab+*)))                             \
 379                __stop___ksymtab = .;                                   \
 380        }                                                               \
 381                                                                        \
 382        /* Kernel symbol table: GPL-only symbols */                     \
 383        __ksymtab_gpl     : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) {     \
 384                __start___ksymtab_gpl = .;                              \
 385                KEEP(*(SORT(___ksymtab_gpl+*)))                         \
 386                __stop___ksymtab_gpl = .;                               \
 387        }                                                               \
 388                                                                        \
 389        /* Kernel symbol table: Normal unused symbols */                \
 390        __ksymtab_unused  : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) {  \
 391                __start___ksymtab_unused = .;                           \
 392                KEEP(*(SORT(___ksymtab_unused+*)))                      \
 393                __stop___ksymtab_unused = .;                            \
 394        }                                                               \
 395                                                                        \
 396        /* Kernel symbol table: GPL-only unused symbols */              \
 397        __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \
 398                __start___ksymtab_unused_gpl = .;                       \
 399                KEEP(*(SORT(___ksymtab_unused_gpl+*)))                  \
 400                __stop___ksymtab_unused_gpl = .;                        \
 401        }                                                               \
 402                                                                        \
 403        /* Kernel symbol table: GPL-future-only symbols */              \
 404        __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \
 405                __start___ksymtab_gpl_future = .;                       \
 406                KEEP(*(SORT(___ksymtab_gpl_future+*)))                  \
 407                __stop___ksymtab_gpl_future = .;                        \
 408        }                                                               \
 409                                                                        \
 410        /* Kernel symbol table: Normal symbols */                       \
 411        __kcrctab         : AT(ADDR(__kcrctab) - LOAD_OFFSET) {         \
 412                __start___kcrctab = .;                                  \
 413                KEEP(*(SORT(___kcrctab+*)))                             \
 414                __stop___kcrctab = .;                                   \
 415        }                                                               \
 416                                                                        \
 417        /* Kernel symbol table: GPL-only symbols */                     \
 418        __kcrctab_gpl     : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) {     \
 419                __start___kcrctab_gpl = .;                              \
 420                KEEP(*(SORT(___kcrctab_gpl+*)))                         \
 421                __stop___kcrctab_gpl = .;                               \
 422        }                                                               \
 423                                                                        \
 424        /* Kernel symbol table: Normal unused symbols */                \
 425        __kcrctab_unused  : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) {  \
 426                __start___kcrctab_unused = .;                           \
 427                KEEP(*(SORT(___kcrctab_unused+*)))                      \
 428                __stop___kcrctab_unused = .;                            \
 429        }                                                               \
 430                                                                        \
 431        /* Kernel symbol table: GPL-only unused symbols */              \
 432        __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \
 433                __start___kcrctab_unused_gpl = .;                       \
 434                KEEP(*(SORT(___kcrctab_unused_gpl+*)))                  \
 435                __stop___kcrctab_unused_gpl = .;                        \
 436        }                                                               \
 437                                                                        \
 438        /* Kernel symbol table: GPL-future-only symbols */              \
 439        __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \
 440                __start___kcrctab_gpl_future = .;                       \
 441                KEEP(*(SORT(___kcrctab_gpl_future+*)))                  \
 442                __stop___kcrctab_gpl_future = .;                        \
 443        }                                                               \
 444                                                                        \
 445        /* Kernel symbol table: strings */                              \
 446        __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
 447                *(__ksymtab_strings)                                    \
 448        }                                                               \
 449                                                                        \
 450        /* __*init sections */                                          \
 451        __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) {         \
 452                *(.ref.rodata)                                          \
 453                MEM_KEEP(init.rodata)                                   \
 454                MEM_KEEP(exit.rodata)                                   \
 455        }                                                               \
 456                                                                        \
 457        /* Built-in module parameters. */                               \
 458        __param : AT(ADDR(__param) - LOAD_OFFSET) {                     \
 459                __start___param = .;                                    \
 460                KEEP(*(__param))                                        \
 461                __stop___param = .;                                     \
 462        }                                                               \
 463                                                                        \
 464        /* Built-in module versions. */                                 \
 465        __modver : AT(ADDR(__modver) - LOAD_OFFSET) {                   \
 466                __start___modver = .;                                   \
 467                KEEP(*(__modver))                                       \
 468                __stop___modver = .;                                    \
 469                . = ALIGN((align));                                     \
 470                __end_rodata = .;                                       \
 471        }                                                               \
 472        . = ALIGN((align));
 473
 474/* RODATA & RO_DATA provided for backward compatibility.
 475 * All archs are supposed to use RO_DATA() */
 476#define RODATA          RO_DATA_SECTION(4096)
 477#define RO_DATA(align)  RO_DATA_SECTION(align)
 478
 479#define SECURITY_INIT                                                   \
 480        .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \
 481                __security_initcall_start = .;                          \
 482                KEEP(*(.security_initcall.init))                        \
 483                __security_initcall_end = .;                            \
 484        }
 485
 486/*
 487 * .text section. Map to function alignment to avoid address changes
 488 * during second ld run in second ld pass when generating System.map
 489 *
 490 * TEXT_MAIN here will match .text.fixup and .text.unlikely if dead
 491 * code elimination is enabled, so these sections should be converted
 492 * to use ".." first.
 493 */
 494#define TEXT_TEXT                                                       \
 495                ALIGN_FUNCTION();                                       \
 496                *(.text.hot TEXT_MAIN .text.fixup .text.unlikely)       \
 497                *(.text..refcount)                                      \
 498                *(.ref.text)                                            \
 499        MEM_KEEP(init.text*)                                            \
 500        MEM_KEEP(exit.text*)                                            \
 501
 502
 503/* sched.text is aling to function alignment to secure we have same
 504 * address even at second ld pass when generating System.map */
 505#define SCHED_TEXT                                                      \
 506                ALIGN_FUNCTION();                                       \
 507                __sched_text_start = .;                                 \
 508                *(.sched.text)                                          \
 509                __sched_text_end = .;
 510
 511/* spinlock.text is aling to function alignment to secure we have same
 512 * address even at second ld pass when generating System.map */
 513#define LOCK_TEXT                                                       \
 514                ALIGN_FUNCTION();                                       \
 515                __lock_text_start = .;                                  \
 516                *(.spinlock.text)                                       \
 517                __lock_text_end = .;
 518
 519#define CPUIDLE_TEXT                                                    \
 520                ALIGN_FUNCTION();                                       \
 521                __cpuidle_text_start = .;                               \
 522                *(.cpuidle.text)                                        \
 523                __cpuidle_text_end = .;
 524
 525#define KPROBES_TEXT                                                    \
 526                ALIGN_FUNCTION();                                       \
 527                __kprobes_text_start = .;                               \
 528                *(.kprobes.text)                                        \
 529                __kprobes_text_end = .;
 530
 531#define ENTRY_TEXT                                                      \
 532                ALIGN_FUNCTION();                                       \
 533                __entry_text_start = .;                                 \
 534                *(.entry.text)                                          \
 535                __entry_text_end = .;
 536
 537#define IRQENTRY_TEXT                                                   \
 538                ALIGN_FUNCTION();                                       \
 539                __irqentry_text_start = .;                              \
 540                *(.irqentry.text)                                       \
 541                __irqentry_text_end = .;
 542
 543#define SOFTIRQENTRY_TEXT                                               \
 544                ALIGN_FUNCTION();                                       \
 545                __softirqentry_text_start = .;                          \
 546                *(.softirqentry.text)                                   \
 547                __softirqentry_text_end = .;
 548
 549/* Section used for early init (in .S files) */
 550#define HEAD_TEXT  KEEP(*(.head.text))
 551
 552#define HEAD_TEXT_SECTION                                                       \
 553        .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) {               \
 554                HEAD_TEXT                                               \
 555        }
 556
 557/*
 558 * Exception table
 559 */
 560#define EXCEPTION_TABLE(align)                                          \
 561        . = ALIGN(align);                                               \
 562        __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {               \
 563                __start___ex_table = .;                                 \
 564                KEEP(*(__ex_table))                                     \
 565                __stop___ex_table = .;                                  \
 566        }
 567
 568/*
 569 * Init task
 570 */
 571#define INIT_TASK_DATA_SECTION(align)                                   \
 572        . = ALIGN(align);                                               \
 573        .data..init_task :  AT(ADDR(.data..init_task) - LOAD_OFFSET) {  \
 574                INIT_TASK_DATA(align)                                   \
 575        }
 576
 577#ifdef CONFIG_CONSTRUCTORS
 578#define KERNEL_CTORS()  . = ALIGN(8);                      \
 579                        __ctors_start = .;                 \
 580                        KEEP(*(.ctors))                    \
 581                        KEEP(*(SORT(.init_array.*)))       \
 582                        KEEP(*(.init_array))               \
 583                        __ctors_end = .;
 584#else
 585#define KERNEL_CTORS()
 586#endif
 587
 588/* init and exit section handling */
 589#define INIT_DATA                                                       \
 590        KEEP(*(SORT(___kentry+*)))                                      \
 591        *(.init.data init.data.*)                                       \
 592        MEM_DISCARD(init.data*)                                         \
 593        KERNEL_CTORS()                                                  \
 594        MCOUNT_REC()                                                    \
 595        *(.init.rodata .init.rodata.*)                                  \
 596        FTRACE_EVENTS()                                                 \
 597        TRACE_SYSCALLS()                                                \
 598        KPROBE_BLACKLIST()                                              \
 599        ERROR_INJECT_WHITELIST()                                        \
 600        MEM_DISCARD(init.rodata)                                        \
 601        CLK_OF_TABLES()                                                 \
 602        RESERVEDMEM_OF_TABLES()                                         \
 603        TIMER_OF_TABLES()                                               \
 604        IOMMU_OF_TABLES()                                               \
 605        CPU_METHOD_OF_TABLES()                                          \
 606        CPUIDLE_METHOD_OF_TABLES()                                      \
 607        KERNEL_DTB()                                                    \
 608        IRQCHIP_OF_MATCH_TABLE()                                        \
 609        ACPI_PROBE_TABLE(irqchip)                                       \
 610        ACPI_PROBE_TABLE(timer)                                         \
 611        EARLYCON_TABLE()
 612
 613#define INIT_TEXT                                                       \
 614        *(.init.text .init.text.*)                                      \
 615        *(.text.startup)                                                \
 616        MEM_DISCARD(init.text*)
 617
 618#define EXIT_DATA                                                       \
 619        *(.exit.data .exit.data.*)                                      \
 620        *(.fini_array)                                                  \
 621        *(.dtors)                                                       \
 622        MEM_DISCARD(exit.data*)                                         \
 623        MEM_DISCARD(exit.rodata*)
 624
 625#define EXIT_TEXT                                                       \
 626        *(.exit.text)                                                   \
 627        *(.text.exit)                                                   \
 628        MEM_DISCARD(exit.text)
 629
 630#define EXIT_CALL                                                       \
 631        *(.exitcall.exit)
 632
 633/*
 634 * bss (Block Started by Symbol) - uninitialized data
 635 * zeroed during startup
 636 */
 637#define SBSS(sbss_align)                                                \
 638        . = ALIGN(sbss_align);                                          \
 639        .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) {                         \
 640                *(.dynsbss)                                             \
 641                *(SBSS_MAIN)                                            \
 642                *(.scommon)                                             \
 643        }
 644
 645/*
 646 * Allow archectures to redefine BSS_FIRST_SECTIONS to add extra
 647 * sections to the front of bss.
 648 */
 649#ifndef BSS_FIRST_SECTIONS
 650#define BSS_FIRST_SECTIONS
 651#endif
 652
 653#define BSS(bss_align)                                                  \
 654        . = ALIGN(bss_align);                                           \
 655        .bss : AT(ADDR(.bss) - LOAD_OFFSET) {                           \
 656                BSS_FIRST_SECTIONS                                      \
 657                *(.bss..page_aligned)                                   \
 658                *(.dynbss)                                              \
 659                *(BSS_MAIN)                                             \
 660                *(COMMON)                                               \
 661        }
 662
 663/*
 664 * DWARF debug sections.
 665 * Symbols in the DWARF debugging sections are relative to
 666 * the beginning of the section so we begin them at 0.
 667 */
 668#define DWARF_DEBUG                                                     \
 669                /* DWARF 1 */                                           \
 670                .debug          0 : { *(.debug) }                       \
 671                .line           0 : { *(.line) }                        \
 672                /* GNU DWARF 1 extensions */                            \
 673                .debug_srcinfo  0 : { *(.debug_srcinfo) }               \
 674                .debug_sfnames  0 : { *(.debug_sfnames) }               \
 675                /* DWARF 1.1 and DWARF 2 */                             \
 676                .debug_aranges  0 : { *(.debug_aranges) }               \
 677                .debug_pubnames 0 : { *(.debug_pubnames) }              \
 678                /* DWARF 2 */                                           \
 679                .debug_info     0 : { *(.debug_info                     \
 680                                .gnu.linkonce.wi.*) }                   \
 681                .debug_abbrev   0 : { *(.debug_abbrev) }                \
 682                .debug_line     0 : { *(.debug_line) }                  \
 683                .debug_frame    0 : { *(.debug_frame) }                 \
 684                .debug_str      0 : { *(.debug_str) }                   \
 685                .debug_loc      0 : { *(.debug_loc) }                   \
 686                .debug_macinfo  0 : { *(.debug_macinfo) }               \
 687                .debug_pubtypes 0 : { *(.debug_pubtypes) }              \
 688                /* DWARF 3 */                                           \
 689                .debug_ranges   0 : { *(.debug_ranges) }                \
 690                /* SGI/MIPS DWARF 2 extensions */                       \
 691                .debug_weaknames 0 : { *(.debug_weaknames) }            \
 692                .debug_funcnames 0 : { *(.debug_funcnames) }            \
 693                .debug_typenames 0 : { *(.debug_typenames) }            \
 694                .debug_varnames  0 : { *(.debug_varnames) }             \
 695                /* GNU DWARF 2 extensions */                            \
 696                .debug_gnu_pubnames 0 : { *(.debug_gnu_pubnames) }      \
 697                .debug_gnu_pubtypes 0 : { *(.debug_gnu_pubtypes) }      \
 698                /* DWARF 4 */                                           \
 699                .debug_types    0 : { *(.debug_types) }                 \
 700                /* DWARF 5 */                                           \
 701                .debug_macro    0 : { *(.debug_macro) }                 \
 702                .debug_addr     0 : { *(.debug_addr) }
 703
 704                /* Stabs debugging sections.  */
 705#define STABS_DEBUG                                                     \
 706                .stab 0 : { *(.stab) }                                  \
 707                .stabstr 0 : { *(.stabstr) }                            \
 708                .stab.excl 0 : { *(.stab.excl) }                        \
 709                .stab.exclstr 0 : { *(.stab.exclstr) }                  \
 710                .stab.index 0 : { *(.stab.index) }                      \
 711                .stab.indexstr 0 : { *(.stab.indexstr) }                \
 712                .comment 0 : { *(.comment) }
 713
 714#ifdef CONFIG_GENERIC_BUG
 715#define BUG_TABLE                                                       \
 716        . = ALIGN(8);                                                   \
 717        __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) {             \
 718                __start___bug_table = .;                                \
 719                KEEP(*(__bug_table))                                    \
 720                __stop___bug_table = .;                                 \
 721        }
 722#else
 723#define BUG_TABLE
 724#endif
 725
 726#ifdef CONFIG_UNWINDER_ORC
 727#define ORC_UNWIND_TABLE                                                \
 728        . = ALIGN(4);                                                   \
 729        .orc_unwind_ip : AT(ADDR(.orc_unwind_ip) - LOAD_OFFSET) {       \
 730                __start_orc_unwind_ip = .;                              \
 731                KEEP(*(.orc_unwind_ip))                                 \
 732                __stop_orc_unwind_ip = .;                               \
 733        }                                                               \
 734        . = ALIGN(6);                                                   \
 735        .orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) {             \
 736                __start_orc_unwind = .;                                 \
 737                KEEP(*(.orc_unwind))                                    \
 738                __stop_orc_unwind = .;                                  \
 739        }                                                               \
 740        . = ALIGN(4);                                                   \
 741        .orc_lookup : AT(ADDR(.orc_lookup) - LOAD_OFFSET) {             \
 742                orc_lookup = .;                                         \
 743                . += (((SIZEOF(.text) + LOOKUP_BLOCK_SIZE - 1) /        \
 744                        LOOKUP_BLOCK_SIZE) + 1) * 4;                    \
 745                orc_lookup_end = .;                                     \
 746        }
 747#else
 748#define ORC_UNWIND_TABLE
 749#endif
 750
 751#ifdef CONFIG_PM_TRACE
 752#define TRACEDATA                                                       \
 753        . = ALIGN(4);                                                   \
 754        .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {               \
 755                __tracedata_start = .;                                  \
 756                KEEP(*(.tracedata))                                     \
 757                __tracedata_end = .;                                    \
 758        }
 759#else
 760#define TRACEDATA
 761#endif
 762
 763#define NOTES                                                           \
 764        .notes : AT(ADDR(.notes) - LOAD_OFFSET) {                       \
 765                __start_notes = .;                                      \
 766                KEEP(*(.note.*))                                        \
 767                __stop_notes = .;                                       \
 768        }
 769
 770#define INIT_SETUP(initsetup_align)                                     \
 771                . = ALIGN(initsetup_align);                             \
 772                __setup_start = .;                                      \
 773                KEEP(*(.init.setup))                                    \
 774                __setup_end = .;
 775
 776#define INIT_CALLS_LEVEL(level)                                         \
 777                __initcall##level##_start = .;                          \
 778                KEEP(*(.initcall##level##.init))                        \
 779                KEEP(*(.initcall##level##s.init))                       \
 780
 781#define INIT_CALLS                                                      \
 782                __initcall_start = .;                                   \
 783                KEEP(*(.initcallearly.init))                            \
 784                INIT_CALLS_LEVEL(0)                                     \
 785                INIT_CALLS_LEVEL(1)                                     \
 786                INIT_CALLS_LEVEL(2)                                     \
 787                INIT_CALLS_LEVEL(3)                                     \
 788                INIT_CALLS_LEVEL(4)                                     \
 789                INIT_CALLS_LEVEL(5)                                     \
 790                INIT_CALLS_LEVEL(rootfs)                                \
 791                INIT_CALLS_LEVEL(6)                                     \
 792                INIT_CALLS_LEVEL(7)                                     \
 793                __initcall_end = .;
 794
 795#define CON_INITCALL                                                    \
 796                __con_initcall_start = .;                               \
 797                KEEP(*(.con_initcall.init))                             \
 798                __con_initcall_end = .;
 799
 800#define SECURITY_INITCALL                                               \
 801                __security_initcall_start = .;                          \
 802                KEEP(*(.security_initcall.init))                        \
 803                __security_initcall_end = .;
 804
 805#ifdef CONFIG_BLK_DEV_INITRD
 806#define INIT_RAM_FS                                                     \
 807        . = ALIGN(4);                                                   \
 808        __initramfs_start = .;                                          \
 809        KEEP(*(.init.ramfs))                                            \
 810        . = ALIGN(8);                                                   \
 811        KEEP(*(.init.ramfs.info))
 812#else
 813#define INIT_RAM_FS
 814#endif
 815
 816/*
 817 * Memory encryption operates on a page basis. Since we need to clear
 818 * the memory encryption mask for this section, it needs to be aligned
 819 * on a page boundary and be a page-size multiple in length.
 820 *
 821 * Note: We use a separate section so that only this section gets
 822 * decrypted to avoid exposing more than we wish.
 823 */
 824#ifdef CONFIG_AMD_MEM_ENCRYPT
 825#define PERCPU_DECRYPTED_SECTION                                        \
 826        . = ALIGN(PAGE_SIZE);                                           \
 827        *(.data..percpu..decrypted)                                     \
 828        . = ALIGN(PAGE_SIZE);
 829#else
 830#define PERCPU_DECRYPTED_SECTION
 831#endif
 832
 833
 834/*
 835 * Default discarded sections.
 836 *
 837 * Some archs want to discard exit text/data at runtime rather than
 838 * link time due to cross-section references such as alt instructions,
 839 * bug table, eh_frame, etc.  DISCARDS must be the last of output
 840 * section definitions so that such archs put those in earlier section
 841 * definitions.
 842 */
 843#define DISCARDS                                                        \
 844        /DISCARD/ : {                                                   \
 845        EXIT_TEXT                                                       \
 846        EXIT_DATA                                                       \
 847        EXIT_CALL                                                       \
 848        *(.discard)                                                     \
 849        *(.discard.*)                                                   \
 850        }
 851
 852/**
 853 * PERCPU_INPUT - the percpu input sections
 854 * @cacheline: cacheline size
 855 *
 856 * The core percpu section names and core symbols which do not rely
 857 * directly upon load addresses.
 858 *
 859 * @cacheline is used to align subsections to avoid false cacheline
 860 * sharing between subsections for different purposes.
 861 */
 862#define PERCPU_INPUT(cacheline)                                         \
 863        __per_cpu_start = .;                                            \
 864        *(.data..percpu..first)                                         \
 865        . = ALIGN(PAGE_SIZE);                                           \
 866        *(.data..percpu..page_aligned)                                  \
 867        . = ALIGN(cacheline);                                           \
 868        *(.data..percpu..read_mostly)                                   \
 869        . = ALIGN(cacheline);                                           \
 870        *(.data..percpu)                                                \
 871        *(.data..percpu..shared_aligned)                                \
 872        PERCPU_DECRYPTED_SECTION                                        \
 873        __per_cpu_end = .;
 874
 875/**
 876 * PERCPU_VADDR - define output section for percpu area
 877 * @cacheline: cacheline size
 878 * @vaddr: explicit base address (optional)
 879 * @phdr: destination PHDR (optional)
 880 *
 881 * Macro which expands to output section for percpu area.
 882 *
 883 * @cacheline is used to align subsections to avoid false cacheline
 884 * sharing between subsections for different purposes.
 885 *
 886 * If @vaddr is not blank, it specifies explicit base address and all
 887 * percpu symbols will be offset from the given address.  If blank,
 888 * @vaddr always equals @laddr + LOAD_OFFSET.
 889 *
 890 * @phdr defines the output PHDR to use if not blank.  Be warned that
 891 * output PHDR is sticky.  If @phdr is specified, the next output
 892 * section in the linker script will go there too.  @phdr should have
 893 * a leading colon.
 894 *
 895 * Note that this macros defines __per_cpu_load as an absolute symbol.
 896 * If there is no need to put the percpu section at a predetermined
 897 * address, use PERCPU_SECTION.
 898 */
 899#define PERCPU_VADDR(cacheline, vaddr, phdr)                            \
 900        __per_cpu_load = .;                                             \
 901        .data..percpu vaddr : AT(__per_cpu_load - LOAD_OFFSET) {        \
 902                PERCPU_INPUT(cacheline)                                 \
 903        } phdr                                                          \
 904        . = __per_cpu_load + SIZEOF(.data..percpu);
 905
 906/**
 907 * PERCPU_SECTION - define output section for percpu area, simple version
 908 * @cacheline: cacheline size
 909 *
 910 * Align to PAGE_SIZE and outputs output section for percpu area.  This
 911 * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and
 912 * __per_cpu_start will be identical.
 913 *
 914 * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,)
 915 * except that __per_cpu_load is defined as a relative symbol against
 916 * .data..percpu which is required for relocatable x86_32 configuration.
 917 */
 918#define PERCPU_SECTION(cacheline)                                       \
 919        . = ALIGN(PAGE_SIZE);                                           \
 920        .data..percpu   : AT(ADDR(.data..percpu) - LOAD_OFFSET) {       \
 921                __per_cpu_load = .;                                     \
 922                PERCPU_INPUT(cacheline)                                 \
 923        }
 924
 925
 926/*
 927 * Definition of the high level *_SECTION macros
 928 * They will fit only a subset of the architectures
 929 */
 930
 931
 932/*
 933 * Writeable data.
 934 * All sections are combined in a single .data section.
 935 * The sections following CONSTRUCTORS are arranged so their
 936 * typical alignment matches.
 937 * A cacheline is typical/always less than a PAGE_SIZE so
 938 * the sections that has this restriction (or similar)
 939 * is located before the ones requiring PAGE_SIZE alignment.
 940 * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which
 941 * matches the requirement of PAGE_ALIGNED_DATA.
 942 *
 943 * use 0 as page_align if page_aligned data is not used */
 944#define RW_DATA_SECTION(cacheline, pagealigned, inittask)               \
 945        . = ALIGN(PAGE_SIZE);                                           \
 946        .data : AT(ADDR(.data) - LOAD_OFFSET) {                         \
 947                INIT_TASK_DATA(inittask)                                \
 948                NOSAVE_DATA                                             \
 949                PAGE_ALIGNED_DATA(pagealigned)                          \
 950                CACHELINE_ALIGNED_DATA(cacheline)                       \
 951                READ_MOSTLY_DATA(cacheline)                             \
 952                DATA_DATA                                               \
 953                CONSTRUCTORS                                            \
 954        }                                                               \
 955        BUG_TABLE                                                       \
 956
 957#define INIT_TEXT_SECTION(inittext_align)                               \
 958        . = ALIGN(inittext_align);                                      \
 959        .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {               \
 960                _sinittext = .;                                         \
 961                INIT_TEXT                                               \
 962                _einittext = .;                                         \
 963        }
 964
 965#define INIT_DATA_SECTION(initsetup_align)                              \
 966        .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {               \
 967                INIT_DATA                                               \
 968                INIT_SETUP(initsetup_align)                             \
 969                INIT_CALLS                                              \
 970                CON_INITCALL                                            \
 971                SECURITY_INITCALL                                       \
 972                INIT_RAM_FS                                             \
 973        }
 974
 975#define BSS_SECTION(sbss_align, bss_align, stop_align)                  \
 976        . = ALIGN(sbss_align);                                          \
 977        __bss_start = .;                                                \
 978        SBSS(sbss_align)                                                \
 979        BSS(bss_align)                                                  \
 980        . = ALIGN(stop_align);                                          \
 981        __bss_stop = .;
 982