root/include/asm-generic/vmlinux.lds.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */