1ef53dae8SSam Ravnborg /* 2ef53dae8SSam Ravnborg * Helper macros to support writing architecture specific 3ef53dae8SSam Ravnborg * linker scripts. 4ef53dae8SSam Ravnborg * 5ef53dae8SSam Ravnborg * A minimal linker scripts has following content: 6ef53dae8SSam Ravnborg * [This is a sample, architectures may have special requiriements] 7ef53dae8SSam Ravnborg * 8ef53dae8SSam Ravnborg * OUTPUT_FORMAT(...) 9ef53dae8SSam Ravnborg * OUTPUT_ARCH(...) 10ef53dae8SSam Ravnborg * ENTRY(...) 11ef53dae8SSam Ravnborg * SECTIONS 12ef53dae8SSam Ravnborg * { 13ef53dae8SSam Ravnborg * . = START; 14ef53dae8SSam Ravnborg * __init_begin = .; 157923f90fSSam Ravnborg * HEAD_TEXT_SECTION 16ef53dae8SSam Ravnborg * INIT_TEXT_SECTION(PAGE_SIZE) 17ef53dae8SSam Ravnborg * INIT_DATA_SECTION(...) 180415b00dSTejun Heo * PERCPU_SECTION(CACHELINE_SIZE) 19ef53dae8SSam Ravnborg * __init_end = .; 20ef53dae8SSam Ravnborg * 21ef53dae8SSam Ravnborg * _stext = .; 22ef53dae8SSam Ravnborg * TEXT_SECTION = 0 23ef53dae8SSam Ravnborg * _etext = .; 24ef53dae8SSam Ravnborg * 25ef53dae8SSam Ravnborg * _sdata = .; 2693240b32SKees Cook * RO_DATA(PAGE_SIZE) 27ef53dae8SSam Ravnborg * RW_DATA_SECTION(...) 28ef53dae8SSam Ravnborg * _edata = .; 29ef53dae8SSam Ravnborg * 30ef53dae8SSam Ravnborg * EXCEPTION_TABLE(...) 31ef53dae8SSam Ravnborg * 3204e448d9STim Abbott * BSS_SECTION(0, 0, 0) 33ef53dae8SSam Ravnborg * _end = .; 34ef53dae8SSam Ravnborg * 35ef53dae8SSam Ravnborg * STABS_DEBUG 36ef53dae8SSam Ravnborg * DWARF_DEBUG 37023bf6f1STejun Heo * 38023bf6f1STejun Heo * DISCARDS // must be the last 39ef53dae8SSam Ravnborg * } 40ef53dae8SSam Ravnborg * 41ef53dae8SSam Ravnborg * [__init_begin, __init_end] is the init section that may be freed after init 42562c85caSYalin Wang * // __init_begin and __init_end should be page aligned, so that we can 43562c85caSYalin Wang * // free the whole .init memory 44ef53dae8SSam Ravnborg * [_stext, _etext] is the text section 45ef53dae8SSam Ravnborg * [_sdata, _edata] is the data section 46ef53dae8SSam Ravnborg * 47ef53dae8SSam Ravnborg * Some of the included output section have their own set of constants. 48ef53dae8SSam Ravnborg * Examples are: [__initramfs_start, __initramfs_end] for initramfs and 49ef53dae8SSam Ravnborg * [__nosave_begin, __nosave_end] for the nosave data 50ef53dae8SSam Ravnborg */ 51c80d471aSTim Abbott 521da177e4SLinus Torvalds #ifndef LOAD_OFFSET 531da177e4SLinus Torvalds #define LOAD_OFFSET 0 541da177e4SLinus Torvalds #endif 551da177e4SLinus Torvalds 56441110a5SKees Cook /* 57441110a5SKees Cook * Only some architectures want to have the .notes segment visible in 58fbe6a8e6SKees Cook * a separate PT_NOTE ELF Program Header. When this happens, it needs 59fbe6a8e6SKees Cook * to be visible in both the kernel text's PT_LOAD and the PT_NOTE 60fbe6a8e6SKees Cook * Program Headers. In this case, though, the PT_LOAD needs to be made 61fbe6a8e6SKees Cook * the default again so that all the following sections don't also end 62fbe6a8e6SKees Cook * up in the PT_NOTE Program Header. 63441110a5SKees Cook */ 64441110a5SKees Cook #ifdef EMITS_PT_NOTE 65441110a5SKees Cook #define NOTES_HEADERS :text :note 66fbe6a8e6SKees Cook #define NOTES_HEADERS_RESTORE __restore_ph : { *(.__restore_ph) } :text 67fbe6a8e6SKees Cook #else 68fbe6a8e6SKees Cook #define NOTES_HEADERS 69fbe6a8e6SKees Cook #define NOTES_HEADERS_RESTORE 70441110a5SKees Cook #endif 71441110a5SKees Cook 726d30e3a8SSam Ravnborg /* Align . to a 8 byte boundary equals to maximum function alignment. */ 736d30e3a8SSam Ravnborg #define ALIGN_FUNCTION() . = ALIGN(8) 746d30e3a8SSam Ravnborg 7507fca0e5SSam Ravnborg /* 76cb87481eSNicholas Piggin * LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections, which 77cb87481eSNicholas Piggin * generates .data.identifier sections, which need to be pulled in with 78cb87481eSNicholas Piggin * .data. We don't want to pull in .data..other sections, which Linux 79cb87481eSNicholas Piggin * has defined. Same for text and bss. 80266ff2a8SNicholas Piggin * 81266ff2a8SNicholas Piggin * RODATA_MAIN is not used because existing code already defines .rodata.x 82266ff2a8SNicholas Piggin * sections to be brought in with rodata. 83cb87481eSNicholas Piggin */ 84cb87481eSNicholas Piggin #ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION 85cb87481eSNicholas Piggin #define TEXT_MAIN .text .text.[0-9a-zA-Z_]* 8652c8ee5bSPeter Oberparleiter #define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..LPBX* 87266ff2a8SNicholas Piggin #define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]* 88266ff2a8SNicholas Piggin #define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]* 89cb87481eSNicholas Piggin #define BSS_MAIN .bss .bss.[0-9a-zA-Z_]* 90266ff2a8SNicholas Piggin #define SBSS_MAIN .sbss .sbss.[0-9a-zA-Z_]* 91cb87481eSNicholas Piggin #else 92cb87481eSNicholas Piggin #define TEXT_MAIN .text 93cb87481eSNicholas Piggin #define DATA_MAIN .data 94266ff2a8SNicholas Piggin #define SDATA_MAIN .sdata 95266ff2a8SNicholas Piggin #define RODATA_MAIN .rodata 96cb87481eSNicholas Piggin #define BSS_MAIN .bss 97266ff2a8SNicholas Piggin #define SBSS_MAIN .sbss 98cb87481eSNicholas Piggin #endif 99cb87481eSNicholas Piggin 100cb87481eSNicholas Piggin /* 10107fca0e5SSam Ravnborg * Align to a 32 byte boundary equal to the 10207fca0e5SSam Ravnborg * alignment gcc 4.5 uses for a struct 10307fca0e5SSam Ravnborg */ 104aab94339SDirk Brandewie #define STRUCT_ALIGNMENT 32 105aab94339SDirk Brandewie #define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT) 10607fca0e5SSam Ravnborg 107eb8f6890SSam Ravnborg /* The actual configuration determine if the init/exit sections 108eb8f6890SSam Ravnborg * are handled as text/data or they can be discarded (which 109eb8f6890SSam Ravnborg * often happens at runtime) 110eb8f6890SSam Ravnborg */ 111eb8f6890SSam Ravnborg #ifdef CONFIG_HOTPLUG_CPU 112eb8f6890SSam Ravnborg #define CPU_KEEP(sec) *(.cpu##sec) 113eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) 114eb8f6890SSam Ravnborg #else 115eb8f6890SSam Ravnborg #define CPU_KEEP(sec) 116eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) *(.cpu##sec) 117eb8f6890SSam Ravnborg #endif 118eb8f6890SSam Ravnborg 1191a3fb6d4SAdrian Bunk #if defined(CONFIG_MEMORY_HOTPLUG) 120eb8f6890SSam Ravnborg #define MEM_KEEP(sec) *(.mem##sec) 121eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) 122eb8f6890SSam Ravnborg #else 123eb8f6890SSam Ravnborg #define MEM_KEEP(sec) 124eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) *(.mem##sec) 125eb8f6890SSam Ravnborg #endif 126eb8f6890SSam Ravnborg 1278da3821bSSteven Rostedt #ifdef CONFIG_FTRACE_MCOUNT_RECORD 1286ca63662SSven Schnelle #ifdef CC_USING_PATCHABLE_FUNCTION_ENTRY 1296ca63662SSven Schnelle #define MCOUNT_REC() . = ALIGN(8); \ 1306ca63662SSven Schnelle __start_mcount_loc = .; \ 1316ca63662SSven Schnelle KEEP(*(__patchable_function_entries)) \ 1326ca63662SSven Schnelle __stop_mcount_loc = .; 1336ca63662SSven Schnelle #else 1344b3b4c5eSJohn Reiser #define MCOUNT_REC() . = ALIGN(8); \ 135a6214385SMasahiro Yamada __start_mcount_loc = .; \ 136266ff2a8SNicholas Piggin KEEP(*(__mcount_loc)) \ 137a6214385SMasahiro Yamada __stop_mcount_loc = .; 1386ca63662SSven Schnelle #endif 1398da3821bSSteven Rostedt #else 1408da3821bSSteven Rostedt #define MCOUNT_REC() 1418da3821bSSteven Rostedt #endif 142eb8f6890SSam Ravnborg 1432ed84eebSSteven Rostedt #ifdef CONFIG_TRACE_BRANCH_PROFILING 144a6214385SMasahiro Yamada #define LIKELY_PROFILE() __start_annotated_branch_profile = .; \ 145266ff2a8SNicholas Piggin KEEP(*(_ftrace_annotated_branch)) \ 146a6214385SMasahiro Yamada __stop_annotated_branch_profile = .; 1471f0d69a9SSteven Rostedt #else 1481f0d69a9SSteven Rostedt #define LIKELY_PROFILE() 1491f0d69a9SSteven Rostedt #endif 1501f0d69a9SSteven Rostedt 1512bcd521aSSteven Rostedt #ifdef CONFIG_PROFILE_ALL_BRANCHES 152a6214385SMasahiro Yamada #define BRANCH_PROFILE() __start_branch_profile = .; \ 153266ff2a8SNicholas Piggin KEEP(*(_ftrace_branch)) \ 154a6214385SMasahiro Yamada __stop_branch_profile = .; 1552bcd521aSSteven Rostedt #else 1562bcd521aSSteven Rostedt #define BRANCH_PROFILE() 1572bcd521aSSteven Rostedt #endif 1582bcd521aSSteven Rostedt 159376e2424SMasami Hiramatsu #ifdef CONFIG_KPROBES 16069902c71SVineet Gupta #define KPROBE_BLACKLIST() . = ALIGN(8); \ 161a6214385SMasahiro Yamada __start_kprobe_blacklist = .; \ 1624b89b7f7SNicholas Piggin KEEP(*(_kprobe_blacklist)) \ 163a6214385SMasahiro Yamada __stop_kprobe_blacklist = .; 164376e2424SMasami Hiramatsu #else 165376e2424SMasami Hiramatsu #define KPROBE_BLACKLIST() 166376e2424SMasami Hiramatsu #endif 167376e2424SMasami Hiramatsu 168540adea3SMasami Hiramatsu #ifdef CONFIG_FUNCTION_ERROR_INJECTION 169663faf9fSMasami Hiramatsu #define ERROR_INJECT_WHITELIST() STRUCT_ALIGN(); \ 170a6214385SMasahiro Yamada __start_error_injection_whitelist = .; \ 171540adea3SMasami Hiramatsu KEEP(*(_error_injection_whitelist)) \ 172a6214385SMasahiro Yamada __stop_error_injection_whitelist = .; 17392ace999SJosef Bacik #else 174540adea3SMasami Hiramatsu #define ERROR_INJECT_WHITELIST() 17592ace999SJosef Bacik #endif 17692ace999SJosef Bacik 1775f77a88bSTom Zanussi #ifdef CONFIG_EVENT_TRACING 178e4a9ea5eSSteven Rostedt #define FTRACE_EVENTS() . = ALIGN(8); \ 179a6214385SMasahiro Yamada __start_ftrace_events = .; \ 1804b89b7f7SNicholas Piggin KEEP(*(_ftrace_events)) \ 181a6214385SMasahiro Yamada __stop_ftrace_events = .; \ 182a6214385SMasahiro Yamada __start_ftrace_eval_maps = .; \ 18302fd7f68SJeremy Linton KEEP(*(_ftrace_eval_map)) \ 184a6214385SMasahiro Yamada __stop_ftrace_eval_maps = .; 185b77e38aaSSteven Rostedt #else 186b77e38aaSSteven Rostedt #define FTRACE_EVENTS() 187b77e38aaSSteven Rostedt #endif 188b77e38aaSSteven Rostedt 1891ba28e02SLai Jiangshan #ifdef CONFIG_TRACING 190a6214385SMasahiro Yamada #define TRACE_PRINTKS() __start___trace_bprintk_fmt = .; \ 1914b89b7f7SNicholas Piggin KEEP(*(__trace_printk_fmt)) /* Trace_printk fmt' pointer */ \ 192a6214385SMasahiro Yamada __stop___trace_bprintk_fmt = .; 193a6214385SMasahiro Yamada #define TRACEPOINT_STR() __start___tracepoint_str = .; \ 1944b89b7f7SNicholas Piggin KEEP(*(__tracepoint_str)) /* Trace_printk fmt' pointer */ \ 195a6214385SMasahiro Yamada __stop___tracepoint_str = .; 1961ba28e02SLai Jiangshan #else 1971ba28e02SLai Jiangshan #define TRACE_PRINTKS() 198102c9323SSteven Rostedt (Red Hat) #define TRACEPOINT_STR() 1991ba28e02SLai Jiangshan #endif 2001ba28e02SLai Jiangshan 201bed1ffcaSFrederic Weisbecker #ifdef CONFIG_FTRACE_SYSCALLS 2023d56e331SSteven Rostedt #define TRACE_SYSCALLS() . = ALIGN(8); \ 203a6214385SMasahiro Yamada __start_syscalls_metadata = .; \ 2044b89b7f7SNicholas Piggin KEEP(*(__syscalls_metadata)) \ 205a6214385SMasahiro Yamada __stop_syscalls_metadata = .; 206bed1ffcaSFrederic Weisbecker #else 207bed1ffcaSFrederic Weisbecker #define TRACE_SYSCALLS() 208bed1ffcaSFrederic Weisbecker #endif 209bed1ffcaSFrederic Weisbecker 210c4f6699dSAlexei Starovoitov #ifdef CONFIG_BPF_EVENTS 211c4f6699dSAlexei Starovoitov #define BPF_RAW_TP() STRUCT_ALIGN(); \ 212a6214385SMasahiro Yamada __start__bpf_raw_tp = .; \ 213c4f6699dSAlexei Starovoitov KEEP(*(__bpf_raw_tp_map)) \ 214a6214385SMasahiro Yamada __stop__bpf_raw_tp = .; 215c4f6699dSAlexei Starovoitov #else 216c4f6699dSAlexei Starovoitov #define BPF_RAW_TP() 217c4f6699dSAlexei Starovoitov #endif 218c4f6699dSAlexei Starovoitov 219470ca0deSPeter Hurley #ifdef CONFIG_SERIAL_EARLYCON 220dd709e72SDaniel Kurtz #define EARLYCON_TABLE() . = ALIGN(8); \ 221a6214385SMasahiro Yamada __earlycon_table = .; \ 2224b89b7f7SNicholas Piggin KEEP(*(__earlycon_table)) \ 223a6214385SMasahiro Yamada __earlycon_table_end = .; 224470ca0deSPeter Hurley #else 225470ca0deSPeter Hurley #define EARLYCON_TABLE() 226470ca0deSPeter Hurley #endif 227aab94339SDirk Brandewie 2283ac946d1SKees Cook #ifdef CONFIG_SECURITY 2293ac946d1SKees Cook #define LSM_TABLE() . = ALIGN(8); \ 2303ac946d1SKees Cook __start_lsm_info = .; \ 2313ac946d1SKees Cook KEEP(*(.lsm_info.init)) \ 2323ac946d1SKees Cook __end_lsm_info = .; 233e6b1db98SMatthew Garrett #define EARLY_LSM_TABLE() . = ALIGN(8); \ 234e6b1db98SMatthew Garrett __start_early_lsm_info = .; \ 235e6b1db98SMatthew Garrett KEEP(*(.early_lsm_info.init)) \ 236e6b1db98SMatthew Garrett __end_early_lsm_info = .; 2373ac946d1SKees Cook #else 2383ac946d1SKees Cook #define LSM_TABLE() 239e6b1db98SMatthew Garrett #define EARLY_LSM_TABLE() 2403ac946d1SKees Cook #endif 2413ac946d1SKees Cook 24206309288SRob Herring #define ___OF_TABLE(cfg, name) _OF_TABLE_##cfg(name) 24306309288SRob Herring #define __OF_TABLE(cfg, name) ___OF_TABLE(cfg, name) 2445ee02af1SMasahiro Yamada #define OF_TABLE(cfg, name) __OF_TABLE(IS_ENABLED(cfg), name) 24506309288SRob Herring #define _OF_TABLE_0(name) 24606309288SRob Herring #define _OF_TABLE_1(name) \ 247f6e916b8SThomas Petazzoni . = ALIGN(8); \ 248a6214385SMasahiro Yamada __##name##_of_table = .; \ 2494b89b7f7SNicholas Piggin KEEP(*(__##name##_of_table)) \ 2504b89b7f7SNicholas Piggin KEEP(*(__##name##_of_table_end)) 251aab94339SDirk Brandewie 252bb0eb050SDaniel Lezcano #define TIMER_OF_TABLES() OF_TABLE(CONFIG_TIMER_OF, timer) 25306309288SRob Herring #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip) 25406309288SRob Herring #define CLK_OF_TABLES() OF_TABLE(CONFIG_COMMON_CLK, clk) 25506309288SRob Herring #define RESERVEDMEM_OF_TABLES() OF_TABLE(CONFIG_OF_RESERVED_MEM, reservedmem) 25606309288SRob Herring #define CPU_METHOD_OF_TABLES() OF_TABLE(CONFIG_SMP, cpu_method) 257449e056cSDaniel Lezcano #define CPUIDLE_METHOD_OF_TABLES() OF_TABLE(CONFIG_CPU_IDLE, cpuidle_method) 2586c3ff8b1SStephen Boyd 259e647b532SMarc Zyngier #ifdef CONFIG_ACPI 260e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name) \ 261e647b532SMarc Zyngier . = ALIGN(8); \ 262a6214385SMasahiro Yamada __##name##_acpi_probe_table = .; \ 2634b89b7f7SNicholas Piggin KEEP(*(__##name##_acpi_probe_table)) \ 264a6214385SMasahiro Yamada __##name##_acpi_probe_table_end = .; 265e647b532SMarc Zyngier #else 266e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name) 267e647b532SMarc Zyngier #endif 268e647b532SMarc Zyngier 269980af75eSDaniel Lezcano #ifdef CONFIG_THERMAL 270980af75eSDaniel Lezcano #define THERMAL_TABLE(name) \ 271980af75eSDaniel Lezcano . = ALIGN(8); \ 272980af75eSDaniel Lezcano __##name##_thermal_table = .; \ 273980af75eSDaniel Lezcano KEEP(*(__##name##_thermal_table)) \ 274980af75eSDaniel Lezcano __##name##_thermal_table_end = .; 275980af75eSDaniel Lezcano #else 276980af75eSDaniel Lezcano #define THERMAL_TABLE(name) 277980af75eSDaniel Lezcano #endif 278980af75eSDaniel Lezcano 279aab94339SDirk Brandewie #define KERNEL_DTB() \ 280aab94339SDirk Brandewie STRUCT_ALIGN(); \ 281a6214385SMasahiro Yamada __dtb_start = .; \ 2824b89b7f7SNicholas Piggin KEEP(*(.dtb.init.rodata)) \ 283a6214385SMasahiro Yamada __dtb_end = .; 284aab94339SDirk Brandewie 285b67067f1SNicholas Piggin /* 286b67067f1SNicholas Piggin * .data section 287b67067f1SNicholas Piggin */ 288ca967258SSam Ravnborg #define DATA_DATA \ 289129f6c48SArnd Bergmann *(.xiptext) \ 290cb87481eSNicholas Piggin *(DATA_MAIN) \ 291312b1485SSam Ravnborg *(.ref.data) \ 292d356c0b6SMike Frysinger *(.data..shared_aligned) /* percpu related */ \ 293266ff2a8SNicholas Piggin MEM_KEEP(init.data*) \ 294266ff2a8SNicholas Piggin MEM_KEEP(exit.data*) \ 2957ccaba53SJan Beulich *(.data.unlikely) \ 296a6214385SMasahiro Yamada __start_once = .; \ 297b1fca27dSAndi Kleen *(.data.once) \ 298a6214385SMasahiro Yamada __end_once = .; \ 29965498646SMathieu Desnoyers STRUCT_ALIGN(); \ 30097e1c18eSMathieu Desnoyers *(__tracepoints) \ 301e9d376f0SJason Baron /* implement dynamic printk debug */ \ 302e9d376f0SJason Baron . = ALIGN(8); \ 303a6214385SMasahiro Yamada __start___verbose = .; \ 3044b89b7f7SNicholas Piggin KEEP(*(__verbose)) \ 305a6214385SMasahiro Yamada __stop___verbose = .; \ 3062bcd521aSSteven Rostedt LIKELY_PROFILE() \ 307b77e38aaSSteven Rostedt BRANCH_PROFILE() \ 308102c9323SSteven Rostedt (Red Hat) TRACE_PRINTKS() \ 309c4f6699dSAlexei Starovoitov BPF_RAW_TP() \ 310102c9323SSteven Rostedt (Red Hat) TRACEPOINT_STR() 311ca967258SSam Ravnborg 312ef53dae8SSam Ravnborg /* 313ef53dae8SSam Ravnborg * Data section helpers 314ef53dae8SSam Ravnborg */ 315ef53dae8SSam Ravnborg #define NOSAVE_DATA \ 316ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 317a6214385SMasahiro Yamada __nosave_begin = .; \ 31807b3bb1eSDenys Vlasenko *(.data..nosave) \ 319ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 320a6214385SMasahiro Yamada __nosave_end = .; 321ef53dae8SSam Ravnborg 322ef53dae8SSam Ravnborg #define PAGE_ALIGNED_DATA(page_align) \ 323ef53dae8SSam Ravnborg . = ALIGN(page_align); \ 32475b13483STim Abbott *(.data..page_aligned) 325ef53dae8SSam Ravnborg 326ef53dae8SSam Ravnborg #define READ_MOSTLY_DATA(align) \ 327ef53dae8SSam Ravnborg . = ALIGN(align); \ 3288369744fSShaohua Li *(.data..read_mostly) \ 3298369744fSShaohua Li . = ALIGN(align); 330ef53dae8SSam Ravnborg 331ef53dae8SSam Ravnborg #define CACHELINE_ALIGNED_DATA(align) \ 332ef53dae8SSam Ravnborg . = ALIGN(align); \ 3334af57b78STim Abbott *(.data..cacheline_aligned) 334ef53dae8SSam Ravnborg 33539a449d9STim Abbott #define INIT_TASK_DATA(align) \ 336ef53dae8SSam Ravnborg . = ALIGN(align); \ 337a6214385SMasahiro Yamada __start_init_task = .; \ 338a6214385SMasahiro Yamada init_thread_union = .; \ 339a6214385SMasahiro Yamada init_stack = .; \ 340266ff2a8SNicholas Piggin KEEP(*(.data..init_task)) \ 341266ff2a8SNicholas Piggin KEEP(*(.data..init_thread_info)) \ 342a6214385SMasahiro Yamada . = __start_init_task + THREAD_SIZE; \ 343a6214385SMasahiro Yamada __end_init_task = .; 344ef53dae8SSam Ravnborg 345e872267bSArd Biesheuvel #define JUMP_TABLE_DATA \ 346e872267bSArd Biesheuvel . = ALIGN(8); \ 347e872267bSArd Biesheuvel __start___jump_table = .; \ 348e872267bSArd Biesheuvel KEEP(*(__jump_table)) \ 349e872267bSArd Biesheuvel __stop___jump_table = .; 350e872267bSArd Biesheuvel 351ef53dae8SSam Ravnborg /* 35232fb2fc5SHeiko Carstens * Allow architectures to handle ro_after_init data on their 35332fb2fc5SHeiko Carstens * own by defining an empty RO_AFTER_INIT_DATA. 35432fb2fc5SHeiko Carstens */ 35532fb2fc5SHeiko Carstens #ifndef RO_AFTER_INIT_DATA 356d7c19b06SJakub Kicinski #define RO_AFTER_INIT_DATA \ 357a6214385SMasahiro Yamada __start_ro_after_init = .; \ 358d7c19b06SJakub Kicinski *(.data..ro_after_init) \ 359e872267bSArd Biesheuvel JUMP_TABLE_DATA \ 360a6214385SMasahiro Yamada __end_ro_after_init = .; 36132fb2fc5SHeiko Carstens #endif 36232fb2fc5SHeiko Carstens 36332fb2fc5SHeiko Carstens /* 364ef53dae8SSam Ravnborg * Read only Data 365ef53dae8SSam Ravnborg */ 36693240b32SKees Cook #define RO_DATA(align) \ 3674096b46fSSam Ravnborg . = ALIGN((align)); \ 3681da177e4SLinus Torvalds .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ 369a6214385SMasahiro Yamada __start_rodata = .; \ 3701da177e4SLinus Torvalds *(.rodata) *(.rodata.*) \ 37132fb2fc5SHeiko Carstens RO_AFTER_INIT_DATA /* Read only after init */ \ 37265498646SMathieu Desnoyers . = ALIGN(8); \ 373a6214385SMasahiro Yamada __start___tracepoints_ptrs = .; \ 3744b89b7f7SNicholas Piggin KEEP(*(__tracepoints_ptrs)) /* Tracepoints: pointer array */ \ 375a6214385SMasahiro Yamada __stop___tracepoints_ptrs = .; \ 37697e1c18eSMathieu Desnoyers *(__tracepoints_strings)/* Tracepoints: strings */ \ 3771da177e4SLinus Torvalds } \ 3781da177e4SLinus Torvalds \ 3791da177e4SLinus Torvalds .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \ 3801da177e4SLinus Torvalds *(.rodata1) \ 3811da177e4SLinus Torvalds } \ 3821da177e4SLinus Torvalds \ 3831da177e4SLinus Torvalds /* PCI quirks */ \ 3841da177e4SLinus Torvalds .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ 385a6214385SMasahiro Yamada __start_pci_fixups_early = .; \ 3864b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_early)) \ 387a6214385SMasahiro Yamada __end_pci_fixups_early = .; \ 388a6214385SMasahiro Yamada __start_pci_fixups_header = .; \ 3894b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_header)) \ 390a6214385SMasahiro Yamada __end_pci_fixups_header = .; \ 391a6214385SMasahiro Yamada __start_pci_fixups_final = .; \ 3924b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_final)) \ 393a6214385SMasahiro Yamada __end_pci_fixups_final = .; \ 394a6214385SMasahiro Yamada __start_pci_fixups_enable = .; \ 3954b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_enable)) \ 396a6214385SMasahiro Yamada __end_pci_fixups_enable = .; \ 397a6214385SMasahiro Yamada __start_pci_fixups_resume = .; \ 3984b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_resume)) \ 399a6214385SMasahiro Yamada __end_pci_fixups_resume = .; \ 400a6214385SMasahiro Yamada __start_pci_fixups_resume_early = .; \ 4014b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_resume_early)) \ 402a6214385SMasahiro Yamada __end_pci_fixups_resume_early = .; \ 403a6214385SMasahiro Yamada __start_pci_fixups_suspend = .; \ 4044b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_suspend)) \ 405a6214385SMasahiro Yamada __end_pci_fixups_suspend = .; \ 406a6214385SMasahiro Yamada __start_pci_fixups_suspend_late = .; \ 4074b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_suspend_late)) \ 408a6214385SMasahiro Yamada __end_pci_fixups_suspend_late = .; \ 4091da177e4SLinus Torvalds } \ 4101da177e4SLinus Torvalds \ 4115658c769SDavid Woodhouse /* Built-in firmware blobs */ \ 4125658c769SDavid Woodhouse .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \ 413a6214385SMasahiro Yamada __start_builtin_fw = .; \ 4144b89b7f7SNicholas Piggin KEEP(*(.builtin_fw)) \ 415a6214385SMasahiro Yamada __end_builtin_fw = .; \ 4165658c769SDavid Woodhouse } \ 4175658c769SDavid Woodhouse \ 41863687a52SJan Beulich TRACEDATA \ 41963687a52SJan Beulich \ 4201da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 4211da177e4SLinus Torvalds __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ 422a6214385SMasahiro Yamada __start___ksymtab = .; \ 423b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab+*))) \ 424a6214385SMasahiro Yamada __stop___ksymtab = .; \ 4251da177e4SLinus Torvalds } \ 4261da177e4SLinus Torvalds \ 4271da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 4281da177e4SLinus Torvalds __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ 429a6214385SMasahiro Yamada __start___ksymtab_gpl = .; \ 430b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_gpl+*))) \ 431a6214385SMasahiro Yamada __stop___ksymtab_gpl = .; \ 4321da177e4SLinus Torvalds } \ 4331da177e4SLinus Torvalds \ 434f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 435f71d20e9SArjan van de Ven __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ 436a6214385SMasahiro Yamada __start___ksymtab_unused = .; \ 437b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_unused+*))) \ 438a6214385SMasahiro Yamada __stop___ksymtab_unused = .; \ 439f71d20e9SArjan van de Ven } \ 440f71d20e9SArjan van de Ven \ 441f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 442f71d20e9SArjan van de Ven __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ 443a6214385SMasahiro Yamada __start___ksymtab_unused_gpl = .; \ 444b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_unused_gpl+*))) \ 445a6214385SMasahiro Yamada __stop___ksymtab_unused_gpl = .; \ 446f71d20e9SArjan van de Ven } \ 447f71d20e9SArjan van de Ven \ 4489f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 4499f28bb7eSGreg Kroah-Hartman __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ 450a6214385SMasahiro Yamada __start___ksymtab_gpl_future = .; \ 451b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_gpl_future+*))) \ 452a6214385SMasahiro Yamada __stop___ksymtab_gpl_future = .; \ 4539f28bb7eSGreg Kroah-Hartman } \ 4549f28bb7eSGreg Kroah-Hartman \ 4551da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 4561da177e4SLinus Torvalds __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ 457a6214385SMasahiro Yamada __start___kcrctab = .; \ 458b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab+*))) \ 459a6214385SMasahiro Yamada __stop___kcrctab = .; \ 4601da177e4SLinus Torvalds } \ 4611da177e4SLinus Torvalds \ 4621da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 4631da177e4SLinus Torvalds __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ 464a6214385SMasahiro Yamada __start___kcrctab_gpl = .; \ 465b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_gpl+*))) \ 466a6214385SMasahiro Yamada __stop___kcrctab_gpl = .; \ 4671da177e4SLinus Torvalds } \ 4681da177e4SLinus Torvalds \ 469f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 470f71d20e9SArjan van de Ven __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \ 471a6214385SMasahiro Yamada __start___kcrctab_unused = .; \ 472b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_unused+*))) \ 473a6214385SMasahiro Yamada __stop___kcrctab_unused = .; \ 474f71d20e9SArjan van de Ven } \ 475f71d20e9SArjan van de Ven \ 476f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 477f71d20e9SArjan van de Ven __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ 478a6214385SMasahiro Yamada __start___kcrctab_unused_gpl = .; \ 479b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_unused_gpl+*))) \ 480a6214385SMasahiro Yamada __stop___kcrctab_unused_gpl = .; \ 481f71d20e9SArjan van de Ven } \ 482f71d20e9SArjan van de Ven \ 4839f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 4849f28bb7eSGreg Kroah-Hartman __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ 485a6214385SMasahiro Yamada __start___kcrctab_gpl_future = .; \ 486b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_gpl_future+*))) \ 487a6214385SMasahiro Yamada __stop___kcrctab_gpl_future = .; \ 4889f28bb7eSGreg Kroah-Hartman } \ 4899f28bb7eSGreg Kroah-Hartman \ 4901da177e4SLinus Torvalds /* Kernel symbol table: strings */ \ 4911da177e4SLinus Torvalds __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ 4924b89b7f7SNicholas Piggin *(__ksymtab_strings) \ 4931da177e4SLinus Torvalds } \ 4941da177e4SLinus Torvalds \ 495eb8f6890SSam Ravnborg /* __*init sections */ \ 496eb8f6890SSam Ravnborg __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) { \ 497312b1485SSam Ravnborg *(.ref.rodata) \ 498eb8f6890SSam Ravnborg MEM_KEEP(init.rodata) \ 499eb8f6890SSam Ravnborg MEM_KEEP(exit.rodata) \ 500eb8f6890SSam Ravnborg } \ 501eb8f6890SSam Ravnborg \ 5021da177e4SLinus Torvalds /* Built-in module parameters. */ \ 5031da177e4SLinus Torvalds __param : AT(ADDR(__param) - LOAD_OFFSET) { \ 504a6214385SMasahiro Yamada __start___param = .; \ 5054b89b7f7SNicholas Piggin KEEP(*(__param)) \ 506a6214385SMasahiro Yamada __stop___param = .; \ 507e94965edSDmitry Torokhov } \ 508e94965edSDmitry Torokhov \ 509e94965edSDmitry Torokhov /* Built-in module versions. */ \ 510e94965edSDmitry Torokhov __modver : AT(ADDR(__modver) - LOAD_OFFSET) { \ 511a6214385SMasahiro Yamada __start___modver = .; \ 5124b89b7f7SNicholas Piggin KEEP(*(__modver)) \ 513a6214385SMasahiro Yamada __stop___modver = .; \ 5147583ddfdSMarcelo Tosatti } \ 515eaf93707SKees Cook \ 516eaf93707SKees Cook NOTES \ 517eaf93707SKees Cook \ 518eaf93707SKees Cook . = ALIGN((align)); \ 519eaf93707SKees Cook __end_rodata = .; 5204096b46fSSam Ravnborg 521cb87481eSNicholas Piggin /* 522cb87481eSNicholas Piggin * .text section. Map to function alignment to avoid address changes 5230f4c4af0SNicholas Piggin * during second ld run in second ld pass when generating System.map 524cb87481eSNicholas Piggin * 525cb87481eSNicholas Piggin * TEXT_MAIN here will match .text.fixup and .text.unlikely if dead 526cb87481eSNicholas Piggin * code elimination is enabled, so these sections should be converted 527cb87481eSNicholas Piggin * to use ".." first. 528cb87481eSNicholas Piggin */ 5297664709bSSam Ravnborg #define TEXT_TEXT \ 5307664709bSSam Ravnborg ALIGN_FUNCTION(); \ 531cb87481eSNicholas Piggin *(.text.hot TEXT_MAIN .text.fixup .text.unlikely) \ 532564c9cc8SKees Cook *(.text..refcount) \ 533312b1485SSam Ravnborg *(.ref.text) \ 534266ff2a8SNicholas Piggin MEM_KEEP(init.text*) \ 535266ff2a8SNicholas Piggin MEM_KEEP(exit.text*) \ 536eb8f6890SSam Ravnborg 5377664709bSSam Ravnborg 5386d30e3a8SSam Ravnborg /* sched.text is aling to function alignment to secure we have same 5396d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 5401da177e4SLinus Torvalds #define SCHED_TEXT \ 5416d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 542a6214385SMasahiro Yamada __sched_text_start = .; \ 5431da177e4SLinus Torvalds *(.sched.text) \ 544a6214385SMasahiro Yamada __sched_text_end = .; 5451da177e4SLinus Torvalds 5466d30e3a8SSam Ravnborg /* spinlock.text is aling to function alignment to secure we have same 5476d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 5481da177e4SLinus Torvalds #define LOCK_TEXT \ 5496d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 550a6214385SMasahiro Yamada __lock_text_start = .; \ 5511da177e4SLinus Torvalds *(.spinlock.text) \ 552a6214385SMasahiro Yamada __lock_text_end = .; 553d0aaff97SPrasanna S Panchamukhi 5546727ad9eSChris Metcalf #define CPUIDLE_TEXT \ 5556727ad9eSChris Metcalf ALIGN_FUNCTION(); \ 556a6214385SMasahiro Yamada __cpuidle_text_start = .; \ 5576727ad9eSChris Metcalf *(.cpuidle.text) \ 558a6214385SMasahiro Yamada __cpuidle_text_end = .; 5596727ad9eSChris Metcalf 560d0aaff97SPrasanna S Panchamukhi #define KPROBES_TEXT \ 561d0aaff97SPrasanna S Panchamukhi ALIGN_FUNCTION(); \ 562a6214385SMasahiro Yamada __kprobes_text_start = .; \ 563d0aaff97SPrasanna S Panchamukhi *(.kprobes.text) \ 564a6214385SMasahiro Yamada __kprobes_text_end = .; 565a7d0c210SPaolo 'Blaisorblade' Giarrusso 566ea714547SJiri Olsa #define ENTRY_TEXT \ 567ea714547SJiri Olsa ALIGN_FUNCTION(); \ 568a6214385SMasahiro Yamada __entry_text_start = .; \ 569ea714547SJiri Olsa *(.entry.text) \ 570a6214385SMasahiro Yamada __entry_text_end = .; 571ea714547SJiri Olsa 572a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT \ 573a0343e82SFrederic Weisbecker ALIGN_FUNCTION(); \ 574a6214385SMasahiro Yamada __irqentry_text_start = .; \ 575a0343e82SFrederic Weisbecker *(.irqentry.text) \ 576a6214385SMasahiro Yamada __irqentry_text_end = .; 577a0343e82SFrederic Weisbecker 578be7635e7SAlexander Potapenko #define SOFTIRQENTRY_TEXT \ 579be7635e7SAlexander Potapenko ALIGN_FUNCTION(); \ 580a6214385SMasahiro Yamada __softirqentry_text_start = .; \ 581be7635e7SAlexander Potapenko *(.softirqentry.text) \ 582a6214385SMasahiro Yamada __softirqentry_text_end = .; 583be7635e7SAlexander Potapenko 58437c514e3SSam Ravnborg /* Section used for early init (in .S files) */ 585266ff2a8SNicholas Piggin #define HEAD_TEXT KEEP(*(.head.text)) 58637c514e3SSam Ravnborg 5877923f90fSSam Ravnborg #define HEAD_TEXT_SECTION \ 588ef53dae8SSam Ravnborg .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) { \ 589ef53dae8SSam Ravnborg HEAD_TEXT \ 590ef53dae8SSam Ravnborg } 591ef53dae8SSam Ravnborg 592ef53dae8SSam Ravnborg /* 593ef53dae8SSam Ravnborg * Exception table 594ef53dae8SSam Ravnborg */ 595ef53dae8SSam Ravnborg #define EXCEPTION_TABLE(align) \ 596ef53dae8SSam Ravnborg . = ALIGN(align); \ 597ef53dae8SSam Ravnborg __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \ 598a6214385SMasahiro Yamada __start___ex_table = .; \ 5994b89b7f7SNicholas Piggin KEEP(*(__ex_table)) \ 600a6214385SMasahiro Yamada __stop___ex_table = .; \ 601ef53dae8SSam Ravnborg } 602ef53dae8SSam Ravnborg 603ef53dae8SSam Ravnborg /* 604ef53dae8SSam Ravnborg * Init task 605ef53dae8SSam Ravnborg */ 60639a449d9STim Abbott #define INIT_TASK_DATA_SECTION(align) \ 607ef53dae8SSam Ravnborg . = ALIGN(align); \ 608da5e37efSSam Ravnborg .data..init_task : AT(ADDR(.data..init_task) - LOAD_OFFSET) { \ 60939a449d9STim Abbott INIT_TASK_DATA(align) \ 610ef53dae8SSam Ravnborg } 611eb8f6890SSam Ravnborg 612b99b87f7SPeter Oberparleiter #ifdef CONFIG_CONSTRUCTORS 6132a2325e6SHeiko Carstens #define KERNEL_CTORS() . = ALIGN(8); \ 614a6214385SMasahiro Yamada __ctors_start = .; \ 6154b89b7f7SNicholas Piggin KEEP(*(.ctors)) \ 6164b89b7f7SNicholas Piggin KEEP(*(SORT(.init_array.*))) \ 6174b89b7f7SNicholas Piggin KEEP(*(.init_array)) \ 618a6214385SMasahiro Yamada __ctors_end = .; 619b99b87f7SPeter Oberparleiter #else 620b99b87f7SPeter Oberparleiter #define KERNEL_CTORS() 621b99b87f7SPeter Oberparleiter #endif 622b99b87f7SPeter Oberparleiter 62301ba2bdcSSam Ravnborg /* init and exit section handling */ 624eb8f6890SSam Ravnborg #define INIT_DATA \ 625b67067f1SNicholas Piggin KEEP(*(SORT(___kentry+*))) \ 626266ff2a8SNicholas Piggin *(.init.data init.data.*) \ 627266ff2a8SNicholas Piggin MEM_DISCARD(init.data*) \ 628b99b87f7SPeter Oberparleiter KERNEL_CTORS() \ 6294b3b4c5eSJohn Reiser MCOUNT_REC() \ 630266ff2a8SNicholas Piggin *(.init.rodata .init.rodata.*) \ 631e4a9ea5eSSteven Rostedt FTRACE_EVENTS() \ 6323d56e331SSteven Rostedt TRACE_SYSCALLS() \ 633376e2424SMasami Hiramatsu KPROBE_BLACKLIST() \ 634540adea3SMasami Hiramatsu ERROR_INJECT_WHITELIST() \ 635aab94339SDirk Brandewie MEM_DISCARD(init.rodata) \ 636f2f6c255SPrashant Gaikwad CLK_OF_TABLES() \ 637f618c470SMarek Szyprowski RESERVEDMEM_OF_TABLES() \ 6382fcc112aSDaniel Lezcano TIMER_OF_TABLES() \ 6396c3ff8b1SStephen Boyd CPU_METHOD_OF_TABLES() \ 640449e056cSDaniel Lezcano CPUIDLE_METHOD_OF_TABLES() \ 641f6e916b8SThomas Petazzoni KERNEL_DTB() \ 642b0b6abd3SRob Herring IRQCHIP_OF_MATCH_TABLE() \ 64346e589a3SMarc Zyngier ACPI_PROBE_TABLE(irqchip) \ 6442fcc112aSDaniel Lezcano ACPI_PROBE_TABLE(timer) \ 645980af75eSDaniel Lezcano THERMAL_TABLE(governor) \ 6463ac946d1SKees Cook EARLYCON_TABLE() \ 647e6b1db98SMatthew Garrett LSM_TABLE() \ 648e6b1db98SMatthew Garrett EARLY_LSM_TABLE() 64901ba2bdcSSam Ravnborg 650eb8f6890SSam Ravnborg #define INIT_TEXT \ 651266ff2a8SNicholas Piggin *(.init.text .init.text.*) \ 652e41f501dSDmitry Vyukov *(.text.startup) \ 653266ff2a8SNicholas Piggin MEM_DISCARD(init.text*) 654eb8f6890SSam Ravnborg 655eb8f6890SSam Ravnborg #define EXIT_DATA \ 656266ff2a8SNicholas Piggin *(.exit.data .exit.data.*) \ 6578dcf86caSPeter Oberparleiter *(.fini_array .fini_array.*) \ 6588dcf86caSPeter Oberparleiter *(.dtors .dtors.*) \ 659266ff2a8SNicholas Piggin MEM_DISCARD(exit.data*) \ 660266ff2a8SNicholas Piggin MEM_DISCARD(exit.rodata*) 661eb8f6890SSam Ravnborg 662eb8f6890SSam Ravnborg #define EXIT_TEXT \ 663eb8f6890SSam Ravnborg *(.exit.text) \ 664e41f501dSDmitry Vyukov *(.text.exit) \ 665eb8f6890SSam Ravnborg MEM_DISCARD(exit.text) 66601ba2bdcSSam Ravnborg 6677923f90fSSam Ravnborg #define EXIT_CALL \ 6687923f90fSSam Ravnborg *(.exitcall.exit) 6697923f90fSSam Ravnborg 670ef53dae8SSam Ravnborg /* 671ef53dae8SSam Ravnborg * bss (Block Started by Symbol) - uninitialized data 672ef53dae8SSam Ravnborg * zeroed during startup 673ef53dae8SSam Ravnborg */ 67404e448d9STim Abbott #define SBSS(sbss_align) \ 67504e448d9STim Abbott . = ALIGN(sbss_align); \ 676ef53dae8SSam Ravnborg .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \ 67783a092cfSNicholas Piggin *(.dynsbss) \ 678266ff2a8SNicholas Piggin *(SBSS_MAIN) \ 679ef53dae8SSam Ravnborg *(.scommon) \ 680ef53dae8SSam Ravnborg } 681ef53dae8SSam Ravnborg 682c87728caSDavid Daney /* 683c87728caSDavid Daney * Allow archectures to redefine BSS_FIRST_SECTIONS to add extra 684c87728caSDavid Daney * sections to the front of bss. 685c87728caSDavid Daney */ 686c87728caSDavid Daney #ifndef BSS_FIRST_SECTIONS 687c87728caSDavid Daney #define BSS_FIRST_SECTIONS 688c87728caSDavid Daney #endif 689c87728caSDavid Daney 690ef53dae8SSam Ravnborg #define BSS(bss_align) \ 691ef53dae8SSam Ravnborg . = ALIGN(bss_align); \ 692ef53dae8SSam Ravnborg .bss : AT(ADDR(.bss) - LOAD_OFFSET) { \ 693c87728caSDavid Daney BSS_FIRST_SECTIONS \ 6947c74df07STim Abbott *(.bss..page_aligned) \ 695ef53dae8SSam Ravnborg *(.dynbss) \ 696cb87481eSNicholas Piggin *(BSS_MAIN) \ 697ef53dae8SSam Ravnborg *(COMMON) \ 698ef53dae8SSam Ravnborg } 699ef53dae8SSam Ravnborg 700ef53dae8SSam Ravnborg /* 701ef53dae8SSam Ravnborg * DWARF debug sections. 702ef53dae8SSam Ravnborg * Symbols in the DWARF debugging sections are relative to 703ef53dae8SSam Ravnborg * the beginning of the section so we begin them at 0. 704ef53dae8SSam Ravnborg */ 705a7d0c210SPaolo 'Blaisorblade' Giarrusso #define DWARF_DEBUG \ 706a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1 */ \ 707a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug 0 : { *(.debug) } \ 708a7d0c210SPaolo 'Blaisorblade' Giarrusso .line 0 : { *(.line) } \ 709a7d0c210SPaolo 'Blaisorblade' Giarrusso /* GNU DWARF 1 extensions */ \ 710a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_srcinfo 0 : { *(.debug_srcinfo) } \ 711a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_sfnames 0 : { *(.debug_sfnames) } \ 712a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1.1 and DWARF 2 */ \ 713a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_aranges 0 : { *(.debug_aranges) } \ 714a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_pubnames 0 : { *(.debug_pubnames) } \ 715a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 2 */ \ 716a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_info 0 : { *(.debug_info \ 717a7d0c210SPaolo 'Blaisorblade' Giarrusso .gnu.linkonce.wi.*) } \ 718a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_abbrev 0 : { *(.debug_abbrev) } \ 719a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_line 0 : { *(.debug_line) } \ 720a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_frame 0 : { *(.debug_frame) } \ 721a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_str 0 : { *(.debug_str) } \ 722a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_loc 0 : { *(.debug_loc) } \ 723a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_macinfo 0 : { *(.debug_macinfo) } \ 72483a092cfSNicholas Piggin .debug_pubtypes 0 : { *(.debug_pubtypes) } \ 72583a092cfSNicholas Piggin /* DWARF 3 */ \ 72683a092cfSNicholas Piggin .debug_ranges 0 : { *(.debug_ranges) } \ 727a7d0c210SPaolo 'Blaisorblade' Giarrusso /* SGI/MIPS DWARF 2 extensions */ \ 728a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_weaknames 0 : { *(.debug_weaknames) } \ 729a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_funcnames 0 : { *(.debug_funcnames) } \ 730a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_typenames 0 : { *(.debug_typenames) } \ 731a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_varnames 0 : { *(.debug_varnames) } \ 73283a092cfSNicholas Piggin /* GNU DWARF 2 extensions */ \ 73383a092cfSNicholas Piggin .debug_gnu_pubnames 0 : { *(.debug_gnu_pubnames) } \ 73483a092cfSNicholas Piggin .debug_gnu_pubtypes 0 : { *(.debug_gnu_pubtypes) } \ 73583a092cfSNicholas Piggin /* DWARF 4 */ \ 73683a092cfSNicholas Piggin .debug_types 0 : { *(.debug_types) } \ 73783a092cfSNicholas Piggin /* DWARF 5 */ \ 73883a092cfSNicholas Piggin .debug_macro 0 : { *(.debug_macro) } \ 73983a092cfSNicholas Piggin .debug_addr 0 : { *(.debug_addr) } 740a7d0c210SPaolo 'Blaisorblade' Giarrusso 741a7d0c210SPaolo 'Blaisorblade' Giarrusso /* Stabs debugging sections. */ 742a7d0c210SPaolo 'Blaisorblade' Giarrusso #define STABS_DEBUG \ 743a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab 0 : { *(.stab) } \ 744a7d0c210SPaolo 'Blaisorblade' Giarrusso .stabstr 0 : { *(.stabstr) } \ 745a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.excl 0 : { *(.stab.excl) } \ 746a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.exclstr 0 : { *(.stab.exclstr) } \ 747a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.index 0 : { *(.stab.index) } \ 748a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.indexstr 0 : { *(.stab.indexstr) } \ 749a7d0c210SPaolo 'Blaisorblade' Giarrusso .comment 0 : { *(.comment) } 7509c9b8b38SJeremy Fitzhardinge 7516360b1fbSJan Beulich #ifdef CONFIG_GENERIC_BUG 7527664c5a1SJeremy Fitzhardinge #define BUG_TABLE \ 7537664c5a1SJeremy Fitzhardinge . = ALIGN(8); \ 7547664c5a1SJeremy Fitzhardinge __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \ 755a6214385SMasahiro Yamada __start___bug_table = .; \ 7564b89b7f7SNicholas Piggin KEEP(*(__bug_table)) \ 757a6214385SMasahiro Yamada __stop___bug_table = .; \ 7587664c5a1SJeremy Fitzhardinge } 7596360b1fbSJan Beulich #else 7606360b1fbSJan Beulich #define BUG_TABLE 7616360b1fbSJan Beulich #endif 7627664c5a1SJeremy Fitzhardinge 76311af8474SJosh Poimboeuf #ifdef CONFIG_UNWINDER_ORC 764ee9f8fceSJosh Poimboeuf #define ORC_UNWIND_TABLE \ 765ee9f8fceSJosh Poimboeuf . = ALIGN(4); \ 766ee9f8fceSJosh Poimboeuf .orc_unwind_ip : AT(ADDR(.orc_unwind_ip) - LOAD_OFFSET) { \ 767a6214385SMasahiro Yamada __start_orc_unwind_ip = .; \ 768ee9f8fceSJosh Poimboeuf KEEP(*(.orc_unwind_ip)) \ 769a6214385SMasahiro Yamada __stop_orc_unwind_ip = .; \ 770ee9f8fceSJosh Poimboeuf } \ 771f76a16adSJosh Poimboeuf . = ALIGN(2); \ 772ee9f8fceSJosh Poimboeuf .orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) { \ 773a6214385SMasahiro Yamada __start_orc_unwind = .; \ 774ee9f8fceSJosh Poimboeuf KEEP(*(.orc_unwind)) \ 775a6214385SMasahiro Yamada __stop_orc_unwind = .; \ 776ee9f8fceSJosh Poimboeuf } \ 777ee9f8fceSJosh Poimboeuf . = ALIGN(4); \ 778ee9f8fceSJosh Poimboeuf .orc_lookup : AT(ADDR(.orc_lookup) - LOAD_OFFSET) { \ 779a6214385SMasahiro Yamada orc_lookup = .; \ 780ee9f8fceSJosh Poimboeuf . += (((SIZEOF(.text) + LOOKUP_BLOCK_SIZE - 1) / \ 781ee9f8fceSJosh Poimboeuf LOOKUP_BLOCK_SIZE) + 1) * 4; \ 782a6214385SMasahiro Yamada orc_lookup_end = .; \ 783ee9f8fceSJosh Poimboeuf } 784ee9f8fceSJosh Poimboeuf #else 785ee9f8fceSJosh Poimboeuf #define ORC_UNWIND_TABLE 786ee9f8fceSJosh Poimboeuf #endif 787ee9f8fceSJosh Poimboeuf 78863687a52SJan Beulich #ifdef CONFIG_PM_TRACE 78963687a52SJan Beulich #define TRACEDATA \ 79063687a52SJan Beulich . = ALIGN(4); \ 79163687a52SJan Beulich .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \ 792a6214385SMasahiro Yamada __tracedata_start = .; \ 7934b89b7f7SNicholas Piggin KEEP(*(.tracedata)) \ 794a6214385SMasahiro Yamada __tracedata_end = .; \ 79563687a52SJan Beulich } 79663687a52SJan Beulich #else 79763687a52SJan Beulich #define TRACEDATA 79863687a52SJan Beulich #endif 79963687a52SJan Beulich 8009c9b8b38SJeremy Fitzhardinge #define NOTES \ 801cbe87121SRoland McGrath .notes : AT(ADDR(.notes) - LOAD_OFFSET) { \ 802a6214385SMasahiro Yamada __start_notes = .; \ 803266ff2a8SNicholas Piggin KEEP(*(.note.*)) \ 804a6214385SMasahiro Yamada __stop_notes = .; \ 805fbe6a8e6SKees Cook } NOTES_HEADERS \ 806fbe6a8e6SKees Cook NOTES_HEADERS_RESTORE 80761ce1efeSAndrew Morton 808ef53dae8SSam Ravnborg #define INIT_SETUP(initsetup_align) \ 809ef53dae8SSam Ravnborg . = ALIGN(initsetup_align); \ 810a6214385SMasahiro Yamada __setup_start = .; \ 8114b89b7f7SNicholas Piggin KEEP(*(.init.setup)) \ 812a6214385SMasahiro Yamada __setup_end = .; 813ef53dae8SSam Ravnborg 814026cee00SPawel Moll #define INIT_CALLS_LEVEL(level) \ 815a6214385SMasahiro Yamada __initcall##level##_start = .; \ 816b67067f1SNicholas Piggin KEEP(*(.initcall##level##.init)) \ 817b67067f1SNicholas Piggin KEEP(*(.initcall##level##s.init)) \ 81861ce1efeSAndrew Morton 819ef53dae8SSam Ravnborg #define INIT_CALLS \ 820a6214385SMasahiro Yamada __initcall_start = .; \ 821b67067f1SNicholas Piggin KEEP(*(.initcallearly.init)) \ 822026cee00SPawel Moll INIT_CALLS_LEVEL(0) \ 823026cee00SPawel Moll INIT_CALLS_LEVEL(1) \ 824026cee00SPawel Moll INIT_CALLS_LEVEL(2) \ 825026cee00SPawel Moll INIT_CALLS_LEVEL(3) \ 826026cee00SPawel Moll INIT_CALLS_LEVEL(4) \ 827026cee00SPawel Moll INIT_CALLS_LEVEL(5) \ 828026cee00SPawel Moll INIT_CALLS_LEVEL(rootfs) \ 829026cee00SPawel Moll INIT_CALLS_LEVEL(6) \ 830026cee00SPawel Moll INIT_CALLS_LEVEL(7) \ 831a6214385SMasahiro Yamada __initcall_end = .; 832ef53dae8SSam Ravnborg 833ef53dae8SSam Ravnborg #define CON_INITCALL \ 834a6214385SMasahiro Yamada __con_initcall_start = .; \ 835b67067f1SNicholas Piggin KEEP(*(.con_initcall.init)) \ 836a6214385SMasahiro Yamada __con_initcall_end = .; 837ef53dae8SSam Ravnborg 838ef53dae8SSam Ravnborg #ifdef CONFIG_BLK_DEV_INITRD 839ef53dae8SSam Ravnborg #define INIT_RAM_FS \ 840d8826262SMike Frysinger . = ALIGN(4); \ 841a6214385SMasahiro Yamada __initramfs_start = .; \ 842b67067f1SNicholas Piggin KEEP(*(.init.ramfs)) \ 843ffe8018cSHendrik Brueckner . = ALIGN(8); \ 844b67067f1SNicholas Piggin KEEP(*(.init.ramfs.info)) 845ef53dae8SSam Ravnborg #else 846eadfe219SDavid Howells #define INIT_RAM_FS 847ef53dae8SSam Ravnborg #endif 848ef53dae8SSam Ravnborg 849023bf6f1STejun Heo /* 850ac26963aSBrijesh Singh * Memory encryption operates on a page basis. Since we need to clear 851ac26963aSBrijesh Singh * the memory encryption mask for this section, it needs to be aligned 852ac26963aSBrijesh Singh * on a page boundary and be a page-size multiple in length. 853ac26963aSBrijesh Singh * 854ac26963aSBrijesh Singh * Note: We use a separate section so that only this section gets 855ac26963aSBrijesh Singh * decrypted to avoid exposing more than we wish. 856ac26963aSBrijesh Singh */ 857ac26963aSBrijesh Singh #ifdef CONFIG_AMD_MEM_ENCRYPT 858ac26963aSBrijesh Singh #define PERCPU_DECRYPTED_SECTION \ 859ac26963aSBrijesh Singh . = ALIGN(PAGE_SIZE); \ 860ac26963aSBrijesh Singh *(.data..percpu..decrypted) \ 861ac26963aSBrijesh Singh . = ALIGN(PAGE_SIZE); 862ac26963aSBrijesh Singh #else 863ac26963aSBrijesh Singh #define PERCPU_DECRYPTED_SECTION 864ac26963aSBrijesh Singh #endif 865ac26963aSBrijesh Singh 866ac26963aSBrijesh Singh 867ac26963aSBrijesh Singh /* 868023bf6f1STejun Heo * Default discarded sections. 869023bf6f1STejun Heo * 870023bf6f1STejun Heo * Some archs want to discard exit text/data at runtime rather than 871023bf6f1STejun Heo * link time due to cross-section references such as alt instructions, 872023bf6f1STejun Heo * bug table, eh_frame, etc. DISCARDS must be the last of output 873023bf6f1STejun Heo * section definitions so that such archs put those in earlier section 874023bf6f1STejun Heo * definitions. 875023bf6f1STejun Heo */ 876405d967dSTejun Heo #define DISCARDS \ 877405d967dSTejun Heo /DISCARD/ : { \ 878405d967dSTejun Heo EXIT_TEXT \ 879405d967dSTejun Heo EXIT_DATA \ 880023bf6f1STejun Heo EXIT_CALL \ 881405d967dSTejun Heo *(.discard) \ 882c7f52cdcSJeremy Fitzhardinge *(.discard.*) \ 883898490c0SAlexey Gladkov *(.modinfo) \ 884405d967dSTejun Heo } 885405d967dSTejun Heo 8863e5d8f97STejun Heo /** 8876ea0c34dSMike Frysinger * PERCPU_INPUT - the percpu input sections 8886ea0c34dSMike Frysinger * @cacheline: cacheline size 8896ea0c34dSMike Frysinger * 8906ea0c34dSMike Frysinger * The core percpu section names and core symbols which do not rely 8916ea0c34dSMike Frysinger * directly upon load addresses. 8926ea0c34dSMike Frysinger * 8936ea0c34dSMike Frysinger * @cacheline is used to align subsections to avoid false cacheline 8946ea0c34dSMike Frysinger * sharing between subsections for different purposes. 8956ea0c34dSMike Frysinger */ 8966ea0c34dSMike Frysinger #define PERCPU_INPUT(cacheline) \ 897a6214385SMasahiro Yamada __per_cpu_start = .; \ 8986ea0c34dSMike Frysinger *(.data..percpu..first) \ 8996ea0c34dSMike Frysinger . = ALIGN(PAGE_SIZE); \ 9006ea0c34dSMike Frysinger *(.data..percpu..page_aligned) \ 9016ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 902330d2822SZhengyu He *(.data..percpu..read_mostly) \ 9036ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 9046ea0c34dSMike Frysinger *(.data..percpu) \ 9056ea0c34dSMike Frysinger *(.data..percpu..shared_aligned) \ 906ac26963aSBrijesh Singh PERCPU_DECRYPTED_SECTION \ 907a6214385SMasahiro Yamada __per_cpu_end = .; 9086ea0c34dSMike Frysinger 9096ea0c34dSMike Frysinger /** 9106b7c38d5STejun Heo * PERCPU_VADDR - define output section for percpu area 91119df0c2fSTejun Heo * @cacheline: cacheline size 9123e5d8f97STejun Heo * @vaddr: explicit base address (optional) 9133e5d8f97STejun Heo * @phdr: destination PHDR (optional) 9143e5d8f97STejun Heo * 91519df0c2fSTejun Heo * Macro which expands to output section for percpu area. 91619df0c2fSTejun Heo * 91719df0c2fSTejun Heo * @cacheline is used to align subsections to avoid false cacheline 91819df0c2fSTejun Heo * sharing between subsections for different purposes. 91919df0c2fSTejun Heo * 92019df0c2fSTejun Heo * If @vaddr is not blank, it specifies explicit base address and all 92119df0c2fSTejun Heo * percpu symbols will be offset from the given address. If blank, 92219df0c2fSTejun Heo * @vaddr always equals @laddr + LOAD_OFFSET. 9233e5d8f97STejun Heo * 9243e5d8f97STejun Heo * @phdr defines the output PHDR to use if not blank. Be warned that 9253e5d8f97STejun Heo * output PHDR is sticky. If @phdr is specified, the next output 9263e5d8f97STejun Heo * section in the linker script will go there too. @phdr should have 9273e5d8f97STejun Heo * a leading colon. 9283e5d8f97STejun Heo * 9293ac6cffeSTejun Heo * Note that this macros defines __per_cpu_load as an absolute symbol. 9303ac6cffeSTejun Heo * If there is no need to put the percpu section at a predetermined 9310415b00dSTejun Heo * address, use PERCPU_SECTION. 9323e5d8f97STejun Heo */ 93319df0c2fSTejun Heo #define PERCPU_VADDR(cacheline, vaddr, phdr) \ 934a6214385SMasahiro Yamada __per_cpu_load = .; \ 935a6214385SMasahiro Yamada .data..percpu vaddr : AT(__per_cpu_load - LOAD_OFFSET) { \ 9366ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 9376b7c38d5STejun Heo } phdr \ 938a6214385SMasahiro Yamada . = __per_cpu_load + SIZEOF(.data..percpu); 9393e5d8f97STejun Heo 9403e5d8f97STejun Heo /** 9410415b00dSTejun Heo * PERCPU_SECTION - define output section for percpu area, simple version 94219df0c2fSTejun Heo * @cacheline: cacheline size 9433e5d8f97STejun Heo * 9440415b00dSTejun Heo * Align to PAGE_SIZE and outputs output section for percpu area. This 9450415b00dSTejun Heo * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and 9463e5d8f97STejun Heo * __per_cpu_start will be identical. 9473ac6cffeSTejun Heo * 9480415b00dSTejun Heo * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,) 94919df0c2fSTejun Heo * except that __per_cpu_load is defined as a relative symbol against 95019df0c2fSTejun Heo * .data..percpu which is required for relocatable x86_32 configuration. 9513e5d8f97STejun Heo */ 9520415b00dSTejun Heo #define PERCPU_SECTION(cacheline) \ 9530415b00dSTejun Heo . = ALIGN(PAGE_SIZE); \ 9543d9a854cSDenys Vlasenko .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ 955a6214385SMasahiro Yamada __per_cpu_load = .; \ 9566ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 9573ac6cffeSTejun Heo } 958ef53dae8SSam Ravnborg 959ef53dae8SSam Ravnborg 960ef53dae8SSam Ravnborg /* 961ef53dae8SSam Ravnborg * Definition of the high level *_SECTION macros 962ef53dae8SSam Ravnborg * They will fit only a subset of the architectures 963ef53dae8SSam Ravnborg */ 964ef53dae8SSam Ravnborg 965ef53dae8SSam Ravnborg 966ef53dae8SSam Ravnborg /* 967ef53dae8SSam Ravnborg * Writeable data. 968ef53dae8SSam Ravnborg * All sections are combined in a single .data section. 969ef53dae8SSam Ravnborg * The sections following CONSTRUCTORS are arranged so their 970ef53dae8SSam Ravnborg * typical alignment matches. 971ef53dae8SSam Ravnborg * A cacheline is typical/always less than a PAGE_SIZE so 972ef53dae8SSam Ravnborg * the sections that has this restriction (or similar) 973ef53dae8SSam Ravnborg * is located before the ones requiring PAGE_SIZE alignment. 974ef53dae8SSam Ravnborg * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which 97525985edcSLucas De Marchi * matches the requirement of PAGE_ALIGNED_DATA. 976ef53dae8SSam Ravnborg * 9777923f90fSSam Ravnborg * use 0 as page_align if page_aligned data is not used */ 97873f1d939SPaul Mundt #define RW_DATA_SECTION(cacheline, pagealigned, inittask) \ 979ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 980ef53dae8SSam Ravnborg .data : AT(ADDR(.data) - LOAD_OFFSET) { \ 98139a449d9STim Abbott INIT_TASK_DATA(inittask) \ 9821b208622STim Abbott NOSAVE_DATA \ 9831b208622STim Abbott PAGE_ALIGNED_DATA(pagealigned) \ 984ef53dae8SSam Ravnborg CACHELINE_ALIGNED_DATA(cacheline) \ 985ef53dae8SSam Ravnborg READ_MOSTLY_DATA(cacheline) \ 986ef53dae8SSam Ravnborg DATA_DATA \ 987ef53dae8SSam Ravnborg CONSTRUCTORS \ 98819d43626SPeter Zijlstra } \ 989ee9f8fceSJosh Poimboeuf BUG_TABLE \ 990ef53dae8SSam Ravnborg 991ef53dae8SSam Ravnborg #define INIT_TEXT_SECTION(inittext_align) \ 992ef53dae8SSam Ravnborg . = ALIGN(inittext_align); \ 993ef53dae8SSam Ravnborg .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { \ 994a6214385SMasahiro Yamada _sinittext = .; \ 995ef53dae8SSam Ravnborg INIT_TEXT \ 996a6214385SMasahiro Yamada _einittext = .; \ 997ef53dae8SSam Ravnborg } 998ef53dae8SSam Ravnborg 999ef53dae8SSam Ravnborg #define INIT_DATA_SECTION(initsetup_align) \ 1000ef53dae8SSam Ravnborg .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { \ 1001ef53dae8SSam Ravnborg INIT_DATA \ 1002ef53dae8SSam Ravnborg INIT_SETUP(initsetup_align) \ 1003ef53dae8SSam Ravnborg INIT_CALLS \ 1004ef53dae8SSam Ravnborg CON_INITCALL \ 1005ef53dae8SSam Ravnborg INIT_RAM_FS \ 1006ef53dae8SSam Ravnborg } 1007ef53dae8SSam Ravnborg 100804e448d9STim Abbott #define BSS_SECTION(sbss_align, bss_align, stop_align) \ 100904e448d9STim Abbott . = ALIGN(sbss_align); \ 1010a6214385SMasahiro Yamada __bss_start = .; \ 101104e448d9STim Abbott SBSS(sbss_align) \ 1012ef53dae8SSam Ravnborg BSS(bss_align) \ 101304e448d9STim Abbott . = ALIGN(stop_align); \ 1014a6214385SMasahiro Yamada __bss_stop = .; 1015