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) 27c9174047SKees Cook * RW_DATA(...) 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 37c604abc3SKees Cook * ELF_DETAILS 38023bf6f1STejun Heo * 39023bf6f1STejun Heo * DISCARDS // must be the last 40ef53dae8SSam Ravnborg * } 41ef53dae8SSam Ravnborg * 42ef53dae8SSam Ravnborg * [__init_begin, __init_end] is the init section that may be freed after init 43562c85caSYalin Wang * // __init_begin and __init_end should be page aligned, so that we can 44562c85caSYalin Wang * // free the whole .init memory 45ef53dae8SSam Ravnborg * [_stext, _etext] is the text section 46ef53dae8SSam Ravnborg * [_sdata, _edata] is the data section 47ef53dae8SSam Ravnborg * 48ef53dae8SSam Ravnborg * Some of the included output section have their own set of constants. 49ef53dae8SSam Ravnborg * Examples are: [__initramfs_start, __initramfs_end] for initramfs and 50ef53dae8SSam Ravnborg * [__nosave_begin, __nosave_end] for the nosave data 51ef53dae8SSam Ravnborg */ 52c80d471aSTim Abbott 531da177e4SLinus Torvalds #ifndef LOAD_OFFSET 541da177e4SLinus Torvalds #define LOAD_OFFSET 0 551da177e4SLinus Torvalds #endif 561da177e4SLinus Torvalds 57441110a5SKees Cook /* 58441110a5SKees Cook * Only some architectures want to have the .notes segment visible in 59fbe6a8e6SKees Cook * a separate PT_NOTE ELF Program Header. When this happens, it needs 60fbe6a8e6SKees Cook * to be visible in both the kernel text's PT_LOAD and the PT_NOTE 61fbe6a8e6SKees Cook * Program Headers. In this case, though, the PT_LOAD needs to be made 62fbe6a8e6SKees Cook * the default again so that all the following sections don't also end 63fbe6a8e6SKees Cook * up in the PT_NOTE Program Header. 64441110a5SKees Cook */ 65441110a5SKees Cook #ifdef EMITS_PT_NOTE 66441110a5SKees Cook #define NOTES_HEADERS :text :note 67fbe6a8e6SKees Cook #define NOTES_HEADERS_RESTORE __restore_ph : { *(.__restore_ph) } :text 68fbe6a8e6SKees Cook #else 69fbe6a8e6SKees Cook #define NOTES_HEADERS 70fbe6a8e6SKees Cook #define NOTES_HEADERS_RESTORE 71441110a5SKees Cook #endif 72441110a5SKees Cook 73b8c2f776SKees Cook /* 74b8c2f776SKees Cook * Some architectures have non-executable read-only exception tables. 75b8c2f776SKees Cook * They can be added to the RO_DATA segment by specifying their desired 76b8c2f776SKees Cook * alignment. 77b8c2f776SKees Cook */ 78b8c2f776SKees Cook #ifdef RO_EXCEPTION_TABLE_ALIGN 79b8c2f776SKees Cook #define RO_EXCEPTION_TABLE EXCEPTION_TABLE(RO_EXCEPTION_TABLE_ALIGN) 80b8c2f776SKees Cook #else 81b8c2f776SKees Cook #define RO_EXCEPTION_TABLE 82b8c2f776SKees Cook #endif 83b8c2f776SKees Cook 846d30e3a8SSam Ravnborg /* Align . to a 8 byte boundary equals to maximum function alignment. */ 856d30e3a8SSam Ravnborg #define ALIGN_FUNCTION() . = ALIGN(8) 866d30e3a8SSam Ravnborg 8707fca0e5SSam Ravnborg /* 88cb87481eSNicholas Piggin * LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections, which 89cb87481eSNicholas Piggin * generates .data.identifier sections, which need to be pulled in with 90cb87481eSNicholas Piggin * .data. We don't want to pull in .data..other sections, which Linux 91cb87481eSNicholas Piggin * has defined. Same for text and bss. 92266ff2a8SNicholas Piggin * 93*dc5723b0SSami Tolvanen * With LTO_CLANG, the linker also splits sections by default, so we need 94*dc5723b0SSami Tolvanen * these macros to combine the sections during the final link. 95*dc5723b0SSami Tolvanen * 96266ff2a8SNicholas Piggin * RODATA_MAIN is not used because existing code already defines .rodata.x 97266ff2a8SNicholas Piggin * sections to be brought in with rodata. 98cb87481eSNicholas Piggin */ 99*dc5723b0SSami Tolvanen #if defined(CONFIG_LD_DEAD_CODE_DATA_ELIMINATION) || defined(CONFIG_LTO_CLANG) 100cb87481eSNicholas Piggin #define TEXT_MAIN .text .text.[0-9a-zA-Z_]* 101*dc5723b0SSami Tolvanen #define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..L* .data..compoundliteral* 102266ff2a8SNicholas Piggin #define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]* 103*dc5723b0SSami Tolvanen #define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]* .rodata..L* 104*dc5723b0SSami Tolvanen #define BSS_MAIN .bss .bss.[0-9a-zA-Z_]* .bss..compoundliteral* 105266ff2a8SNicholas Piggin #define SBSS_MAIN .sbss .sbss.[0-9a-zA-Z_]* 106cb87481eSNicholas Piggin #else 107cb87481eSNicholas Piggin #define TEXT_MAIN .text 108cb87481eSNicholas Piggin #define DATA_MAIN .data 109266ff2a8SNicholas Piggin #define SDATA_MAIN .sdata 110266ff2a8SNicholas Piggin #define RODATA_MAIN .rodata 111cb87481eSNicholas Piggin #define BSS_MAIN .bss 112266ff2a8SNicholas Piggin #define SBSS_MAIN .sbss 113cb87481eSNicholas Piggin #endif 114cb87481eSNicholas Piggin 115cb87481eSNicholas Piggin /* 11685c2ce91SPeter Zijlstra * GCC 4.5 and later have a 32 bytes section alignment for structures. 11785c2ce91SPeter Zijlstra * Except GCC 4.9, that feels the need to align on 64 bytes. 11807fca0e5SSam Ravnborg */ 11985c2ce91SPeter Zijlstra #if __GNUC__ == 4 && __GNUC_MINOR__ == 9 12085c2ce91SPeter Zijlstra #define STRUCT_ALIGNMENT 64 12185c2ce91SPeter Zijlstra #else 122aab94339SDirk Brandewie #define STRUCT_ALIGNMENT 32 12385c2ce91SPeter Zijlstra #endif 124aab94339SDirk Brandewie #define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT) 12507fca0e5SSam Ravnborg 12685c2ce91SPeter Zijlstra /* 127590d6979SSteven Rostedt (VMware) * The order of the sched class addresses are important, as they are 128590d6979SSteven Rostedt (VMware) * used to determine the order of the priority of each sched class in 129590d6979SSteven Rostedt (VMware) * relation to each other. 130590d6979SSteven Rostedt (VMware) */ 131590d6979SSteven Rostedt (VMware) #define SCHED_DATA \ 132c3a340f7SSteven Rostedt (VMware) STRUCT_ALIGN(); \ 133c3a340f7SSteven Rostedt (VMware) __begin_sched_classes = .; \ 134590d6979SSteven Rostedt (VMware) *(__idle_sched_class) \ 135590d6979SSteven Rostedt (VMware) *(__fair_sched_class) \ 136590d6979SSteven Rostedt (VMware) *(__rt_sched_class) \ 137590d6979SSteven Rostedt (VMware) *(__dl_sched_class) \ 138c3a340f7SSteven Rostedt (VMware) *(__stop_sched_class) \ 139c3a340f7SSteven Rostedt (VMware) __end_sched_classes = .; 140590d6979SSteven Rostedt (VMware) 141eb8f6890SSam Ravnborg /* The actual configuration determine if the init/exit sections 142eb8f6890SSam Ravnborg * are handled as text/data or they can be discarded (which 143eb8f6890SSam Ravnborg * often happens at runtime) 144eb8f6890SSam Ravnborg */ 145eb8f6890SSam Ravnborg #ifdef CONFIG_HOTPLUG_CPU 146eb8f6890SSam Ravnborg #define CPU_KEEP(sec) *(.cpu##sec) 147eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) 148eb8f6890SSam Ravnborg #else 149eb8f6890SSam Ravnborg #define CPU_KEEP(sec) 150eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) *(.cpu##sec) 151eb8f6890SSam Ravnborg #endif 152eb8f6890SSam Ravnborg 1531a3fb6d4SAdrian Bunk #if defined(CONFIG_MEMORY_HOTPLUG) 154eb8f6890SSam Ravnborg #define MEM_KEEP(sec) *(.mem##sec) 155eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) 156eb8f6890SSam Ravnborg #else 157eb8f6890SSam Ravnborg #define MEM_KEEP(sec) 158eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) *(.mem##sec) 159eb8f6890SSam Ravnborg #endif 160eb8f6890SSam Ravnborg 1618da3821bSSteven Rostedt #ifdef CONFIG_FTRACE_MCOUNT_RECORD 162a1326b17SMark Rutland /* 163a1326b17SMark Rutland * The ftrace call sites are logged to a section whose name depends on the 164a1326b17SMark Rutland * compiler option used. A given kernel image will only use one, AKA 165a1326b17SMark Rutland * FTRACE_CALLSITE_SECTION. We capture all of them here to avoid header 166a1326b17SMark Rutland * dependencies for FTRACE_CALLSITE_SECTION's definition. 16795f1fa9eSLinus Torvalds * 16846f94692SSteven Rostedt (VMware) * Need to also make ftrace_stub_graph point to ftrace_stub 169b83b43ffSSteven Rostedt (VMware) * so that the same stub location may have different protocols 170b83b43ffSSteven Rostedt (VMware) * and not mess up with C verifiers. 171a1326b17SMark Rutland */ 1724b3b4c5eSJohn Reiser #define MCOUNT_REC() . = ALIGN(8); \ 173a6214385SMasahiro Yamada __start_mcount_loc = .; \ 174266ff2a8SNicholas Piggin KEEP(*(__mcount_loc)) \ 175a1326b17SMark Rutland KEEP(*(__patchable_function_entries)) \ 176b83b43ffSSteven Rostedt (VMware) __stop_mcount_loc = .; \ 17746f94692SSteven Rostedt (VMware) ftrace_stub_graph = ftrace_stub; 1788da3821bSSteven Rostedt #else 179b83b43ffSSteven Rostedt (VMware) # ifdef CONFIG_FUNCTION_TRACER 18046f94692SSteven Rostedt (VMware) # define MCOUNT_REC() ftrace_stub_graph = ftrace_stub; 1818da3821bSSteven Rostedt # else 1828da3821bSSteven Rostedt # define MCOUNT_REC() 1838da3821bSSteven Rostedt # endif 184b83b43ffSSteven Rostedt (VMware) #endif 185eb8f6890SSam Ravnborg 1862ed84eebSSteven Rostedt #ifdef CONFIG_TRACE_BRANCH_PROFILING 187a6214385SMasahiro Yamada #define LIKELY_PROFILE() __start_annotated_branch_profile = .; \ 188266ff2a8SNicholas Piggin KEEP(*(_ftrace_annotated_branch)) \ 189a6214385SMasahiro Yamada __stop_annotated_branch_profile = .; 1901f0d69a9SSteven Rostedt #else 1911f0d69a9SSteven Rostedt #define LIKELY_PROFILE() 1921f0d69a9SSteven Rostedt #endif 1931f0d69a9SSteven Rostedt 1942bcd521aSSteven Rostedt #ifdef CONFIG_PROFILE_ALL_BRANCHES 195a6214385SMasahiro Yamada #define BRANCH_PROFILE() __start_branch_profile = .; \ 196266ff2a8SNicholas Piggin KEEP(*(_ftrace_branch)) \ 197a6214385SMasahiro Yamada __stop_branch_profile = .; 1982bcd521aSSteven Rostedt #else 1992bcd521aSSteven Rostedt #define BRANCH_PROFILE() 2002bcd521aSSteven Rostedt #endif 2012bcd521aSSteven Rostedt 202376e2424SMasami Hiramatsu #ifdef CONFIG_KPROBES 20369902c71SVineet Gupta #define KPROBE_BLACKLIST() . = ALIGN(8); \ 204a6214385SMasahiro Yamada __start_kprobe_blacklist = .; \ 2054b89b7f7SNicholas Piggin KEEP(*(_kprobe_blacklist)) \ 206a6214385SMasahiro Yamada __stop_kprobe_blacklist = .; 207376e2424SMasami Hiramatsu #else 208376e2424SMasami Hiramatsu #define KPROBE_BLACKLIST() 209376e2424SMasami Hiramatsu #endif 210376e2424SMasami Hiramatsu 211540adea3SMasami Hiramatsu #ifdef CONFIG_FUNCTION_ERROR_INJECTION 212663faf9fSMasami Hiramatsu #define ERROR_INJECT_WHITELIST() STRUCT_ALIGN(); \ 213a6214385SMasahiro Yamada __start_error_injection_whitelist = .; \ 214540adea3SMasami Hiramatsu KEEP(*(_error_injection_whitelist)) \ 215a6214385SMasahiro Yamada __stop_error_injection_whitelist = .; 21692ace999SJosef Bacik #else 217540adea3SMasami Hiramatsu #define ERROR_INJECT_WHITELIST() 21892ace999SJosef Bacik #endif 21992ace999SJosef Bacik 2205f77a88bSTom Zanussi #ifdef CONFIG_EVENT_TRACING 221e4a9ea5eSSteven Rostedt #define FTRACE_EVENTS() . = ALIGN(8); \ 222a6214385SMasahiro Yamada __start_ftrace_events = .; \ 2234b89b7f7SNicholas Piggin KEEP(*(_ftrace_events)) \ 224a6214385SMasahiro Yamada __stop_ftrace_events = .; \ 225a6214385SMasahiro Yamada __start_ftrace_eval_maps = .; \ 22602fd7f68SJeremy Linton KEEP(*(_ftrace_eval_map)) \ 227a6214385SMasahiro Yamada __stop_ftrace_eval_maps = .; 228b77e38aaSSteven Rostedt #else 229b77e38aaSSteven Rostedt #define FTRACE_EVENTS() 230b77e38aaSSteven Rostedt #endif 231b77e38aaSSteven Rostedt 2321ba28e02SLai Jiangshan #ifdef CONFIG_TRACING 233a6214385SMasahiro Yamada #define TRACE_PRINTKS() __start___trace_bprintk_fmt = .; \ 2344b89b7f7SNicholas Piggin KEEP(*(__trace_printk_fmt)) /* Trace_printk fmt' pointer */ \ 235a6214385SMasahiro Yamada __stop___trace_bprintk_fmt = .; 236a6214385SMasahiro Yamada #define TRACEPOINT_STR() __start___tracepoint_str = .; \ 2374b89b7f7SNicholas Piggin KEEP(*(__tracepoint_str)) /* Trace_printk fmt' pointer */ \ 238a6214385SMasahiro Yamada __stop___tracepoint_str = .; 2391ba28e02SLai Jiangshan #else 2401ba28e02SLai Jiangshan #define TRACE_PRINTKS() 241102c9323SSteven Rostedt (Red Hat) #define TRACEPOINT_STR() 2421ba28e02SLai Jiangshan #endif 2431ba28e02SLai Jiangshan 244bed1ffcaSFrederic Weisbecker #ifdef CONFIG_FTRACE_SYSCALLS 2453d56e331SSteven Rostedt #define TRACE_SYSCALLS() . = ALIGN(8); \ 246a6214385SMasahiro Yamada __start_syscalls_metadata = .; \ 2474b89b7f7SNicholas Piggin KEEP(*(__syscalls_metadata)) \ 248a6214385SMasahiro Yamada __stop_syscalls_metadata = .; 249bed1ffcaSFrederic Weisbecker #else 250bed1ffcaSFrederic Weisbecker #define TRACE_SYSCALLS() 251bed1ffcaSFrederic Weisbecker #endif 252bed1ffcaSFrederic Weisbecker 253c4f6699dSAlexei Starovoitov #ifdef CONFIG_BPF_EVENTS 254c4f6699dSAlexei Starovoitov #define BPF_RAW_TP() STRUCT_ALIGN(); \ 255a6214385SMasahiro Yamada __start__bpf_raw_tp = .; \ 256c4f6699dSAlexei Starovoitov KEEP(*(__bpf_raw_tp_map)) \ 257a6214385SMasahiro Yamada __stop__bpf_raw_tp = .; 258c4f6699dSAlexei Starovoitov #else 259c4f6699dSAlexei Starovoitov #define BPF_RAW_TP() 260c4f6699dSAlexei Starovoitov #endif 261c4f6699dSAlexei Starovoitov 262470ca0deSPeter Hurley #ifdef CONFIG_SERIAL_EARLYCON 263dd709e72SDaniel Kurtz #define EARLYCON_TABLE() . = ALIGN(8); \ 264a6214385SMasahiro Yamada __earlycon_table = .; \ 2654b89b7f7SNicholas Piggin KEEP(*(__earlycon_table)) \ 266a6214385SMasahiro Yamada __earlycon_table_end = .; 267470ca0deSPeter Hurley #else 268470ca0deSPeter Hurley #define EARLYCON_TABLE() 269470ca0deSPeter Hurley #endif 270aab94339SDirk Brandewie 2713ac946d1SKees Cook #ifdef CONFIG_SECURITY 2723ac946d1SKees Cook #define LSM_TABLE() . = ALIGN(8); \ 2733ac946d1SKees Cook __start_lsm_info = .; \ 2743ac946d1SKees Cook KEEP(*(.lsm_info.init)) \ 2753ac946d1SKees Cook __end_lsm_info = .; 276e6b1db98SMatthew Garrett #define EARLY_LSM_TABLE() . = ALIGN(8); \ 277e6b1db98SMatthew Garrett __start_early_lsm_info = .; \ 278e6b1db98SMatthew Garrett KEEP(*(.early_lsm_info.init)) \ 279e6b1db98SMatthew Garrett __end_early_lsm_info = .; 2803ac946d1SKees Cook #else 2813ac946d1SKees Cook #define LSM_TABLE() 282e6b1db98SMatthew Garrett #define EARLY_LSM_TABLE() 2833ac946d1SKees Cook #endif 2843ac946d1SKees Cook 28506309288SRob Herring #define ___OF_TABLE(cfg, name) _OF_TABLE_##cfg(name) 28606309288SRob Herring #define __OF_TABLE(cfg, name) ___OF_TABLE(cfg, name) 2875ee02af1SMasahiro Yamada #define OF_TABLE(cfg, name) __OF_TABLE(IS_ENABLED(cfg), name) 28806309288SRob Herring #define _OF_TABLE_0(name) 28906309288SRob Herring #define _OF_TABLE_1(name) \ 290f6e916b8SThomas Petazzoni . = ALIGN(8); \ 291a6214385SMasahiro Yamada __##name##_of_table = .; \ 2924b89b7f7SNicholas Piggin KEEP(*(__##name##_of_table)) \ 2934b89b7f7SNicholas Piggin KEEP(*(__##name##_of_table_end)) 294aab94339SDirk Brandewie 295bb0eb050SDaniel Lezcano #define TIMER_OF_TABLES() OF_TABLE(CONFIG_TIMER_OF, timer) 29606309288SRob Herring #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip) 29706309288SRob Herring #define CLK_OF_TABLES() OF_TABLE(CONFIG_COMMON_CLK, clk) 29806309288SRob Herring #define RESERVEDMEM_OF_TABLES() OF_TABLE(CONFIG_OF_RESERVED_MEM, reservedmem) 29906309288SRob Herring #define CPU_METHOD_OF_TABLES() OF_TABLE(CONFIG_SMP, cpu_method) 300449e056cSDaniel Lezcano #define CPUIDLE_METHOD_OF_TABLES() OF_TABLE(CONFIG_CPU_IDLE, cpuidle_method) 3016c3ff8b1SStephen Boyd 302e647b532SMarc Zyngier #ifdef CONFIG_ACPI 303e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name) \ 304e647b532SMarc Zyngier . = ALIGN(8); \ 305a6214385SMasahiro Yamada __##name##_acpi_probe_table = .; \ 3064b89b7f7SNicholas Piggin KEEP(*(__##name##_acpi_probe_table)) \ 307a6214385SMasahiro Yamada __##name##_acpi_probe_table_end = .; 308e647b532SMarc Zyngier #else 309e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name) 310e647b532SMarc Zyngier #endif 311e647b532SMarc Zyngier 312980af75eSDaniel Lezcano #ifdef CONFIG_THERMAL 313980af75eSDaniel Lezcano #define THERMAL_TABLE(name) \ 314980af75eSDaniel Lezcano . = ALIGN(8); \ 315980af75eSDaniel Lezcano __##name##_thermal_table = .; \ 316980af75eSDaniel Lezcano KEEP(*(__##name##_thermal_table)) \ 317980af75eSDaniel Lezcano __##name##_thermal_table_end = .; 318980af75eSDaniel Lezcano #else 319980af75eSDaniel Lezcano #define THERMAL_TABLE(name) 320980af75eSDaniel Lezcano #endif 321980af75eSDaniel Lezcano 322aab94339SDirk Brandewie #define KERNEL_DTB() \ 323aab94339SDirk Brandewie STRUCT_ALIGN(); \ 324a6214385SMasahiro Yamada __dtb_start = .; \ 3254b89b7f7SNicholas Piggin KEEP(*(.dtb.init.rodata)) \ 326a6214385SMasahiro Yamada __dtb_end = .; 327aab94339SDirk Brandewie 328b67067f1SNicholas Piggin /* 329b67067f1SNicholas Piggin * .data section 330b67067f1SNicholas Piggin */ 331ca967258SSam Ravnborg #define DATA_DATA \ 332129f6c48SArnd Bergmann *(.xiptext) \ 333cb87481eSNicholas Piggin *(DATA_MAIN) \ 334312b1485SSam Ravnborg *(.ref.data) \ 335d356c0b6SMike Frysinger *(.data..shared_aligned) /* percpu related */ \ 336266ff2a8SNicholas Piggin MEM_KEEP(init.data*) \ 337266ff2a8SNicholas Piggin MEM_KEEP(exit.data*) \ 3387ccaba53SJan Beulich *(.data.unlikely) \ 339a6214385SMasahiro Yamada __start_once = .; \ 340b1fca27dSAndi Kleen *(.data.once) \ 341a6214385SMasahiro Yamada __end_once = .; \ 34265498646SMathieu Desnoyers STRUCT_ALIGN(); \ 34397e1c18eSMathieu Desnoyers *(__tracepoints) \ 344e9d376f0SJason Baron /* implement dynamic printk debug */ \ 345e9d376f0SJason Baron . = ALIGN(8); \ 346e5ebffe1SJim Cromie __start___dyndbg = .; \ 347e5ebffe1SJim Cromie KEEP(*(__dyndbg)) \ 348e5ebffe1SJim Cromie __stop___dyndbg = .; \ 3492bcd521aSSteven Rostedt LIKELY_PROFILE() \ 350b77e38aaSSteven Rostedt BRANCH_PROFILE() \ 351102c9323SSteven Rostedt (Red Hat) TRACE_PRINTKS() \ 352c4f6699dSAlexei Starovoitov BPF_RAW_TP() \ 353102c9323SSteven Rostedt (Red Hat) TRACEPOINT_STR() 354ca967258SSam Ravnborg 355ef53dae8SSam Ravnborg /* 356ef53dae8SSam Ravnborg * Data section helpers 357ef53dae8SSam Ravnborg */ 358ef53dae8SSam Ravnborg #define NOSAVE_DATA \ 359ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 360a6214385SMasahiro Yamada __nosave_begin = .; \ 36107b3bb1eSDenys Vlasenko *(.data..nosave) \ 362ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 363a6214385SMasahiro Yamada __nosave_end = .; 364ef53dae8SSam Ravnborg 365ef53dae8SSam Ravnborg #define PAGE_ALIGNED_DATA(page_align) \ 366ef53dae8SSam Ravnborg . = ALIGN(page_align); \ 367de2b41beSJoerg Roedel *(.data..page_aligned) \ 368de2b41beSJoerg Roedel . = ALIGN(page_align); 369ef53dae8SSam Ravnborg 370ef53dae8SSam Ravnborg #define READ_MOSTLY_DATA(align) \ 371ef53dae8SSam Ravnborg . = ALIGN(align); \ 3728369744fSShaohua Li *(.data..read_mostly) \ 3738369744fSShaohua Li . = ALIGN(align); 374ef53dae8SSam Ravnborg 375ef53dae8SSam Ravnborg #define CACHELINE_ALIGNED_DATA(align) \ 376ef53dae8SSam Ravnborg . = ALIGN(align); \ 3774af57b78STim Abbott *(.data..cacheline_aligned) 378ef53dae8SSam Ravnborg 37939a449d9STim Abbott #define INIT_TASK_DATA(align) \ 380ef53dae8SSam Ravnborg . = ALIGN(align); \ 381a6214385SMasahiro Yamada __start_init_task = .; \ 382a6214385SMasahiro Yamada init_thread_union = .; \ 383a6214385SMasahiro Yamada init_stack = .; \ 384266ff2a8SNicholas Piggin KEEP(*(.data..init_task)) \ 385266ff2a8SNicholas Piggin KEEP(*(.data..init_thread_info)) \ 386a6214385SMasahiro Yamada . = __start_init_task + THREAD_SIZE; \ 387a6214385SMasahiro Yamada __end_init_task = .; 388ef53dae8SSam Ravnborg 389e872267bSArd Biesheuvel #define JUMP_TABLE_DATA \ 390e872267bSArd Biesheuvel . = ALIGN(8); \ 391e872267bSArd Biesheuvel __start___jump_table = .; \ 392e872267bSArd Biesheuvel KEEP(*(__jump_table)) \ 393e872267bSArd Biesheuvel __stop___jump_table = .; 394e872267bSArd Biesheuvel 3959183c3f9SJosh Poimboeuf #define STATIC_CALL_DATA \ 3969183c3f9SJosh Poimboeuf . = ALIGN(8); \ 3979183c3f9SJosh Poimboeuf __start_static_call_sites = .; \ 3989183c3f9SJosh Poimboeuf KEEP(*(.static_call_sites)) \ 3999183c3f9SJosh Poimboeuf __stop_static_call_sites = .; 4009183c3f9SJosh Poimboeuf 401ef53dae8SSam Ravnborg /* 40232fb2fc5SHeiko Carstens * Allow architectures to handle ro_after_init data on their 40332fb2fc5SHeiko Carstens * own by defining an empty RO_AFTER_INIT_DATA. 40432fb2fc5SHeiko Carstens */ 40532fb2fc5SHeiko Carstens #ifndef RO_AFTER_INIT_DATA 406d7c19b06SJakub Kicinski #define RO_AFTER_INIT_DATA \ 4077f897acbSRomain Naour . = ALIGN(8); \ 408a6214385SMasahiro Yamada __start_ro_after_init = .; \ 409d7c19b06SJakub Kicinski *(.data..ro_after_init) \ 410e872267bSArd Biesheuvel JUMP_TABLE_DATA \ 4119183c3f9SJosh Poimboeuf STATIC_CALL_DATA \ 412a6214385SMasahiro Yamada __end_ro_after_init = .; 41332fb2fc5SHeiko Carstens #endif 41432fb2fc5SHeiko Carstens 41532fb2fc5SHeiko Carstens /* 416ef53dae8SSam Ravnborg * Read only Data 417ef53dae8SSam Ravnborg */ 41893240b32SKees Cook #define RO_DATA(align) \ 4194096b46fSSam Ravnborg . = ALIGN((align)); \ 4201da177e4SLinus Torvalds .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ 421a6214385SMasahiro Yamada __start_rodata = .; \ 4221da177e4SLinus Torvalds *(.rodata) *(.rodata.*) \ 423590d6979SSteven Rostedt (VMware) SCHED_DATA \ 42432fb2fc5SHeiko Carstens RO_AFTER_INIT_DATA /* Read only after init */ \ 42565498646SMathieu Desnoyers . = ALIGN(8); \ 426a6214385SMasahiro Yamada __start___tracepoints_ptrs = .; \ 4274b89b7f7SNicholas Piggin KEEP(*(__tracepoints_ptrs)) /* Tracepoints: pointer array */ \ 428a6214385SMasahiro Yamada __stop___tracepoints_ptrs = .; \ 42997e1c18eSMathieu Desnoyers *(__tracepoints_strings)/* Tracepoints: strings */ \ 4301da177e4SLinus Torvalds } \ 4311da177e4SLinus Torvalds \ 4321da177e4SLinus Torvalds .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \ 4331da177e4SLinus Torvalds *(.rodata1) \ 4341da177e4SLinus Torvalds } \ 4351da177e4SLinus Torvalds \ 4361da177e4SLinus Torvalds /* PCI quirks */ \ 4371da177e4SLinus Torvalds .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ 438a6214385SMasahiro Yamada __start_pci_fixups_early = .; \ 4394b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_early)) \ 440a6214385SMasahiro Yamada __end_pci_fixups_early = .; \ 441a6214385SMasahiro Yamada __start_pci_fixups_header = .; \ 4424b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_header)) \ 443a6214385SMasahiro Yamada __end_pci_fixups_header = .; \ 444a6214385SMasahiro Yamada __start_pci_fixups_final = .; \ 4454b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_final)) \ 446a6214385SMasahiro Yamada __end_pci_fixups_final = .; \ 447a6214385SMasahiro Yamada __start_pci_fixups_enable = .; \ 4484b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_enable)) \ 449a6214385SMasahiro Yamada __end_pci_fixups_enable = .; \ 450a6214385SMasahiro Yamada __start_pci_fixups_resume = .; \ 4514b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_resume)) \ 452a6214385SMasahiro Yamada __end_pci_fixups_resume = .; \ 453a6214385SMasahiro Yamada __start_pci_fixups_resume_early = .; \ 4544b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_resume_early)) \ 455a6214385SMasahiro Yamada __end_pci_fixups_resume_early = .; \ 456a6214385SMasahiro Yamada __start_pci_fixups_suspend = .; \ 4574b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_suspend)) \ 458a6214385SMasahiro Yamada __end_pci_fixups_suspend = .; \ 459a6214385SMasahiro Yamada __start_pci_fixups_suspend_late = .; \ 4604b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_suspend_late)) \ 461a6214385SMasahiro Yamada __end_pci_fixups_suspend_late = .; \ 4621da177e4SLinus Torvalds } \ 4631da177e4SLinus Torvalds \ 4645658c769SDavid Woodhouse /* Built-in firmware blobs */ \ 4655658c769SDavid Woodhouse .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \ 466a6214385SMasahiro Yamada __start_builtin_fw = .; \ 4674b89b7f7SNicholas Piggin KEEP(*(.builtin_fw)) \ 468a6214385SMasahiro Yamada __end_builtin_fw = .; \ 4695658c769SDavid Woodhouse } \ 4705658c769SDavid Woodhouse \ 47163687a52SJan Beulich TRACEDATA \ 47263687a52SJan Beulich \ 4731da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 4741da177e4SLinus Torvalds __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ 475a6214385SMasahiro Yamada __start___ksymtab = .; \ 476b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab+*))) \ 477a6214385SMasahiro Yamada __stop___ksymtab = .; \ 4781da177e4SLinus Torvalds } \ 4791da177e4SLinus Torvalds \ 4801da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 4811da177e4SLinus Torvalds __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ 482a6214385SMasahiro Yamada __start___ksymtab_gpl = .; \ 483b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_gpl+*))) \ 484a6214385SMasahiro Yamada __stop___ksymtab_gpl = .; \ 4851da177e4SLinus Torvalds } \ 4861da177e4SLinus Torvalds \ 487f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 488f71d20e9SArjan van de Ven __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ 489a6214385SMasahiro Yamada __start___ksymtab_unused = .; \ 490b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_unused+*))) \ 491a6214385SMasahiro Yamada __stop___ksymtab_unused = .; \ 492f71d20e9SArjan van de Ven } \ 493f71d20e9SArjan van de Ven \ 494f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 495f71d20e9SArjan van de Ven __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ 496a6214385SMasahiro Yamada __start___ksymtab_unused_gpl = .; \ 497b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_unused_gpl+*))) \ 498a6214385SMasahiro Yamada __stop___ksymtab_unused_gpl = .; \ 499f71d20e9SArjan van de Ven } \ 500f71d20e9SArjan van de Ven \ 5019f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 5029f28bb7eSGreg Kroah-Hartman __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ 503a6214385SMasahiro Yamada __start___ksymtab_gpl_future = .; \ 504b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_gpl_future+*))) \ 505a6214385SMasahiro Yamada __stop___ksymtab_gpl_future = .; \ 5069f28bb7eSGreg Kroah-Hartman } \ 5079f28bb7eSGreg Kroah-Hartman \ 5081da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 5091da177e4SLinus Torvalds __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ 510a6214385SMasahiro Yamada __start___kcrctab = .; \ 511b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab+*))) \ 512a6214385SMasahiro Yamada __stop___kcrctab = .; \ 5131da177e4SLinus Torvalds } \ 5141da177e4SLinus Torvalds \ 5151da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 5161da177e4SLinus Torvalds __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ 517a6214385SMasahiro Yamada __start___kcrctab_gpl = .; \ 518b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_gpl+*))) \ 519a6214385SMasahiro Yamada __stop___kcrctab_gpl = .; \ 5201da177e4SLinus Torvalds } \ 5211da177e4SLinus Torvalds \ 522f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 523f71d20e9SArjan van de Ven __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \ 524a6214385SMasahiro Yamada __start___kcrctab_unused = .; \ 525b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_unused+*))) \ 526a6214385SMasahiro Yamada __stop___kcrctab_unused = .; \ 527f71d20e9SArjan van de Ven } \ 528f71d20e9SArjan van de Ven \ 529f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 530f71d20e9SArjan van de Ven __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ 531a6214385SMasahiro Yamada __start___kcrctab_unused_gpl = .; \ 532b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_unused_gpl+*))) \ 533a6214385SMasahiro Yamada __stop___kcrctab_unused_gpl = .; \ 534f71d20e9SArjan van de Ven } \ 535f71d20e9SArjan van de Ven \ 5369f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 5379f28bb7eSGreg Kroah-Hartman __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ 538a6214385SMasahiro Yamada __start___kcrctab_gpl_future = .; \ 539b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_gpl_future+*))) \ 540a6214385SMasahiro Yamada __stop___kcrctab_gpl_future = .; \ 5419f28bb7eSGreg Kroah-Hartman } \ 5429f28bb7eSGreg Kroah-Hartman \ 5431da177e4SLinus Torvalds /* Kernel symbol table: strings */ \ 5441da177e4SLinus Torvalds __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ 5454b89b7f7SNicholas Piggin *(__ksymtab_strings) \ 5461da177e4SLinus Torvalds } \ 5471da177e4SLinus Torvalds \ 548eb8f6890SSam Ravnborg /* __*init sections */ \ 549eb8f6890SSam Ravnborg __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) { \ 550312b1485SSam Ravnborg *(.ref.rodata) \ 551eb8f6890SSam Ravnborg MEM_KEEP(init.rodata) \ 552eb8f6890SSam Ravnborg MEM_KEEP(exit.rodata) \ 553eb8f6890SSam Ravnborg } \ 554eb8f6890SSam Ravnborg \ 5551da177e4SLinus Torvalds /* Built-in module parameters. */ \ 5561da177e4SLinus Torvalds __param : AT(ADDR(__param) - LOAD_OFFSET) { \ 557a6214385SMasahiro Yamada __start___param = .; \ 5584b89b7f7SNicholas Piggin KEEP(*(__param)) \ 559a6214385SMasahiro Yamada __stop___param = .; \ 560e94965edSDmitry Torokhov } \ 561e94965edSDmitry Torokhov \ 562e94965edSDmitry Torokhov /* Built-in module versions. */ \ 563e94965edSDmitry Torokhov __modver : AT(ADDR(__modver) - LOAD_OFFSET) { \ 564a6214385SMasahiro Yamada __start___modver = .; \ 5654b89b7f7SNicholas Piggin KEEP(*(__modver)) \ 566a6214385SMasahiro Yamada __stop___modver = .; \ 5677583ddfdSMarcelo Tosatti } \ 568eaf93707SKees Cook \ 569b8c2f776SKees Cook RO_EXCEPTION_TABLE \ 570eaf93707SKees Cook NOTES \ 57190ceddcbSFangrui Song BTF \ 572eaf93707SKees Cook \ 573eaf93707SKees Cook . = ALIGN((align)); \ 574eaf93707SKees Cook __end_rodata = .; 5751da177e4SLinus Torvalds 576cb87481eSNicholas Piggin /* 57765538966SThomas Gleixner * Non-instrumentable text section 57865538966SThomas Gleixner */ 57965538966SThomas Gleixner #define NOINSTR_TEXT \ 58065538966SThomas Gleixner ALIGN_FUNCTION(); \ 58165538966SThomas Gleixner __noinstr_text_start = .; \ 58265538966SThomas Gleixner *(.noinstr.text) \ 58365538966SThomas Gleixner __noinstr_text_end = .; 58465538966SThomas Gleixner 58565538966SThomas Gleixner /* 586cb87481eSNicholas Piggin * .text section. Map to function alignment to avoid address changes 5870f4c4af0SNicholas Piggin * during second ld run in second ld pass when generating System.map 588cb87481eSNicholas Piggin * 589cb87481eSNicholas Piggin * TEXT_MAIN here will match .text.fixup and .text.unlikely if dead 590cb87481eSNicholas Piggin * code elimination is enabled, so these sections should be converted 591cb87481eSNicholas Piggin * to use ".." first. 592cb87481eSNicholas Piggin */ 5937664709bSSam Ravnborg #define TEXT_TEXT \ 5947664709bSSam Ravnborg ALIGN_FUNCTION(); \ 595eff8728fSNick Desaulniers *(.text.hot .text.hot.*) \ 596eff8728fSNick Desaulniers *(TEXT_MAIN .text.fixup) \ 597eff8728fSNick Desaulniers *(.text.unlikely .text.unlikely.*) \ 598eff8728fSNick Desaulniers *(.text.unknown .text.unknown.*) \ 59965538966SThomas Gleixner NOINSTR_TEXT \ 600564c9cc8SKees Cook *(.text..refcount) \ 601312b1485SSam Ravnborg *(.ref.text) \ 602266ff2a8SNicholas Piggin MEM_KEEP(init.text*) \ 603266ff2a8SNicholas Piggin MEM_KEEP(exit.text*) \ 604eb8f6890SSam Ravnborg 6057664709bSSam Ravnborg 6066d30e3a8SSam Ravnborg /* sched.text is aling to function alignment to secure we have same 6076d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 6081da177e4SLinus Torvalds #define SCHED_TEXT \ 6096d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 610a6214385SMasahiro Yamada __sched_text_start = .; \ 6111da177e4SLinus Torvalds *(.sched.text) \ 612a6214385SMasahiro Yamada __sched_text_end = .; 6131da177e4SLinus Torvalds 6146d30e3a8SSam Ravnborg /* spinlock.text is aling to function alignment to secure we have same 6156d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 6161da177e4SLinus Torvalds #define LOCK_TEXT \ 6176d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 618a6214385SMasahiro Yamada __lock_text_start = .; \ 6191da177e4SLinus Torvalds *(.spinlock.text) \ 620a6214385SMasahiro Yamada __lock_text_end = .; 621d0aaff97SPrasanna S Panchamukhi 6226727ad9eSChris Metcalf #define CPUIDLE_TEXT \ 6236727ad9eSChris Metcalf ALIGN_FUNCTION(); \ 624a6214385SMasahiro Yamada __cpuidle_text_start = .; \ 6256727ad9eSChris Metcalf *(.cpuidle.text) \ 626a6214385SMasahiro Yamada __cpuidle_text_end = .; 6276727ad9eSChris Metcalf 628d0aaff97SPrasanna S Panchamukhi #define KPROBES_TEXT \ 629d0aaff97SPrasanna S Panchamukhi ALIGN_FUNCTION(); \ 630a6214385SMasahiro Yamada __kprobes_text_start = .; \ 631d0aaff97SPrasanna S Panchamukhi *(.kprobes.text) \ 632a6214385SMasahiro Yamada __kprobes_text_end = .; 633a7d0c210SPaolo 'Blaisorblade' Giarrusso 634ea714547SJiri Olsa #define ENTRY_TEXT \ 635ea714547SJiri Olsa ALIGN_FUNCTION(); \ 636a6214385SMasahiro Yamada __entry_text_start = .; \ 637ea714547SJiri Olsa *(.entry.text) \ 638a6214385SMasahiro Yamada __entry_text_end = .; 639ea714547SJiri Olsa 640a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT \ 641a0343e82SFrederic Weisbecker ALIGN_FUNCTION(); \ 642a6214385SMasahiro Yamada __irqentry_text_start = .; \ 643a0343e82SFrederic Weisbecker *(.irqentry.text) \ 644a6214385SMasahiro Yamada __irqentry_text_end = .; 645a0343e82SFrederic Weisbecker 646be7635e7SAlexander Potapenko #define SOFTIRQENTRY_TEXT \ 647be7635e7SAlexander Potapenko ALIGN_FUNCTION(); \ 648a6214385SMasahiro Yamada __softirqentry_text_start = .; \ 649be7635e7SAlexander Potapenko *(.softirqentry.text) \ 650a6214385SMasahiro Yamada __softirqentry_text_end = .; 651be7635e7SAlexander Potapenko 6521e7e4788SJosh Poimboeuf #define STATIC_CALL_TEXT \ 6531e7e4788SJosh Poimboeuf ALIGN_FUNCTION(); \ 6541e7e4788SJosh Poimboeuf __static_call_text_start = .; \ 6551e7e4788SJosh Poimboeuf *(.static_call.text) \ 6561e7e4788SJosh Poimboeuf __static_call_text_end = .; 6571e7e4788SJosh Poimboeuf 65837c514e3SSam Ravnborg /* Section used for early init (in .S files) */ 659266ff2a8SNicholas Piggin #define HEAD_TEXT KEEP(*(.head.text)) 66037c514e3SSam Ravnborg 6617923f90fSSam Ravnborg #define HEAD_TEXT_SECTION \ 662ef53dae8SSam Ravnborg .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) { \ 663ef53dae8SSam Ravnborg HEAD_TEXT \ 664ef53dae8SSam Ravnborg } 665ef53dae8SSam Ravnborg 666ef53dae8SSam Ravnborg /* 667ef53dae8SSam Ravnborg * Exception table 668ef53dae8SSam Ravnborg */ 669ef53dae8SSam Ravnborg #define EXCEPTION_TABLE(align) \ 670ef53dae8SSam Ravnborg . = ALIGN(align); \ 671ef53dae8SSam Ravnborg __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \ 672a6214385SMasahiro Yamada __start___ex_table = .; \ 6734b89b7f7SNicholas Piggin KEEP(*(__ex_table)) \ 674a6214385SMasahiro Yamada __stop___ex_table = .; \ 675ef53dae8SSam Ravnborg } 676ef53dae8SSam Ravnborg 677ef53dae8SSam Ravnborg /* 67890ceddcbSFangrui Song * .BTF 67990ceddcbSFangrui Song */ 68090ceddcbSFangrui Song #ifdef CONFIG_DEBUG_INFO_BTF 68190ceddcbSFangrui Song #define BTF \ 68290ceddcbSFangrui Song .BTF : AT(ADDR(.BTF) - LOAD_OFFSET) { \ 68390ceddcbSFangrui Song __start_BTF = .; \ 68465c20439STony Ambardar KEEP(*(.BTF)) \ 68590ceddcbSFangrui Song __stop_BTF = .; \ 6865a2798abSJiri Olsa } \ 6875a2798abSJiri Olsa . = ALIGN(4); \ 6885a2798abSJiri Olsa .BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) { \ 6895a2798abSJiri Olsa *(.BTF_ids) \ 69090ceddcbSFangrui Song } 69190ceddcbSFangrui Song #else 69290ceddcbSFangrui Song #define BTF 69390ceddcbSFangrui Song #endif 69490ceddcbSFangrui Song 69590ceddcbSFangrui Song /* 696ef53dae8SSam Ravnborg * Init task 697ef53dae8SSam Ravnborg */ 69839a449d9STim Abbott #define INIT_TASK_DATA_SECTION(align) \ 699ef53dae8SSam Ravnborg . = ALIGN(align); \ 700da5e37efSSam Ravnborg .data..init_task : AT(ADDR(.data..init_task) - LOAD_OFFSET) { \ 70139a449d9STim Abbott INIT_TASK_DATA(align) \ 702ef53dae8SSam Ravnborg } 703eb8f6890SSam Ravnborg 704b99b87f7SPeter Oberparleiter #ifdef CONFIG_CONSTRUCTORS 7052a2325e6SHeiko Carstens #define KERNEL_CTORS() . = ALIGN(8); \ 706a6214385SMasahiro Yamada __ctors_start = .; \ 7073e663148SKees Cook KEEP(*(SORT(.ctors.*))) \ 7084b89b7f7SNicholas Piggin KEEP(*(.ctors)) \ 7094b89b7f7SNicholas Piggin KEEP(*(SORT(.init_array.*))) \ 7104b89b7f7SNicholas Piggin KEEP(*(.init_array)) \ 711a6214385SMasahiro Yamada __ctors_end = .; 712b99b87f7SPeter Oberparleiter #else 713b99b87f7SPeter Oberparleiter #define KERNEL_CTORS() 714b99b87f7SPeter Oberparleiter #endif 715b99b87f7SPeter Oberparleiter 71601ba2bdcSSam Ravnborg /* init and exit section handling */ 717eb8f6890SSam Ravnborg #define INIT_DATA \ 718b67067f1SNicholas Piggin KEEP(*(SORT(___kentry+*))) \ 719266ff2a8SNicholas Piggin *(.init.data init.data.*) \ 720266ff2a8SNicholas Piggin MEM_DISCARD(init.data*) \ 721b99b87f7SPeter Oberparleiter KERNEL_CTORS() \ 7224b3b4c5eSJohn Reiser MCOUNT_REC() \ 723266ff2a8SNicholas Piggin *(.init.rodata .init.rodata.*) \ 724e4a9ea5eSSteven Rostedt FTRACE_EVENTS() \ 7253d56e331SSteven Rostedt TRACE_SYSCALLS() \ 726376e2424SMasami Hiramatsu KPROBE_BLACKLIST() \ 727540adea3SMasami Hiramatsu ERROR_INJECT_WHITELIST() \ 728aab94339SDirk Brandewie MEM_DISCARD(init.rodata) \ 729f2f6c255SPrashant Gaikwad CLK_OF_TABLES() \ 730f618c470SMarek Szyprowski RESERVEDMEM_OF_TABLES() \ 7312fcc112aSDaniel Lezcano TIMER_OF_TABLES() \ 7326c3ff8b1SStephen Boyd CPU_METHOD_OF_TABLES() \ 733449e056cSDaniel Lezcano CPUIDLE_METHOD_OF_TABLES() \ 734f6e916b8SThomas Petazzoni KERNEL_DTB() \ 735b0b6abd3SRob Herring IRQCHIP_OF_MATCH_TABLE() \ 73646e589a3SMarc Zyngier ACPI_PROBE_TABLE(irqchip) \ 7372fcc112aSDaniel Lezcano ACPI_PROBE_TABLE(timer) \ 738980af75eSDaniel Lezcano THERMAL_TABLE(governor) \ 7393ac946d1SKees Cook EARLYCON_TABLE() \ 740e6b1db98SMatthew Garrett LSM_TABLE() \ 74190a025a8SBrendan Higgins EARLY_LSM_TABLE() \ 74290a025a8SBrendan Higgins KUNIT_TABLE() 74301ba2bdcSSam Ravnborg 744eb8f6890SSam Ravnborg #define INIT_TEXT \ 745266ff2a8SNicholas Piggin *(.init.text .init.text.*) \ 746e41f501dSDmitry Vyukov *(.text.startup) \ 747266ff2a8SNicholas Piggin MEM_DISCARD(init.text*) 748eb8f6890SSam Ravnborg 749eb8f6890SSam Ravnborg #define EXIT_DATA \ 750266ff2a8SNicholas Piggin *(.exit.data .exit.data.*) \ 7518dcf86caSPeter Oberparleiter *(.fini_array .fini_array.*) \ 7528dcf86caSPeter Oberparleiter *(.dtors .dtors.*) \ 753266ff2a8SNicholas Piggin MEM_DISCARD(exit.data*) \ 754266ff2a8SNicholas Piggin MEM_DISCARD(exit.rodata*) 755eb8f6890SSam Ravnborg 756eb8f6890SSam Ravnborg #define EXIT_TEXT \ 757eb8f6890SSam Ravnborg *(.exit.text) \ 758e41f501dSDmitry Vyukov *(.text.exit) \ 759eb8f6890SSam Ravnborg MEM_DISCARD(exit.text) 76001ba2bdcSSam Ravnborg 7617923f90fSSam Ravnborg #define EXIT_CALL \ 7627923f90fSSam Ravnborg *(.exitcall.exit) 7637923f90fSSam Ravnborg 764ef53dae8SSam Ravnborg /* 765ef53dae8SSam Ravnborg * bss (Block Started by Symbol) - uninitialized data 766ef53dae8SSam Ravnborg * zeroed during startup 767ef53dae8SSam Ravnborg */ 76804e448d9STim Abbott #define SBSS(sbss_align) \ 76904e448d9STim Abbott . = ALIGN(sbss_align); \ 770ef53dae8SSam Ravnborg .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \ 77183a092cfSNicholas Piggin *(.dynsbss) \ 772266ff2a8SNicholas Piggin *(SBSS_MAIN) \ 773ef53dae8SSam Ravnborg *(.scommon) \ 774ef53dae8SSam Ravnborg } 775ef53dae8SSam Ravnborg 776c87728caSDavid Daney /* 777c87728caSDavid Daney * Allow archectures to redefine BSS_FIRST_SECTIONS to add extra 778c87728caSDavid Daney * sections to the front of bss. 779c87728caSDavid Daney */ 780c87728caSDavid Daney #ifndef BSS_FIRST_SECTIONS 781c87728caSDavid Daney #define BSS_FIRST_SECTIONS 782c87728caSDavid Daney #endif 783c87728caSDavid Daney 784ef53dae8SSam Ravnborg #define BSS(bss_align) \ 785ef53dae8SSam Ravnborg . = ALIGN(bss_align); \ 786ef53dae8SSam Ravnborg .bss : AT(ADDR(.bss) - LOAD_OFFSET) { \ 787c87728caSDavid Daney BSS_FIRST_SECTIONS \ 788de2b41beSJoerg Roedel . = ALIGN(PAGE_SIZE); \ 7897c74df07STim Abbott *(.bss..page_aligned) \ 790de2b41beSJoerg Roedel . = ALIGN(PAGE_SIZE); \ 791ef53dae8SSam Ravnborg *(.dynbss) \ 792cb87481eSNicholas Piggin *(BSS_MAIN) \ 793ef53dae8SSam Ravnborg *(COMMON) \ 794ef53dae8SSam Ravnborg } 795ef53dae8SSam Ravnborg 796ef53dae8SSam Ravnborg /* 797ef53dae8SSam Ravnborg * DWARF debug sections. 798ef53dae8SSam Ravnborg * Symbols in the DWARF debugging sections are relative to 799ef53dae8SSam Ravnborg * the beginning of the section so we begin them at 0. 800ef53dae8SSam Ravnborg */ 801a7d0c210SPaolo 'Blaisorblade' Giarrusso #define DWARF_DEBUG \ 802a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1 */ \ 803a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug 0 : { *(.debug) } \ 804a7d0c210SPaolo 'Blaisorblade' Giarrusso .line 0 : { *(.line) } \ 805a7d0c210SPaolo 'Blaisorblade' Giarrusso /* GNU DWARF 1 extensions */ \ 806a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_srcinfo 0 : { *(.debug_srcinfo) } \ 807a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_sfnames 0 : { *(.debug_sfnames) } \ 808a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1.1 and DWARF 2 */ \ 809a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_aranges 0 : { *(.debug_aranges) } \ 810a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_pubnames 0 : { *(.debug_pubnames) } \ 811a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 2 */ \ 812a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_info 0 : { *(.debug_info \ 813a7d0c210SPaolo 'Blaisorblade' Giarrusso .gnu.linkonce.wi.*) } \ 814a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_abbrev 0 : { *(.debug_abbrev) } \ 815a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_line 0 : { *(.debug_line) } \ 816a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_frame 0 : { *(.debug_frame) } \ 817a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_str 0 : { *(.debug_str) } \ 818a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_loc 0 : { *(.debug_loc) } \ 819a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_macinfo 0 : { *(.debug_macinfo) } \ 82083a092cfSNicholas Piggin .debug_pubtypes 0 : { *(.debug_pubtypes) } \ 82183a092cfSNicholas Piggin /* DWARF 3 */ \ 82283a092cfSNicholas Piggin .debug_ranges 0 : { *(.debug_ranges) } \ 823a7d0c210SPaolo 'Blaisorblade' Giarrusso /* SGI/MIPS DWARF 2 extensions */ \ 824a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_weaknames 0 : { *(.debug_weaknames) } \ 825a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_funcnames 0 : { *(.debug_funcnames) } \ 826a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_typenames 0 : { *(.debug_typenames) } \ 827a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_varnames 0 : { *(.debug_varnames) } \ 82883a092cfSNicholas Piggin /* GNU DWARF 2 extensions */ \ 82983a092cfSNicholas Piggin .debug_gnu_pubnames 0 : { *(.debug_gnu_pubnames) } \ 83083a092cfSNicholas Piggin .debug_gnu_pubtypes 0 : { *(.debug_gnu_pubtypes) } \ 83183a092cfSNicholas Piggin /* DWARF 4 */ \ 83283a092cfSNicholas Piggin .debug_types 0 : { *(.debug_types) } \ 83383a092cfSNicholas Piggin /* DWARF 5 */ \ 83483a092cfSNicholas Piggin .debug_macro 0 : { *(.debug_macro) } \ 83583a092cfSNicholas Piggin .debug_addr 0 : { *(.debug_addr) } 836a7d0c210SPaolo 'Blaisorblade' Giarrusso 837a7d0c210SPaolo 'Blaisorblade' Giarrusso /* Stabs debugging sections. */ 838a7d0c210SPaolo 'Blaisorblade' Giarrusso #define STABS_DEBUG \ 839a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab 0 : { *(.stab) } \ 840a7d0c210SPaolo 'Blaisorblade' Giarrusso .stabstr 0 : { *(.stabstr) } \ 841a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.excl 0 : { *(.stab.excl) } \ 842a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.exclstr 0 : { *(.stab.exclstr) } \ 843a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.index 0 : { *(.stab.index) } \ 844c604abc3SKees Cook .stab.indexstr 0 : { *(.stab.indexstr) } 845c604abc3SKees Cook 846c604abc3SKees Cook /* Required sections not related to debugging. */ 847c604abc3SKees Cook #define ELF_DETAILS \ 848a840c4deSKees Cook .comment 0 : { *(.comment) } \ 849a840c4deSKees Cook .symtab 0 : { *(.symtab) } \ 850a840c4deSKees Cook .strtab 0 : { *(.strtab) } \ 851a840c4deSKees Cook .shstrtab 0 : { *(.shstrtab) } 8529c9b8b38SJeremy Fitzhardinge 8536360b1fbSJan Beulich #ifdef CONFIG_GENERIC_BUG 8547664c5a1SJeremy Fitzhardinge #define BUG_TABLE \ 8557664c5a1SJeremy Fitzhardinge . = ALIGN(8); \ 8567664c5a1SJeremy Fitzhardinge __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \ 857a6214385SMasahiro Yamada __start___bug_table = .; \ 8584b89b7f7SNicholas Piggin KEEP(*(__bug_table)) \ 859a6214385SMasahiro Yamada __stop___bug_table = .; \ 8607664c5a1SJeremy Fitzhardinge } 8616360b1fbSJan Beulich #else 8626360b1fbSJan Beulich #define BUG_TABLE 8636360b1fbSJan Beulich #endif 8647664c5a1SJeremy Fitzhardinge 86511af8474SJosh Poimboeuf #ifdef CONFIG_UNWINDER_ORC 866ee9f8fceSJosh Poimboeuf #define ORC_UNWIND_TABLE \ 867ee9f8fceSJosh Poimboeuf . = ALIGN(4); \ 868ee9f8fceSJosh Poimboeuf .orc_unwind_ip : AT(ADDR(.orc_unwind_ip) - LOAD_OFFSET) { \ 869a6214385SMasahiro Yamada __start_orc_unwind_ip = .; \ 870ee9f8fceSJosh Poimboeuf KEEP(*(.orc_unwind_ip)) \ 871a6214385SMasahiro Yamada __stop_orc_unwind_ip = .; \ 872ee9f8fceSJosh Poimboeuf } \ 873f76a16adSJosh Poimboeuf . = ALIGN(2); \ 874ee9f8fceSJosh Poimboeuf .orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) { \ 875a6214385SMasahiro Yamada __start_orc_unwind = .; \ 876ee9f8fceSJosh Poimboeuf KEEP(*(.orc_unwind)) \ 877a6214385SMasahiro Yamada __stop_orc_unwind = .; \ 878ee9f8fceSJosh Poimboeuf } \ 879ee9f8fceSJosh Poimboeuf . = ALIGN(4); \ 880ee9f8fceSJosh Poimboeuf .orc_lookup : AT(ADDR(.orc_lookup) - LOAD_OFFSET) { \ 881a6214385SMasahiro Yamada orc_lookup = .; \ 882ee9f8fceSJosh Poimboeuf . += (((SIZEOF(.text) + LOOKUP_BLOCK_SIZE - 1) / \ 883ee9f8fceSJosh Poimboeuf LOOKUP_BLOCK_SIZE) + 1) * 4; \ 884a6214385SMasahiro Yamada orc_lookup_end = .; \ 885ee9f8fceSJosh Poimboeuf } 886ee9f8fceSJosh Poimboeuf #else 887ee9f8fceSJosh Poimboeuf #define ORC_UNWIND_TABLE 888ee9f8fceSJosh Poimboeuf #endif 889ee9f8fceSJosh Poimboeuf 89063687a52SJan Beulich #ifdef CONFIG_PM_TRACE 89163687a52SJan Beulich #define TRACEDATA \ 89263687a52SJan Beulich . = ALIGN(4); \ 89363687a52SJan Beulich .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \ 894a6214385SMasahiro Yamada __tracedata_start = .; \ 8954b89b7f7SNicholas Piggin KEEP(*(.tracedata)) \ 896a6214385SMasahiro Yamada __tracedata_end = .; \ 89763687a52SJan Beulich } 89863687a52SJan Beulich #else 89963687a52SJan Beulich #define TRACEDATA 90063687a52SJan Beulich #endif 90163687a52SJan Beulich 9029c9b8b38SJeremy Fitzhardinge #define NOTES \ 903cbe87121SRoland McGrath .notes : AT(ADDR(.notes) - LOAD_OFFSET) { \ 904a6214385SMasahiro Yamada __start_notes = .; \ 905266ff2a8SNicholas Piggin KEEP(*(.note.*)) \ 906a6214385SMasahiro Yamada __stop_notes = .; \ 907fbe6a8e6SKees Cook } NOTES_HEADERS \ 908fbe6a8e6SKees Cook NOTES_HEADERS_RESTORE 90961ce1efeSAndrew Morton 910ef53dae8SSam Ravnborg #define INIT_SETUP(initsetup_align) \ 911ef53dae8SSam Ravnborg . = ALIGN(initsetup_align); \ 912a6214385SMasahiro Yamada __setup_start = .; \ 9134b89b7f7SNicholas Piggin KEEP(*(.init.setup)) \ 914a6214385SMasahiro Yamada __setup_end = .; 915ef53dae8SSam Ravnborg 916026cee00SPawel Moll #define INIT_CALLS_LEVEL(level) \ 917a6214385SMasahiro Yamada __initcall##level##_start = .; \ 918b67067f1SNicholas Piggin KEEP(*(.initcall##level##.init)) \ 919b67067f1SNicholas Piggin KEEP(*(.initcall##level##s.init)) \ 92061ce1efeSAndrew Morton 921ef53dae8SSam Ravnborg #define INIT_CALLS \ 922a6214385SMasahiro Yamada __initcall_start = .; \ 923b67067f1SNicholas Piggin KEEP(*(.initcallearly.init)) \ 924026cee00SPawel Moll INIT_CALLS_LEVEL(0) \ 925026cee00SPawel Moll INIT_CALLS_LEVEL(1) \ 926026cee00SPawel Moll INIT_CALLS_LEVEL(2) \ 927026cee00SPawel Moll INIT_CALLS_LEVEL(3) \ 928026cee00SPawel Moll INIT_CALLS_LEVEL(4) \ 929026cee00SPawel Moll INIT_CALLS_LEVEL(5) \ 930026cee00SPawel Moll INIT_CALLS_LEVEL(rootfs) \ 931026cee00SPawel Moll INIT_CALLS_LEVEL(6) \ 932026cee00SPawel Moll INIT_CALLS_LEVEL(7) \ 933a6214385SMasahiro Yamada __initcall_end = .; 934ef53dae8SSam Ravnborg 935ef53dae8SSam Ravnborg #define CON_INITCALL \ 936a6214385SMasahiro Yamada __con_initcall_start = .; \ 937b67067f1SNicholas Piggin KEEP(*(.con_initcall.init)) \ 938a6214385SMasahiro Yamada __con_initcall_end = .; 939ef53dae8SSam Ravnborg 94090a025a8SBrendan Higgins /* Alignment must be consistent with (kunit_suite *) in include/kunit/test.h */ 94190a025a8SBrendan Higgins #define KUNIT_TABLE() \ 94290a025a8SBrendan Higgins . = ALIGN(8); \ 94390a025a8SBrendan Higgins __kunit_suites_start = .; \ 94490a025a8SBrendan Higgins KEEP(*(.kunit_test_suites)) \ 94590a025a8SBrendan Higgins __kunit_suites_end = .; 94690a025a8SBrendan Higgins 947ef53dae8SSam Ravnborg #ifdef CONFIG_BLK_DEV_INITRD 948ef53dae8SSam Ravnborg #define INIT_RAM_FS \ 949d8826262SMike Frysinger . = ALIGN(4); \ 950a6214385SMasahiro Yamada __initramfs_start = .; \ 951b67067f1SNicholas Piggin KEEP(*(.init.ramfs)) \ 952ffe8018cSHendrik Brueckner . = ALIGN(8); \ 953b67067f1SNicholas Piggin KEEP(*(.init.ramfs.info)) 954ef53dae8SSam Ravnborg #else 955eadfe219SDavid Howells #define INIT_RAM_FS 956ef53dae8SSam Ravnborg #endif 957ef53dae8SSam Ravnborg 958023bf6f1STejun Heo /* 959ac26963aSBrijesh Singh * Memory encryption operates on a page basis. Since we need to clear 960ac26963aSBrijesh Singh * the memory encryption mask for this section, it needs to be aligned 961ac26963aSBrijesh Singh * on a page boundary and be a page-size multiple in length. 962ac26963aSBrijesh Singh * 963ac26963aSBrijesh Singh * Note: We use a separate section so that only this section gets 964ac26963aSBrijesh Singh * decrypted to avoid exposing more than we wish. 965ac26963aSBrijesh Singh */ 966ac26963aSBrijesh Singh #ifdef CONFIG_AMD_MEM_ENCRYPT 967ac26963aSBrijesh Singh #define PERCPU_DECRYPTED_SECTION \ 968ac26963aSBrijesh Singh . = ALIGN(PAGE_SIZE); \ 969ac26963aSBrijesh Singh *(.data..percpu..decrypted) \ 970ac26963aSBrijesh Singh . = ALIGN(PAGE_SIZE); 971ac26963aSBrijesh Singh #else 972ac26963aSBrijesh Singh #define PERCPU_DECRYPTED_SECTION 973ac26963aSBrijesh Singh #endif 974ac26963aSBrijesh Singh 975ac26963aSBrijesh Singh 976ac26963aSBrijesh Singh /* 977023bf6f1STejun Heo * Default discarded sections. 978023bf6f1STejun Heo * 979023bf6f1STejun Heo * Some archs want to discard exit text/data at runtime rather than 980023bf6f1STejun Heo * link time due to cross-section references such as alt instructions, 981023bf6f1STejun Heo * bug table, eh_frame, etc. DISCARDS must be the last of output 982023bf6f1STejun Heo * section definitions so that such archs put those in earlier section 983023bf6f1STejun Heo * definitions. 984023bf6f1STejun Heo */ 98584d5f77fSH.J. Lu #ifdef RUNTIME_DISCARD_EXIT 98684d5f77fSH.J. Lu #define EXIT_DISCARDS 98784d5f77fSH.J. Lu #else 98884d5f77fSH.J. Lu #define EXIT_DISCARDS \ 98984d5f77fSH.J. Lu EXIT_TEXT \ 99084d5f77fSH.J. Lu EXIT_DATA 99184d5f77fSH.J. Lu #endif 99284d5f77fSH.J. Lu 993d812db78SKees Cook /* 994d812db78SKees Cook * Clang's -fsanitize=kernel-address and -fsanitize=thread produce 995d812db78SKees Cook * unwanted sections (.eh_frame and .init_array.*), but 996d812db78SKees Cook * CONFIG_CONSTRUCTORS wants to keep any .init_array.* sections. 997d812db78SKees Cook * https://bugs.llvm.org/show_bug.cgi?id=46478 998d812db78SKees Cook */ 999d812db78SKees Cook #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KCSAN) 1000d812db78SKees Cook # ifdef CONFIG_CONSTRUCTORS 1001d812db78SKees Cook # define SANITIZER_DISCARDS \ 1002d812db78SKees Cook *(.eh_frame) 1003d812db78SKees Cook # else 1004d812db78SKees Cook # define SANITIZER_DISCARDS \ 1005d812db78SKees Cook *(.init_array) *(.init_array.*) \ 1006d812db78SKees Cook *(.eh_frame) 1007d812db78SKees Cook # endif 1008d812db78SKees Cook #else 1009d812db78SKees Cook # define SANITIZER_DISCARDS 1010d812db78SKees Cook #endif 1011d812db78SKees Cook 101203c2b85cSKees Cook #define COMMON_DISCARDS \ 1013d812db78SKees Cook SANITIZER_DISCARDS \ 101403c2b85cSKees Cook *(.discard) \ 101503c2b85cSKees Cook *(.discard.*) \ 1016dfbe6968SKees Cook *(.modinfo) \ 1017dfbe6968SKees Cook /* ld.bfd warns about .gnu.version* even when not emitted */ \ 1018dfbe6968SKees Cook *(.gnu.version*) \ 101903c2b85cSKees Cook 1020405d967dSTejun Heo #define DISCARDS \ 1021405d967dSTejun Heo /DISCARD/ : { \ 102284d5f77fSH.J. Lu EXIT_DISCARDS \ 1023023bf6f1STejun Heo EXIT_CALL \ 102403c2b85cSKees Cook COMMON_DISCARDS \ 1025405d967dSTejun Heo } 1026405d967dSTejun Heo 10273e5d8f97STejun Heo /** 10286ea0c34dSMike Frysinger * PERCPU_INPUT - the percpu input sections 10296ea0c34dSMike Frysinger * @cacheline: cacheline size 10306ea0c34dSMike Frysinger * 10316ea0c34dSMike Frysinger * The core percpu section names and core symbols which do not rely 10326ea0c34dSMike Frysinger * directly upon load addresses. 10336ea0c34dSMike Frysinger * 10346ea0c34dSMike Frysinger * @cacheline is used to align subsections to avoid false cacheline 10356ea0c34dSMike Frysinger * sharing between subsections for different purposes. 10366ea0c34dSMike Frysinger */ 10376ea0c34dSMike Frysinger #define PERCPU_INPUT(cacheline) \ 1038a6214385SMasahiro Yamada __per_cpu_start = .; \ 10396ea0c34dSMike Frysinger *(.data..percpu..first) \ 10406ea0c34dSMike Frysinger . = ALIGN(PAGE_SIZE); \ 10416ea0c34dSMike Frysinger *(.data..percpu..page_aligned) \ 10426ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 1043330d2822SZhengyu He *(.data..percpu..read_mostly) \ 10446ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 10456ea0c34dSMike Frysinger *(.data..percpu) \ 10466ea0c34dSMike Frysinger *(.data..percpu..shared_aligned) \ 1047ac26963aSBrijesh Singh PERCPU_DECRYPTED_SECTION \ 1048a6214385SMasahiro Yamada __per_cpu_end = .; 10496ea0c34dSMike Frysinger 10506ea0c34dSMike Frysinger /** 10516b7c38d5STejun Heo * PERCPU_VADDR - define output section for percpu area 105219df0c2fSTejun Heo * @cacheline: cacheline size 10533e5d8f97STejun Heo * @vaddr: explicit base address (optional) 10543e5d8f97STejun Heo * @phdr: destination PHDR (optional) 10553e5d8f97STejun Heo * 105619df0c2fSTejun Heo * Macro which expands to output section for percpu area. 105719df0c2fSTejun Heo * 105819df0c2fSTejun Heo * @cacheline is used to align subsections to avoid false cacheline 105919df0c2fSTejun Heo * sharing between subsections for different purposes. 106019df0c2fSTejun Heo * 106119df0c2fSTejun Heo * If @vaddr is not blank, it specifies explicit base address and all 106219df0c2fSTejun Heo * percpu symbols will be offset from the given address. If blank, 106319df0c2fSTejun Heo * @vaddr always equals @laddr + LOAD_OFFSET. 10643e5d8f97STejun Heo * 10653e5d8f97STejun Heo * @phdr defines the output PHDR to use if not blank. Be warned that 10663e5d8f97STejun Heo * output PHDR is sticky. If @phdr is specified, the next output 10673e5d8f97STejun Heo * section in the linker script will go there too. @phdr should have 10683e5d8f97STejun Heo * a leading colon. 10693e5d8f97STejun Heo * 10703ac6cffeSTejun Heo * Note that this macros defines __per_cpu_load as an absolute symbol. 10713ac6cffeSTejun Heo * If there is no need to put the percpu section at a predetermined 10720415b00dSTejun Heo * address, use PERCPU_SECTION. 10733e5d8f97STejun Heo */ 107419df0c2fSTejun Heo #define PERCPU_VADDR(cacheline, vaddr, phdr) \ 1075a6214385SMasahiro Yamada __per_cpu_load = .; \ 1076a6214385SMasahiro Yamada .data..percpu vaddr : AT(__per_cpu_load - LOAD_OFFSET) { \ 10776ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 10786b7c38d5STejun Heo } phdr \ 1079a6214385SMasahiro Yamada . = __per_cpu_load + SIZEOF(.data..percpu); 10803e5d8f97STejun Heo 10813e5d8f97STejun Heo /** 10820415b00dSTejun Heo * PERCPU_SECTION - define output section for percpu area, simple version 108319df0c2fSTejun Heo * @cacheline: cacheline size 10843e5d8f97STejun Heo * 10850415b00dSTejun Heo * Align to PAGE_SIZE and outputs output section for percpu area. This 10860415b00dSTejun Heo * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and 10873e5d8f97STejun Heo * __per_cpu_start will be identical. 10883ac6cffeSTejun Heo * 10890415b00dSTejun Heo * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,) 109019df0c2fSTejun Heo * except that __per_cpu_load is defined as a relative symbol against 109119df0c2fSTejun Heo * .data..percpu which is required for relocatable x86_32 configuration. 10923e5d8f97STejun Heo */ 10930415b00dSTejun Heo #define PERCPU_SECTION(cacheline) \ 10940415b00dSTejun Heo . = ALIGN(PAGE_SIZE); \ 10953d9a854cSDenys Vlasenko .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ 1096a6214385SMasahiro Yamada __per_cpu_load = .; \ 10976ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 10983ac6cffeSTejun Heo } 1099ef53dae8SSam Ravnborg 1100ef53dae8SSam Ravnborg 1101ef53dae8SSam Ravnborg /* 1102ef53dae8SSam Ravnborg * Definition of the high level *_SECTION macros 1103ef53dae8SSam Ravnborg * They will fit only a subset of the architectures 1104ef53dae8SSam Ravnborg */ 1105ef53dae8SSam Ravnborg 1106ef53dae8SSam Ravnborg 1107ef53dae8SSam Ravnborg /* 1108ef53dae8SSam Ravnborg * Writeable data. 1109ef53dae8SSam Ravnborg * All sections are combined in a single .data section. 1110ef53dae8SSam Ravnborg * The sections following CONSTRUCTORS are arranged so their 1111ef53dae8SSam Ravnborg * typical alignment matches. 1112ef53dae8SSam Ravnborg * A cacheline is typical/always less than a PAGE_SIZE so 1113ef53dae8SSam Ravnborg * the sections that has this restriction (or similar) 1114ef53dae8SSam Ravnborg * is located before the ones requiring PAGE_SIZE alignment. 1115ef53dae8SSam Ravnborg * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which 111625985edcSLucas De Marchi * matches the requirement of PAGE_ALIGNED_DATA. 1117ef53dae8SSam Ravnborg * 11187923f90fSSam Ravnborg * use 0 as page_align if page_aligned data is not used */ 1119c9174047SKees Cook #define RW_DATA(cacheline, pagealigned, inittask) \ 1120ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 1121ef53dae8SSam Ravnborg .data : AT(ADDR(.data) - LOAD_OFFSET) { \ 112239a449d9STim Abbott INIT_TASK_DATA(inittask) \ 11231b208622STim Abbott NOSAVE_DATA \ 11241b208622STim Abbott PAGE_ALIGNED_DATA(pagealigned) \ 1125ef53dae8SSam Ravnborg CACHELINE_ALIGNED_DATA(cacheline) \ 1126ef53dae8SSam Ravnborg READ_MOSTLY_DATA(cacheline) \ 1127ef53dae8SSam Ravnborg DATA_DATA \ 1128ef53dae8SSam Ravnborg CONSTRUCTORS \ 112919d43626SPeter Zijlstra } \ 1130ee9f8fceSJosh Poimboeuf BUG_TABLE \ 1131ef53dae8SSam Ravnborg 1132ef53dae8SSam Ravnborg #define INIT_TEXT_SECTION(inittext_align) \ 1133ef53dae8SSam Ravnborg . = ALIGN(inittext_align); \ 1134ef53dae8SSam Ravnborg .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { \ 1135a6214385SMasahiro Yamada _sinittext = .; \ 1136ef53dae8SSam Ravnborg INIT_TEXT \ 1137a6214385SMasahiro Yamada _einittext = .; \ 1138ef53dae8SSam Ravnborg } 1139ef53dae8SSam Ravnborg 1140ef53dae8SSam Ravnborg #define INIT_DATA_SECTION(initsetup_align) \ 1141ef53dae8SSam Ravnborg .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { \ 1142ef53dae8SSam Ravnborg INIT_DATA \ 1143ef53dae8SSam Ravnborg INIT_SETUP(initsetup_align) \ 1144ef53dae8SSam Ravnborg INIT_CALLS \ 1145ef53dae8SSam Ravnborg CON_INITCALL \ 1146ef53dae8SSam Ravnborg INIT_RAM_FS \ 1147ef53dae8SSam Ravnborg } 1148ef53dae8SSam Ravnborg 114904e448d9STim Abbott #define BSS_SECTION(sbss_align, bss_align, stop_align) \ 115004e448d9STim Abbott . = ALIGN(sbss_align); \ 1151a6214385SMasahiro Yamada __bss_start = .; \ 115204e448d9STim Abbott SBSS(sbss_align) \ 1153ef53dae8SSam Ravnborg BSS(bss_align) \ 115404e448d9STim Abbott . = ALIGN(stop_align); \ 1155a6214385SMasahiro Yamada __bss_stop = .; 1156