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 84d49a0626SPeter Zijlstra /* Align . function alignment. */ 85d49a0626SPeter Zijlstra #define ALIGN_FUNCTION() . = ALIGN(CONFIG_FUNCTION_ALIGNMENT) 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 * 93dc5723b0SSami Tolvanen * With LTO_CLANG, the linker also splits sections by default, so we need 94dc5723b0SSami Tolvanen * these macros to combine the sections during the final link. 95dc5723b0SSami 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 */ 99dc5723b0SSami Tolvanen #if defined(CONFIG_LD_DEAD_CODE_DATA_ELIMINATION) || defined(CONFIG_LTO_CLANG) 100cb87481eSNicholas Piggin #define TEXT_MAIN .text .text.[0-9a-zA-Z_]* 10149387f62SAlexander Lobakin #define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..L* .data..compoundliteral* .data.$__unnamed_* .data.$L* 102266ff2a8SNicholas Piggin #define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]* 1039a427556SAlexander Lobakin #define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]* .rodata..L* 1049a427556SAlexander Lobakin #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 */ 119aab94339SDirk Brandewie #define STRUCT_ALIGNMENT 32 120aab94339SDirk Brandewie #define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT) 12107fca0e5SSam Ravnborg 12285c2ce91SPeter Zijlstra /* 123590d6979SSteven Rostedt (VMware) * The order of the sched class addresses are important, as they are 124590d6979SSteven Rostedt (VMware) * used to determine the order of the priority of each sched class in 125590d6979SSteven Rostedt (VMware) * relation to each other. 126590d6979SSteven Rostedt (VMware) */ 127590d6979SSteven Rostedt (VMware) #define SCHED_DATA \ 128c3a340f7SSteven Rostedt (VMware) STRUCT_ALIGN(); \ 129546a3feeSPeter Zijlstra __sched_class_highest = .; \ 130c3a340f7SSteven Rostedt (VMware) *(__stop_sched_class) \ 131546a3feeSPeter Zijlstra *(__dl_sched_class) \ 132546a3feeSPeter Zijlstra *(__rt_sched_class) \ 133546a3feeSPeter Zijlstra *(__fair_sched_class) \ 134546a3feeSPeter Zijlstra *(__idle_sched_class) \ 135546a3feeSPeter Zijlstra __sched_class_lowest = .; 136590d6979SSteven Rostedt (VMware) 137eb8f6890SSam Ravnborg /* The actual configuration determine if the init/exit sections 138eb8f6890SSam Ravnborg * are handled as text/data or they can be discarded (which 139eb8f6890SSam Ravnborg * often happens at runtime) 140eb8f6890SSam Ravnborg */ 141eb8f6890SSam Ravnborg 1421a3fb6d4SAdrian Bunk #if defined(CONFIG_MEMORY_HOTPLUG) 143eb8f6890SSam Ravnborg #define MEM_KEEP(sec) *(.mem##sec) 144eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) 145eb8f6890SSam Ravnborg #else 146eb8f6890SSam Ravnborg #define MEM_KEEP(sec) 147eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) *(.mem##sec) 148eb8f6890SSam Ravnborg #endif 149eb8f6890SSam Ravnborg 1509440155cSPeter Zijlstra (Intel) #ifndef CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE 1519440155cSPeter Zijlstra (Intel) #define KEEP_PATCHABLE KEEP(*(__patchable_function_entries)) 1529440155cSPeter Zijlstra (Intel) #define PATCHABLE_DISCARDS 1539440155cSPeter Zijlstra (Intel) #else 1549440155cSPeter Zijlstra (Intel) #define KEEP_PATCHABLE 1559440155cSPeter Zijlstra (Intel) #define PATCHABLE_DISCARDS *(__patchable_function_entries) 1569440155cSPeter Zijlstra (Intel) #endif 1579440155cSPeter Zijlstra (Intel) 158883bbbffSPeter Zijlstra #ifndef CONFIG_ARCH_SUPPORTS_CFI_CLANG 159883bbbffSPeter Zijlstra /* 160883bbbffSPeter Zijlstra * Simply points to ftrace_stub, but with the proper protocol. 161883bbbffSPeter Zijlstra * Defined by the linker script in linux/vmlinux.lds.h 162883bbbffSPeter Zijlstra */ 163883bbbffSPeter Zijlstra #define FTRACE_STUB_HACK ftrace_stub_graph = ftrace_stub; 164883bbbffSPeter Zijlstra #else 165883bbbffSPeter Zijlstra #define FTRACE_STUB_HACK 166883bbbffSPeter Zijlstra #endif 167883bbbffSPeter Zijlstra 1688da3821bSSteven Rostedt #ifdef CONFIG_FTRACE_MCOUNT_RECORD 169a1326b17SMark Rutland /* 170a1326b17SMark Rutland * The ftrace call sites are logged to a section whose name depends on the 171a1326b17SMark Rutland * compiler option used. A given kernel image will only use one, AKA 172a1326b17SMark Rutland * FTRACE_CALLSITE_SECTION. We capture all of them here to avoid header 173a1326b17SMark Rutland * dependencies for FTRACE_CALLSITE_SECTION's definition. 17495f1fa9eSLinus Torvalds * 17534cdd18bSSteven Rostedt (VMware) * ftrace_ops_list_func will be defined as arch_ftrace_ops_list_func 17634cdd18bSSteven Rostedt (VMware) * as some archs will have a different prototype for that function 17734cdd18bSSteven Rostedt (VMware) * but ftrace_ops_list_func() will have a single prototype. 178a1326b17SMark Rutland */ 1794b3b4c5eSJohn Reiser #define MCOUNT_REC() . = ALIGN(8); \ 180a6214385SMasahiro Yamada __start_mcount_loc = .; \ 181266ff2a8SNicholas Piggin KEEP(*(__mcount_loc)) \ 1829440155cSPeter Zijlstra (Intel) KEEP_PATCHABLE \ 183b83b43ffSSteven Rostedt (VMware) __stop_mcount_loc = .; \ 184883bbbffSPeter Zijlstra FTRACE_STUB_HACK \ 18534cdd18bSSteven Rostedt (VMware) ftrace_ops_list_func = arch_ftrace_ops_list_func; 1868da3821bSSteven Rostedt #else 187b83b43ffSSteven Rostedt (VMware) # ifdef CONFIG_FUNCTION_TRACER 188883bbbffSPeter Zijlstra # define MCOUNT_REC() FTRACE_STUB_HACK \ 18934cdd18bSSteven Rostedt (VMware) ftrace_ops_list_func = arch_ftrace_ops_list_func; 1908da3821bSSteven Rostedt # else 1918da3821bSSteven Rostedt # define MCOUNT_REC() 1928da3821bSSteven Rostedt # endif 193b83b43ffSSteven Rostedt (VMware) #endif 194eb8f6890SSam Ravnborg 195435d6b65SJim Cromie #define BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_) \ 196435d6b65SJim Cromie _BEGIN_##_label_ = .; \ 1979b351be2SJim Cromie KEEP(*(_sec_)) \ 198435d6b65SJim Cromie _END_##_label_ = .; 1999b351be2SJim Cromie 200435d6b65SJim Cromie #define BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_) \ 201435d6b65SJim Cromie _label_##_BEGIN_ = .; \ 2029b351be2SJim Cromie KEEP(*(_sec_)) \ 203435d6b65SJim Cromie _label_##_END_ = .; 2049b351be2SJim Cromie 2059b351be2SJim Cromie #define BOUNDED_SECTION_BY(_sec_, _label_) \ 2069b351be2SJim Cromie BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop) 2079b351be2SJim Cromie 2089b351be2SJim Cromie #define BOUNDED_SECTION(_sec) BOUNDED_SECTION_BY(_sec, _sec) 2099b351be2SJim Cromie 2101d926e25SJim Cromie #define HEADERED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_) \ 2111d926e25SJim Cromie _HDR_##_label_ = .; \ 2121d926e25SJim Cromie KEEP(*(.gnu.linkonce.##_sec_)) \ 2131d926e25SJim Cromie BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_) 2141d926e25SJim Cromie 2151d926e25SJim Cromie #define HEADERED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_) \ 2161d926e25SJim Cromie _label_##_HDR_ = .; \ 2171d926e25SJim Cromie KEEP(*(.gnu.linkonce.##_sec_)) \ 2181d926e25SJim Cromie BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_) 2191d926e25SJim Cromie 2201d926e25SJim Cromie #define HEADERED_SECTION_BY(_sec_, _label_) \ 2211d926e25SJim Cromie HEADERED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop) 2221d926e25SJim Cromie 2231d926e25SJim Cromie #define HEADERED_SECTION(_sec) HEADERED_SECTION_BY(_sec, _sec) 2241d926e25SJim Cromie 2252ed84eebSSteven Rostedt #ifdef CONFIG_TRACE_BRANCH_PROFILING 2269b351be2SJim Cromie #define LIKELY_PROFILE() \ 2279b351be2SJim Cromie BOUNDED_SECTION_BY(_ftrace_annotated_branch, _annotated_branch_profile) 2281f0d69a9SSteven Rostedt #else 2291f0d69a9SSteven Rostedt #define LIKELY_PROFILE() 2301f0d69a9SSteven Rostedt #endif 2311f0d69a9SSteven Rostedt 2322bcd521aSSteven Rostedt #ifdef CONFIG_PROFILE_ALL_BRANCHES 2339b351be2SJim Cromie #define BRANCH_PROFILE() \ 2349b351be2SJim Cromie BOUNDED_SECTION_BY(_ftrace_branch, _branch_profile) 2352bcd521aSSteven Rostedt #else 2362bcd521aSSteven Rostedt #define BRANCH_PROFILE() 2372bcd521aSSteven Rostedt #endif 2382bcd521aSSteven Rostedt 239376e2424SMasami Hiramatsu #ifdef CONFIG_KPROBES 2409b351be2SJim Cromie #define KPROBE_BLACKLIST() \ 2419b351be2SJim Cromie . = ALIGN(8); \ 2429b351be2SJim Cromie BOUNDED_SECTION(_kprobe_blacklist) 243376e2424SMasami Hiramatsu #else 244376e2424SMasami Hiramatsu #define KPROBE_BLACKLIST() 245376e2424SMasami Hiramatsu #endif 246376e2424SMasami Hiramatsu 247540adea3SMasami Hiramatsu #ifdef CONFIG_FUNCTION_ERROR_INJECTION 2489b351be2SJim Cromie #define ERROR_INJECT_WHITELIST() \ 2499b351be2SJim Cromie STRUCT_ALIGN(); \ 2509b351be2SJim Cromie BOUNDED_SECTION(_error_injection_whitelist) 25192ace999SJosef Bacik #else 252540adea3SMasami Hiramatsu #define ERROR_INJECT_WHITELIST() 25392ace999SJosef Bacik #endif 25492ace999SJosef Bacik 2555f77a88bSTom Zanussi #ifdef CONFIG_EVENT_TRACING 2569b351be2SJim Cromie #define FTRACE_EVENTS() \ 2579b351be2SJim Cromie . = ALIGN(8); \ 2589b351be2SJim Cromie BOUNDED_SECTION(_ftrace_events) \ 2599b351be2SJim Cromie BOUNDED_SECTION_BY(_ftrace_eval_map, _ftrace_eval_maps) 260b77e38aaSSteven Rostedt #else 261b77e38aaSSteven Rostedt #define FTRACE_EVENTS() 262b77e38aaSSteven Rostedt #endif 263b77e38aaSSteven Rostedt 2641ba28e02SLai Jiangshan #ifdef CONFIG_TRACING 2659b351be2SJim Cromie #define TRACE_PRINTKS() BOUNDED_SECTION_BY(__trace_printk_fmt, ___trace_bprintk_fmt) 2669b351be2SJim Cromie #define TRACEPOINT_STR() BOUNDED_SECTION_BY(__tracepoint_str, ___tracepoint_str) 2671ba28e02SLai Jiangshan #else 2681ba28e02SLai Jiangshan #define TRACE_PRINTKS() 269102c9323SSteven Rostedt (Red Hat) #define TRACEPOINT_STR() 2701ba28e02SLai Jiangshan #endif 2711ba28e02SLai Jiangshan 272bed1ffcaSFrederic Weisbecker #ifdef CONFIG_FTRACE_SYSCALLS 2739b351be2SJim Cromie #define TRACE_SYSCALLS() \ 2749b351be2SJim Cromie . = ALIGN(8); \ 2759b351be2SJim Cromie BOUNDED_SECTION_BY(__syscalls_metadata, _syscalls_metadata) 276bed1ffcaSFrederic Weisbecker #else 277bed1ffcaSFrederic Weisbecker #define TRACE_SYSCALLS() 278bed1ffcaSFrederic Weisbecker #endif 279bed1ffcaSFrederic Weisbecker 280c4f6699dSAlexei Starovoitov #ifdef CONFIG_BPF_EVENTS 281c4f6699dSAlexei Starovoitov #define BPF_RAW_TP() STRUCT_ALIGN(); \ 2829b351be2SJim Cromie BOUNDED_SECTION_BY(__bpf_raw_tp_map, __bpf_raw_tp) 283c4f6699dSAlexei Starovoitov #else 284c4f6699dSAlexei Starovoitov #define BPF_RAW_TP() 285c4f6699dSAlexei Starovoitov #endif 286c4f6699dSAlexei Starovoitov 287470ca0deSPeter Hurley #ifdef CONFIG_SERIAL_EARLYCON 2889b351be2SJim Cromie #define EARLYCON_TABLE() \ 2899b351be2SJim Cromie . = ALIGN(8); \ 2909b351be2SJim Cromie BOUNDED_SECTION_POST_LABEL(__earlycon_table, __earlycon_table, , _end) 291470ca0deSPeter Hurley #else 292470ca0deSPeter Hurley #define EARLYCON_TABLE() 293470ca0deSPeter Hurley #endif 294aab94339SDirk Brandewie 2953ac946d1SKees Cook #ifdef CONFIG_SECURITY 2969b351be2SJim Cromie #define LSM_TABLE() \ 2979b351be2SJim Cromie . = ALIGN(8); \ 2989b351be2SJim Cromie BOUNDED_SECTION_PRE_LABEL(.lsm_info.init, _lsm_info, __start, __end) 2999b351be2SJim Cromie 3009b351be2SJim Cromie #define EARLY_LSM_TABLE() \ 3019b351be2SJim Cromie . = ALIGN(8); \ 3029b351be2SJim Cromie BOUNDED_SECTION_PRE_LABEL(.early_lsm_info.init, _early_lsm_info, __start, __end) 3033ac946d1SKees Cook #else 3043ac946d1SKees Cook #define LSM_TABLE() 305e6b1db98SMatthew Garrett #define EARLY_LSM_TABLE() 3063ac946d1SKees Cook #endif 3073ac946d1SKees Cook 30806309288SRob Herring #define ___OF_TABLE(cfg, name) _OF_TABLE_##cfg(name) 30906309288SRob Herring #define __OF_TABLE(cfg, name) ___OF_TABLE(cfg, name) 3105ee02af1SMasahiro Yamada #define OF_TABLE(cfg, name) __OF_TABLE(IS_ENABLED(cfg), name) 31106309288SRob Herring #define _OF_TABLE_0(name) 31206309288SRob Herring #define _OF_TABLE_1(name) \ 313f6e916b8SThomas Petazzoni . = ALIGN(8); \ 314a6214385SMasahiro Yamada __##name##_of_table = .; \ 3154b89b7f7SNicholas Piggin KEEP(*(__##name##_of_table)) \ 3164b89b7f7SNicholas Piggin KEEP(*(__##name##_of_table_end)) 317aab94339SDirk Brandewie 318bb0eb050SDaniel Lezcano #define TIMER_OF_TABLES() OF_TABLE(CONFIG_TIMER_OF, timer) 31906309288SRob Herring #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip) 32006309288SRob Herring #define CLK_OF_TABLES() OF_TABLE(CONFIG_COMMON_CLK, clk) 32106309288SRob Herring #define RESERVEDMEM_OF_TABLES() OF_TABLE(CONFIG_OF_RESERVED_MEM, reservedmem) 32206309288SRob Herring #define CPU_METHOD_OF_TABLES() OF_TABLE(CONFIG_SMP, cpu_method) 323449e056cSDaniel Lezcano #define CPUIDLE_METHOD_OF_TABLES() OF_TABLE(CONFIG_CPU_IDLE, cpuidle_method) 3246c3ff8b1SStephen Boyd 325e647b532SMarc Zyngier #ifdef CONFIG_ACPI 326e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name) \ 327e647b532SMarc Zyngier . = ALIGN(8); \ 3289b351be2SJim Cromie BOUNDED_SECTION_POST_LABEL(__##name##_acpi_probe_table, \ 3299b351be2SJim Cromie __##name##_acpi_probe_table,, _end) 330e647b532SMarc Zyngier #else 331e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name) 332e647b532SMarc Zyngier #endif 333e647b532SMarc Zyngier 334980af75eSDaniel Lezcano #ifdef CONFIG_THERMAL 335980af75eSDaniel Lezcano #define THERMAL_TABLE(name) \ 336980af75eSDaniel Lezcano . = ALIGN(8); \ 3379b351be2SJim Cromie BOUNDED_SECTION_POST_LABEL(__##name##_thermal_table, \ 3389b351be2SJim Cromie __##name##_thermal_table,, _end) 339980af75eSDaniel Lezcano #else 340980af75eSDaniel Lezcano #define THERMAL_TABLE(name) 341980af75eSDaniel Lezcano #endif 342980af75eSDaniel Lezcano 343aab94339SDirk Brandewie #define KERNEL_DTB() \ 344aab94339SDirk Brandewie STRUCT_ALIGN(); \ 345a6214385SMasahiro Yamada __dtb_start = .; \ 3464b89b7f7SNicholas Piggin KEEP(*(.dtb.init.rodata)) \ 347a6214385SMasahiro Yamada __dtb_end = .; 348aab94339SDirk Brandewie 349b67067f1SNicholas Piggin /* 350b67067f1SNicholas Piggin * .data section 351b67067f1SNicholas Piggin */ 352ca967258SSam Ravnborg #define DATA_DATA \ 353129f6c48SArnd Bergmann *(.xiptext) \ 354cb87481eSNicholas Piggin *(DATA_MAIN) \ 355000f8870SNathan Chancellor *(.data..decrypted) \ 356312b1485SSam Ravnborg *(.ref.data) \ 357d356c0b6SMike Frysinger *(.data..shared_aligned) /* percpu related */ \ 358266ff2a8SNicholas Piggin MEM_KEEP(init.data*) \ 3597ccaba53SJan Beulich *(.data.unlikely) \ 360a6214385SMasahiro Yamada __start_once = .; \ 361b1fca27dSAndi Kleen *(.data.once) \ 362a6214385SMasahiro Yamada __end_once = .; \ 36365498646SMathieu Desnoyers STRUCT_ALIGN(); \ 36497e1c18eSMathieu Desnoyers *(__tracepoints) \ 365e9d376f0SJason Baron /* implement dynamic printk debug */ \ 366e9d376f0SJason Baron . = ALIGN(8); \ 3679b351be2SJim Cromie BOUNDED_SECTION_BY(__dyndbg_classes, ___dyndbg_classes) \ 3689b351be2SJim Cromie BOUNDED_SECTION_BY(__dyndbg, ___dyndbg) \ 3692bcd521aSSteven Rostedt LIKELY_PROFILE() \ 370b77e38aaSSteven Rostedt BRANCH_PROFILE() \ 371102c9323SSteven Rostedt (Red Hat) TRACE_PRINTKS() \ 372c4f6699dSAlexei Starovoitov BPF_RAW_TP() \ 373102c9323SSteven Rostedt (Red Hat) TRACEPOINT_STR() 374ca967258SSam Ravnborg 375ef53dae8SSam Ravnborg /* 376ef53dae8SSam Ravnborg * Data section helpers 377ef53dae8SSam Ravnborg */ 378ef53dae8SSam Ravnborg #define NOSAVE_DATA \ 379ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 380a6214385SMasahiro Yamada __nosave_begin = .; \ 38107b3bb1eSDenys Vlasenko *(.data..nosave) \ 382ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 383a6214385SMasahiro Yamada __nosave_end = .; 384ef53dae8SSam Ravnborg 385ef53dae8SSam Ravnborg #define PAGE_ALIGNED_DATA(page_align) \ 386ef53dae8SSam Ravnborg . = ALIGN(page_align); \ 387de2b41beSJoerg Roedel *(.data..page_aligned) \ 388de2b41beSJoerg Roedel . = ALIGN(page_align); 389ef53dae8SSam Ravnborg 390ef53dae8SSam Ravnborg #define READ_MOSTLY_DATA(align) \ 391ef53dae8SSam Ravnborg . = ALIGN(align); \ 3928369744fSShaohua Li *(.data..read_mostly) \ 3938369744fSShaohua Li . = ALIGN(align); 394ef53dae8SSam Ravnborg 395ef53dae8SSam Ravnborg #define CACHELINE_ALIGNED_DATA(align) \ 396ef53dae8SSam Ravnborg . = ALIGN(align); \ 3974af57b78STim Abbott *(.data..cacheline_aligned) 398ef53dae8SSam Ravnborg 39939a449d9STim Abbott #define INIT_TASK_DATA(align) \ 400ef53dae8SSam Ravnborg . = ALIGN(align); \ 401a6214385SMasahiro Yamada __start_init_task = .; \ 402a6214385SMasahiro Yamada init_thread_union = .; \ 403a6214385SMasahiro Yamada init_stack = .; \ 404266ff2a8SNicholas Piggin KEEP(*(.data..init_task)) \ 405266ff2a8SNicholas Piggin KEEP(*(.data..init_thread_info)) \ 406a6214385SMasahiro Yamada . = __start_init_task + THREAD_SIZE; \ 407a6214385SMasahiro Yamada __end_init_task = .; 408ef53dae8SSam Ravnborg 409e872267bSArd Biesheuvel #define JUMP_TABLE_DATA \ 410e872267bSArd Biesheuvel . = ALIGN(8); \ 4119b351be2SJim Cromie BOUNDED_SECTION_BY(__jump_table, ___jump_table) 412e872267bSArd Biesheuvel 413b44544feSPeter Zijlstra #ifdef CONFIG_HAVE_STATIC_CALL_INLINE 4149183c3f9SJosh Poimboeuf #define STATIC_CALL_DATA \ 4159183c3f9SJosh Poimboeuf . = ALIGN(8); \ 4169b351be2SJim Cromie BOUNDED_SECTION_BY(.static_call_sites, _static_call_sites) \ 4179b351be2SJim Cromie BOUNDED_SECTION_BY(.static_call_tramp_key, _static_call_tramp_key) 418b44544feSPeter Zijlstra #else 419b44544feSPeter Zijlstra #define STATIC_CALL_DATA 420b44544feSPeter Zijlstra #endif 4219183c3f9SJosh Poimboeuf 422ef53dae8SSam Ravnborg /* 42332fb2fc5SHeiko Carstens * Allow architectures to handle ro_after_init data on their 42432fb2fc5SHeiko Carstens * own by defining an empty RO_AFTER_INIT_DATA. 42532fb2fc5SHeiko Carstens */ 42632fb2fc5SHeiko Carstens #ifndef RO_AFTER_INIT_DATA 427d7c19b06SJakub Kicinski #define RO_AFTER_INIT_DATA \ 4287f897acbSRomain Naour . = ALIGN(8); \ 429a6214385SMasahiro Yamada __start_ro_after_init = .; \ 430d7c19b06SJakub Kicinski *(.data..ro_after_init) \ 431e872267bSArd Biesheuvel JUMP_TABLE_DATA \ 4329183c3f9SJosh Poimboeuf STATIC_CALL_DATA \ 433a6214385SMasahiro Yamada __end_ro_after_init = .; 43432fb2fc5SHeiko Carstens #endif 43532fb2fc5SHeiko Carstens 43632fb2fc5SHeiko Carstens /* 43789245600SSami Tolvanen * .kcfi_traps contains a list KCFI trap locations. 43889245600SSami Tolvanen */ 43989245600SSami Tolvanen #ifndef KCFI_TRAPS 44089245600SSami Tolvanen #ifdef CONFIG_ARCH_USES_CFI_TRAPS 44189245600SSami Tolvanen #define KCFI_TRAPS \ 44289245600SSami Tolvanen __kcfi_traps : AT(ADDR(__kcfi_traps) - LOAD_OFFSET) { \ 4439b351be2SJim Cromie BOUNDED_SECTION_BY(.kcfi_traps, ___kcfi_traps) \ 44489245600SSami Tolvanen } 44589245600SSami Tolvanen #else 44689245600SSami Tolvanen #define KCFI_TRAPS 44789245600SSami Tolvanen #endif 44889245600SSami Tolvanen #endif 44989245600SSami Tolvanen 45089245600SSami Tolvanen /* 451ef53dae8SSam Ravnborg * Read only Data 452ef53dae8SSam Ravnborg */ 45393240b32SKees Cook #define RO_DATA(align) \ 4544096b46fSSam Ravnborg . = ALIGN((align)); \ 4551da177e4SLinus Torvalds .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ 456a6214385SMasahiro Yamada __start_rodata = .; \ 4571da177e4SLinus Torvalds *(.rodata) *(.rodata.*) \ 458590d6979SSteven Rostedt (VMware) SCHED_DATA \ 45932fb2fc5SHeiko Carstens RO_AFTER_INIT_DATA /* Read only after init */ \ 46065498646SMathieu Desnoyers . = ALIGN(8); \ 4619b351be2SJim Cromie BOUNDED_SECTION_BY(__tracepoints_ptrs, ___tracepoints_ptrs) \ 46297e1c18eSMathieu Desnoyers *(__tracepoints_strings)/* Tracepoints: strings */ \ 4631da177e4SLinus Torvalds } \ 4641da177e4SLinus Torvalds \ 4651da177e4SLinus Torvalds .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \ 4661da177e4SLinus Torvalds *(.rodata1) \ 4671da177e4SLinus Torvalds } \ 4681da177e4SLinus Torvalds \ 4691da177e4SLinus Torvalds /* PCI quirks */ \ 4701da177e4SLinus Torvalds .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ 4719b351be2SJim Cromie BOUNDED_SECTION_PRE_LABEL(.pci_fixup_early, _pci_fixups_early, __start, __end) \ 4729b351be2SJim Cromie BOUNDED_SECTION_PRE_LABEL(.pci_fixup_header, _pci_fixups_header, __start, __end) \ 4739b351be2SJim Cromie BOUNDED_SECTION_PRE_LABEL(.pci_fixup_final, _pci_fixups_final, __start, __end) \ 4749b351be2SJim Cromie BOUNDED_SECTION_PRE_LABEL(.pci_fixup_enable, _pci_fixups_enable, __start, __end) \ 4759b351be2SJim Cromie BOUNDED_SECTION_PRE_LABEL(.pci_fixup_resume, _pci_fixups_resume, __start, __end) \ 4769b351be2SJim Cromie BOUNDED_SECTION_PRE_LABEL(.pci_fixup_suspend, _pci_fixups_suspend, __start, __end) \ 4779b351be2SJim Cromie BOUNDED_SECTION_PRE_LABEL(.pci_fixup_resume_early, _pci_fixups_resume_early, __start, __end) \ 4789b351be2SJim Cromie BOUNDED_SECTION_PRE_LABEL(.pci_fixup_suspend_late, _pci_fixups_suspend_late, __start, __end) \ 4791da177e4SLinus Torvalds } \ 4801da177e4SLinus Torvalds \ 481771856caSLuis Chamberlain FW_LOADER_BUILT_IN_DATA \ 48263687a52SJan Beulich TRACEDATA \ 48363687a52SJan Beulich \ 48433701557SChris Down PRINTK_INDEX \ 48533701557SChris Down \ 4861da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 4871da177e4SLinus Torvalds __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ 488a6214385SMasahiro Yamada __start___ksymtab = .; \ 489b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab+*))) \ 490a6214385SMasahiro Yamada __stop___ksymtab = .; \ 4911da177e4SLinus Torvalds } \ 4921da177e4SLinus Torvalds \ 4931da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 4941da177e4SLinus Torvalds __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ 495a6214385SMasahiro Yamada __start___ksymtab_gpl = .; \ 496b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_gpl+*))) \ 497a6214385SMasahiro Yamada __stop___ksymtab_gpl = .; \ 4981da177e4SLinus Torvalds } \ 4991da177e4SLinus Torvalds \ 5001da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 5011da177e4SLinus Torvalds __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ 502a6214385SMasahiro Yamada __start___kcrctab = .; \ 503b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab+*))) \ 504a6214385SMasahiro Yamada __stop___kcrctab = .; \ 5051da177e4SLinus Torvalds } \ 5061da177e4SLinus Torvalds \ 5071da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 5081da177e4SLinus Torvalds __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ 509a6214385SMasahiro Yamada __start___kcrctab_gpl = .; \ 510b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_gpl+*))) \ 511a6214385SMasahiro Yamada __stop___kcrctab_gpl = .; \ 5121da177e4SLinus Torvalds } \ 5131da177e4SLinus Torvalds \ 5141da177e4SLinus Torvalds /* Kernel symbol table: strings */ \ 5151da177e4SLinus Torvalds __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ 5164b89b7f7SNicholas Piggin *(__ksymtab_strings) \ 5171da177e4SLinus Torvalds } \ 5181da177e4SLinus Torvalds \ 519eb8f6890SSam Ravnborg /* __*init sections */ \ 520eb8f6890SSam Ravnborg __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) { \ 521312b1485SSam Ravnborg *(.ref.rodata) \ 522eb8f6890SSam Ravnborg MEM_KEEP(init.rodata) \ 523eb8f6890SSam Ravnborg } \ 524eb8f6890SSam Ravnborg \ 5251da177e4SLinus Torvalds /* Built-in module parameters. */ \ 5261da177e4SLinus Torvalds __param : AT(ADDR(__param) - LOAD_OFFSET) { \ 5279b351be2SJim Cromie BOUNDED_SECTION_BY(__param, ___param) \ 528e94965edSDmitry Torokhov } \ 529e94965edSDmitry Torokhov \ 530e94965edSDmitry Torokhov /* Built-in module versions. */ \ 531e94965edSDmitry Torokhov __modver : AT(ADDR(__modver) - LOAD_OFFSET) { \ 5329b351be2SJim Cromie BOUNDED_SECTION_BY(__modver, ___modver) \ 5337583ddfdSMarcelo Tosatti } \ 534eaf93707SKees Cook \ 53589245600SSami Tolvanen KCFI_TRAPS \ 53689245600SSami Tolvanen \ 537b8c2f776SKees Cook RO_EXCEPTION_TABLE \ 538eaf93707SKees Cook NOTES \ 53990ceddcbSFangrui Song BTF \ 540eaf93707SKees Cook \ 541eaf93707SKees Cook . = ALIGN((align)); \ 542eaf93707SKees Cook __end_rodata = .; 5431da177e4SLinus Torvalds 544cf68fffbSSami Tolvanen 545cf68fffbSSami Tolvanen /* 54665538966SThomas Gleixner * Non-instrumentable text section 54765538966SThomas Gleixner */ 54865538966SThomas Gleixner #define NOINSTR_TEXT \ 54965538966SThomas Gleixner ALIGN_FUNCTION(); \ 55065538966SThomas Gleixner __noinstr_text_start = .; \ 55165538966SThomas Gleixner *(.noinstr.text) \ 5522b5a0e42SPeter Zijlstra __cpuidle_text_start = .; \ 5532b5a0e42SPeter Zijlstra *(.cpuidle.text) \ 5542b5a0e42SPeter Zijlstra __cpuidle_text_end = .; \ 55565538966SThomas Gleixner __noinstr_text_end = .; 55665538966SThomas Gleixner 55765538966SThomas Gleixner /* 558cb87481eSNicholas Piggin * .text section. Map to function alignment to avoid address changes 5590f4c4af0SNicholas Piggin * during second ld run in second ld pass when generating System.map 560cb87481eSNicholas Piggin * 561cb87481eSNicholas Piggin * TEXT_MAIN here will match .text.fixup and .text.unlikely if dead 562cb87481eSNicholas Piggin * code elimination is enabled, so these sections should be converted 563cb87481eSNicholas Piggin * to use ".." first. 564cb87481eSNicholas Piggin */ 5657664709bSSam Ravnborg #define TEXT_TEXT \ 5667664709bSSam Ravnborg ALIGN_FUNCTION(); \ 567eff8728fSNick Desaulniers *(.text.hot .text.hot.*) \ 568eff8728fSNick Desaulniers *(TEXT_MAIN .text.fixup) \ 569eff8728fSNick Desaulniers *(.text.unlikely .text.unlikely.*) \ 570eff8728fSNick Desaulniers *(.text.unknown .text.unknown.*) \ 57165538966SThomas Gleixner NOINSTR_TEXT \ 572312b1485SSam Ravnborg *(.ref.text) \ 57384837881SNathan Chancellor *(.text.asan.* .text.tsan.*) \ 574266ff2a8SNicholas Piggin MEM_KEEP(init.text*) \ 575eb8f6890SSam Ravnborg 5767664709bSSam Ravnborg 5776d30e3a8SSam Ravnborg /* sched.text is aling to function alignment to secure we have same 5786d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 5791da177e4SLinus Torvalds #define SCHED_TEXT \ 5806d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 581a6214385SMasahiro Yamada __sched_text_start = .; \ 5821da177e4SLinus Torvalds *(.sched.text) \ 583a6214385SMasahiro Yamada __sched_text_end = .; 5841da177e4SLinus Torvalds 5856d30e3a8SSam Ravnborg /* spinlock.text is aling to function alignment to secure we have same 5866d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 5871da177e4SLinus Torvalds #define LOCK_TEXT \ 5886d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 589a6214385SMasahiro Yamada __lock_text_start = .; \ 5901da177e4SLinus Torvalds *(.spinlock.text) \ 591a6214385SMasahiro Yamada __lock_text_end = .; 592d0aaff97SPrasanna S Panchamukhi 593d0aaff97SPrasanna S Panchamukhi #define KPROBES_TEXT \ 594d0aaff97SPrasanna S Panchamukhi ALIGN_FUNCTION(); \ 595a6214385SMasahiro Yamada __kprobes_text_start = .; \ 596d0aaff97SPrasanna S Panchamukhi *(.kprobes.text) \ 597a6214385SMasahiro Yamada __kprobes_text_end = .; 598a7d0c210SPaolo 'Blaisorblade' Giarrusso 599ea714547SJiri Olsa #define ENTRY_TEXT \ 600ea714547SJiri Olsa ALIGN_FUNCTION(); \ 601a6214385SMasahiro Yamada __entry_text_start = .; \ 602ea714547SJiri Olsa *(.entry.text) \ 603a6214385SMasahiro Yamada __entry_text_end = .; 604ea714547SJiri Olsa 605a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT \ 606a0343e82SFrederic Weisbecker ALIGN_FUNCTION(); \ 607a6214385SMasahiro Yamada __irqentry_text_start = .; \ 608a0343e82SFrederic Weisbecker *(.irqentry.text) \ 609a6214385SMasahiro Yamada __irqentry_text_end = .; 610a0343e82SFrederic Weisbecker 611be7635e7SAlexander Potapenko #define SOFTIRQENTRY_TEXT \ 612be7635e7SAlexander Potapenko ALIGN_FUNCTION(); \ 613a6214385SMasahiro Yamada __softirqentry_text_start = .; \ 614be7635e7SAlexander Potapenko *(.softirqentry.text) \ 615a6214385SMasahiro Yamada __softirqentry_text_end = .; 616be7635e7SAlexander Potapenko 6171e7e4788SJosh Poimboeuf #define STATIC_CALL_TEXT \ 6181e7e4788SJosh Poimboeuf ALIGN_FUNCTION(); \ 6191e7e4788SJosh Poimboeuf __static_call_text_start = .; \ 6201e7e4788SJosh Poimboeuf *(.static_call.text) \ 6211e7e4788SJosh Poimboeuf __static_call_text_end = .; 6221e7e4788SJosh Poimboeuf 62337c514e3SSam Ravnborg /* Section used for early init (in .S files) */ 624266ff2a8SNicholas Piggin #define HEAD_TEXT KEEP(*(.head.text)) 62537c514e3SSam Ravnborg 6267923f90fSSam Ravnborg #define HEAD_TEXT_SECTION \ 627ef53dae8SSam Ravnborg .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) { \ 628ef53dae8SSam Ravnborg HEAD_TEXT \ 629ef53dae8SSam Ravnborg } 630ef53dae8SSam Ravnborg 631ef53dae8SSam Ravnborg /* 632ef53dae8SSam Ravnborg * Exception table 633ef53dae8SSam Ravnborg */ 634ef53dae8SSam Ravnborg #define EXCEPTION_TABLE(align) \ 635ef53dae8SSam Ravnborg . = ALIGN(align); \ 636ef53dae8SSam Ravnborg __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \ 6379b351be2SJim Cromie BOUNDED_SECTION_BY(__ex_table, ___ex_table) \ 638ef53dae8SSam Ravnborg } 639ef53dae8SSam Ravnborg 640ef53dae8SSam Ravnborg /* 64190ceddcbSFangrui Song * .BTF 64290ceddcbSFangrui Song */ 64390ceddcbSFangrui Song #ifdef CONFIG_DEBUG_INFO_BTF 64490ceddcbSFangrui Song #define BTF \ 64590ceddcbSFangrui Song .BTF : AT(ADDR(.BTF) - LOAD_OFFSET) { \ 6469b351be2SJim Cromie BOUNDED_SECTION_BY(.BTF, _BTF) \ 6475a2798abSJiri Olsa } \ 6485a2798abSJiri Olsa . = ALIGN(4); \ 6495a2798abSJiri Olsa .BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) { \ 6505a2798abSJiri Olsa *(.BTF_ids) \ 65190ceddcbSFangrui Song } 65290ceddcbSFangrui Song #else 65390ceddcbSFangrui Song #define BTF 65490ceddcbSFangrui Song #endif 65590ceddcbSFangrui Song 65690ceddcbSFangrui Song /* 657ef53dae8SSam Ravnborg * Init task 658ef53dae8SSam Ravnborg */ 65939a449d9STim Abbott #define INIT_TASK_DATA_SECTION(align) \ 660ef53dae8SSam Ravnborg . = ALIGN(align); \ 661da5e37efSSam Ravnborg .data..init_task : AT(ADDR(.data..init_task) - LOAD_OFFSET) { \ 66239a449d9STim Abbott INIT_TASK_DATA(align) \ 663ef53dae8SSam Ravnborg } 664eb8f6890SSam Ravnborg 665b99b87f7SPeter Oberparleiter #ifdef CONFIG_CONSTRUCTORS 6662a2325e6SHeiko Carstens #define KERNEL_CTORS() . = ALIGN(8); \ 667a6214385SMasahiro Yamada __ctors_start = .; \ 6683e663148SKees Cook KEEP(*(SORT(.ctors.*))) \ 6694b89b7f7SNicholas Piggin KEEP(*(.ctors)) \ 6704b89b7f7SNicholas Piggin KEEP(*(SORT(.init_array.*))) \ 6714b89b7f7SNicholas Piggin KEEP(*(.init_array)) \ 672a6214385SMasahiro Yamada __ctors_end = .; 673b99b87f7SPeter Oberparleiter #else 674b99b87f7SPeter Oberparleiter #define KERNEL_CTORS() 675b99b87f7SPeter Oberparleiter #endif 676b99b87f7SPeter Oberparleiter 67701ba2bdcSSam Ravnborg /* init and exit section handling */ 678eb8f6890SSam Ravnborg #define INIT_DATA \ 679b67067f1SNicholas Piggin KEEP(*(SORT(___kentry+*))) \ 680*d4035ff1SJisheng Zhang *(.init.data .init.data.*) \ 681266ff2a8SNicholas Piggin MEM_DISCARD(init.data*) \ 682b99b87f7SPeter Oberparleiter KERNEL_CTORS() \ 6834b3b4c5eSJohn Reiser MCOUNT_REC() \ 684266ff2a8SNicholas Piggin *(.init.rodata .init.rodata.*) \ 685e4a9ea5eSSteven Rostedt FTRACE_EVENTS() \ 6863d56e331SSteven Rostedt TRACE_SYSCALLS() \ 687376e2424SMasami Hiramatsu KPROBE_BLACKLIST() \ 688540adea3SMasami Hiramatsu ERROR_INJECT_WHITELIST() \ 689aab94339SDirk Brandewie MEM_DISCARD(init.rodata) \ 690f2f6c255SPrashant Gaikwad CLK_OF_TABLES() \ 691f618c470SMarek Szyprowski RESERVEDMEM_OF_TABLES() \ 6922fcc112aSDaniel Lezcano TIMER_OF_TABLES() \ 6936c3ff8b1SStephen Boyd CPU_METHOD_OF_TABLES() \ 694449e056cSDaniel Lezcano CPUIDLE_METHOD_OF_TABLES() \ 695f6e916b8SThomas Petazzoni KERNEL_DTB() \ 696b0b6abd3SRob Herring IRQCHIP_OF_MATCH_TABLE() \ 69746e589a3SMarc Zyngier ACPI_PROBE_TABLE(irqchip) \ 6982fcc112aSDaniel Lezcano ACPI_PROBE_TABLE(timer) \ 699980af75eSDaniel Lezcano THERMAL_TABLE(governor) \ 7003ac946d1SKees Cook EARLYCON_TABLE() \ 701e6b1db98SMatthew Garrett LSM_TABLE() \ 70290a025a8SBrendan Higgins EARLY_LSM_TABLE() \ 70390a025a8SBrendan Higgins KUNIT_TABLE() 70401ba2bdcSSam Ravnborg 705eb8f6890SSam Ravnborg #define INIT_TEXT \ 706266ff2a8SNicholas Piggin *(.init.text .init.text.*) \ 707e41f501dSDmitry Vyukov *(.text.startup) \ 708266ff2a8SNicholas Piggin MEM_DISCARD(init.text*) 709eb8f6890SSam Ravnborg 710eb8f6890SSam Ravnborg #define EXIT_DATA \ 711266ff2a8SNicholas Piggin *(.exit.data .exit.data.*) \ 7128dcf86caSPeter Oberparleiter *(.fini_array .fini_array.*) \ 7138dcf86caSPeter Oberparleiter *(.dtors .dtors.*) \ 714eb8f6890SSam Ravnborg 715eb8f6890SSam Ravnborg #define EXIT_TEXT \ 716eb8f6890SSam Ravnborg *(.exit.text) \ 717e41f501dSDmitry Vyukov *(.text.exit) \ 71801ba2bdcSSam Ravnborg 7197923f90fSSam Ravnborg #define EXIT_CALL \ 7207923f90fSSam Ravnborg *(.exitcall.exit) 7217923f90fSSam Ravnborg 722ef53dae8SSam Ravnborg /* 723ef53dae8SSam Ravnborg * bss (Block Started by Symbol) - uninitialized data 724ef53dae8SSam Ravnborg * zeroed during startup 725ef53dae8SSam Ravnborg */ 72604e448d9STim Abbott #define SBSS(sbss_align) \ 72704e448d9STim Abbott . = ALIGN(sbss_align); \ 728ef53dae8SSam Ravnborg .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \ 72983a092cfSNicholas Piggin *(.dynsbss) \ 730266ff2a8SNicholas Piggin *(SBSS_MAIN) \ 731ef53dae8SSam Ravnborg *(.scommon) \ 732ef53dae8SSam Ravnborg } 733ef53dae8SSam Ravnborg 734c87728caSDavid Daney /* 735c87728caSDavid Daney * Allow archectures to redefine BSS_FIRST_SECTIONS to add extra 736c87728caSDavid Daney * sections to the front of bss. 737c87728caSDavid Daney */ 738c87728caSDavid Daney #ifndef BSS_FIRST_SECTIONS 739c87728caSDavid Daney #define BSS_FIRST_SECTIONS 740c87728caSDavid Daney #endif 741c87728caSDavid Daney 742ef53dae8SSam Ravnborg #define BSS(bss_align) \ 743ef53dae8SSam Ravnborg . = ALIGN(bss_align); \ 744ef53dae8SSam Ravnborg .bss : AT(ADDR(.bss) - LOAD_OFFSET) { \ 745c87728caSDavid Daney BSS_FIRST_SECTIONS \ 746de2b41beSJoerg Roedel . = ALIGN(PAGE_SIZE); \ 7477c74df07STim Abbott *(.bss..page_aligned) \ 748de2b41beSJoerg Roedel . = ALIGN(PAGE_SIZE); \ 749ef53dae8SSam Ravnborg *(.dynbss) \ 750cb87481eSNicholas Piggin *(BSS_MAIN) \ 751ef53dae8SSam Ravnborg *(COMMON) \ 752ef53dae8SSam Ravnborg } 753ef53dae8SSam Ravnborg 754ef53dae8SSam Ravnborg /* 755ef53dae8SSam Ravnborg * DWARF debug sections. 756ef53dae8SSam Ravnborg * Symbols in the DWARF debugging sections are relative to 757ef53dae8SSam Ravnborg * the beginning of the section so we begin them at 0. 758ef53dae8SSam Ravnborg */ 759a7d0c210SPaolo 'Blaisorblade' Giarrusso #define DWARF_DEBUG \ 760a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1 */ \ 761a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug 0 : { *(.debug) } \ 762a7d0c210SPaolo 'Blaisorblade' Giarrusso .line 0 : { *(.line) } \ 763a7d0c210SPaolo 'Blaisorblade' Giarrusso /* GNU DWARF 1 extensions */ \ 764a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_srcinfo 0 : { *(.debug_srcinfo) } \ 765a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_sfnames 0 : { *(.debug_sfnames) } \ 766a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1.1 and DWARF 2 */ \ 767a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_aranges 0 : { *(.debug_aranges) } \ 768a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_pubnames 0 : { *(.debug_pubnames) } \ 769a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 2 */ \ 770a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_info 0 : { *(.debug_info \ 771a7d0c210SPaolo 'Blaisorblade' Giarrusso .gnu.linkonce.wi.*) } \ 772a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_abbrev 0 : { *(.debug_abbrev) } \ 773a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_line 0 : { *(.debug_line) } \ 774a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_frame 0 : { *(.debug_frame) } \ 775a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_str 0 : { *(.debug_str) } \ 776a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_loc 0 : { *(.debug_loc) } \ 777a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_macinfo 0 : { *(.debug_macinfo) } \ 77883a092cfSNicholas Piggin .debug_pubtypes 0 : { *(.debug_pubtypes) } \ 77983a092cfSNicholas Piggin /* DWARF 3 */ \ 78083a092cfSNicholas Piggin .debug_ranges 0 : { *(.debug_ranges) } \ 781a7d0c210SPaolo 'Blaisorblade' Giarrusso /* SGI/MIPS DWARF 2 extensions */ \ 782a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_weaknames 0 : { *(.debug_weaknames) } \ 783a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_funcnames 0 : { *(.debug_funcnames) } \ 784a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_typenames 0 : { *(.debug_typenames) } \ 785a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_varnames 0 : { *(.debug_varnames) } \ 78683a092cfSNicholas Piggin /* GNU DWARF 2 extensions */ \ 78783a092cfSNicholas Piggin .debug_gnu_pubnames 0 : { *(.debug_gnu_pubnames) } \ 78883a092cfSNicholas Piggin .debug_gnu_pubtypes 0 : { *(.debug_gnu_pubtypes) } \ 78983a092cfSNicholas Piggin /* DWARF 4 */ \ 79083a092cfSNicholas Piggin .debug_types 0 : { *(.debug_types) } \ 79183a092cfSNicholas Piggin /* DWARF 5 */ \ 7923c4fa46bSNick Desaulniers .debug_addr 0 : { *(.debug_addr) } \ 7933c4fa46bSNick Desaulniers .debug_line_str 0 : { *(.debug_line_str) } \ 7943c4fa46bSNick Desaulniers .debug_loclists 0 : { *(.debug_loclists) } \ 79583a092cfSNicholas Piggin .debug_macro 0 : { *(.debug_macro) } \ 7963c4fa46bSNick Desaulniers .debug_names 0 : { *(.debug_names) } \ 7973c4fa46bSNick Desaulniers .debug_rnglists 0 : { *(.debug_rnglists) } \ 7983c4fa46bSNick Desaulniers .debug_str_offsets 0 : { *(.debug_str_offsets) } 799a7d0c210SPaolo 'Blaisorblade' Giarrusso 800a7d0c210SPaolo 'Blaisorblade' Giarrusso /* Stabs debugging sections. */ 801a7d0c210SPaolo 'Blaisorblade' Giarrusso #define STABS_DEBUG \ 802a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab 0 : { *(.stab) } \ 803a7d0c210SPaolo 'Blaisorblade' Giarrusso .stabstr 0 : { *(.stabstr) } \ 804a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.excl 0 : { *(.stab.excl) } \ 805a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.exclstr 0 : { *(.stab.exclstr) } \ 806a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.index 0 : { *(.stab.index) } \ 807c604abc3SKees Cook .stab.indexstr 0 : { *(.stab.indexstr) } 808c604abc3SKees Cook 809c604abc3SKees Cook /* Required sections not related to debugging. */ 810c604abc3SKees Cook #define ELF_DETAILS \ 811a840c4deSKees Cook .comment 0 : { *(.comment) } \ 812a840c4deSKees Cook .symtab 0 : { *(.symtab) } \ 813a840c4deSKees Cook .strtab 0 : { *(.strtab) } \ 814a840c4deSKees Cook .shstrtab 0 : { *(.shstrtab) } 8159c9b8b38SJeremy Fitzhardinge 8166360b1fbSJan Beulich #ifdef CONFIG_GENERIC_BUG 8177664c5a1SJeremy Fitzhardinge #define BUG_TABLE \ 8187664c5a1SJeremy Fitzhardinge . = ALIGN(8); \ 8197664c5a1SJeremy Fitzhardinge __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \ 8209b351be2SJim Cromie BOUNDED_SECTION_BY(__bug_table, ___bug_table) \ 8217664c5a1SJeremy Fitzhardinge } 8226360b1fbSJan Beulich #else 8236360b1fbSJan Beulich #define BUG_TABLE 8246360b1fbSJan Beulich #endif 8257664c5a1SJeremy Fitzhardinge 82611af8474SJosh Poimboeuf #ifdef CONFIG_UNWINDER_ORC 827ee9f8fceSJosh Poimboeuf #define ORC_UNWIND_TABLE \ 828b9f174c8SOmar Sandoval .orc_header : AT(ADDR(.orc_header) - LOAD_OFFSET) { \ 829b9f174c8SOmar Sandoval BOUNDED_SECTION_BY(.orc_header, _orc_header) \ 830b9f174c8SOmar Sandoval } \ 831ee9f8fceSJosh Poimboeuf . = ALIGN(4); \ 832ee9f8fceSJosh Poimboeuf .orc_unwind_ip : AT(ADDR(.orc_unwind_ip) - LOAD_OFFSET) { \ 8339b351be2SJim Cromie BOUNDED_SECTION_BY(.orc_unwind_ip, _orc_unwind_ip) \ 834ee9f8fceSJosh Poimboeuf } \ 835f76a16adSJosh Poimboeuf . = ALIGN(2); \ 836ee9f8fceSJosh Poimboeuf .orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) { \ 8379b351be2SJim Cromie BOUNDED_SECTION_BY(.orc_unwind, _orc_unwind) \ 838ee9f8fceSJosh Poimboeuf } \ 839ca136cacSKristen Carlson Accardi text_size = _etext - _stext; \ 840ee9f8fceSJosh Poimboeuf . = ALIGN(4); \ 841ee9f8fceSJosh Poimboeuf .orc_lookup : AT(ADDR(.orc_lookup) - LOAD_OFFSET) { \ 842a6214385SMasahiro Yamada orc_lookup = .; \ 843ca136cacSKristen Carlson Accardi . += (((text_size + LOOKUP_BLOCK_SIZE - 1) / \ 844ee9f8fceSJosh Poimboeuf LOOKUP_BLOCK_SIZE) + 1) * 4; \ 845a6214385SMasahiro Yamada orc_lookup_end = .; \ 846ee9f8fceSJosh Poimboeuf } 847ee9f8fceSJosh Poimboeuf #else 848ee9f8fceSJosh Poimboeuf #define ORC_UNWIND_TABLE 849ee9f8fceSJosh Poimboeuf #endif 850ee9f8fceSJosh Poimboeuf 851771856caSLuis Chamberlain /* Built-in firmware blobs */ 852771856caSLuis Chamberlain #ifdef CONFIG_FW_LOADER 853771856caSLuis Chamberlain #define FW_LOADER_BUILT_IN_DATA \ 854771856caSLuis Chamberlain .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) ALIGN(8) { \ 8559b351be2SJim Cromie BOUNDED_SECTION_PRE_LABEL(.builtin_fw, _builtin_fw, __start, __end) \ 856771856caSLuis Chamberlain } 857771856caSLuis Chamberlain #else 858771856caSLuis Chamberlain #define FW_LOADER_BUILT_IN_DATA 859771856caSLuis Chamberlain #endif 860771856caSLuis Chamberlain 86163687a52SJan Beulich #ifdef CONFIG_PM_TRACE 86263687a52SJan Beulich #define TRACEDATA \ 86363687a52SJan Beulich . = ALIGN(4); \ 86463687a52SJan Beulich .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \ 8659b351be2SJim Cromie BOUNDED_SECTION_POST_LABEL(.tracedata, __tracedata, _start, _end) \ 86663687a52SJan Beulich } 86763687a52SJan Beulich #else 86863687a52SJan Beulich #define TRACEDATA 86963687a52SJan Beulich #endif 87063687a52SJan Beulich 87133701557SChris Down #ifdef CONFIG_PRINTK_INDEX 87233701557SChris Down #define PRINTK_INDEX \ 87333701557SChris Down .printk_index : AT(ADDR(.printk_index) - LOAD_OFFSET) { \ 8749b351be2SJim Cromie BOUNDED_SECTION_BY(.printk_index, _printk_index) \ 87533701557SChris Down } 87633701557SChris Down #else 87733701557SChris Down #define PRINTK_INDEX 87833701557SChris Down #endif 87933701557SChris Down 88099cb0d91SMasahiro Yamada /* 88199cb0d91SMasahiro Yamada * Discard .note.GNU-stack, which is emitted as PROGBITS by the compiler. 88299cb0d91SMasahiro Yamada * Otherwise, the type of .notes section would become PROGBITS instead of NOTES. 883f7ba52f3SJosh Poimboeuf * 884f7ba52f3SJosh Poimboeuf * Also, discard .note.gnu.property, otherwise it forces the notes section to 885f7ba52f3SJosh Poimboeuf * be 8-byte aligned which causes alignment mismatches with the kernel's custom 886f7ba52f3SJosh Poimboeuf * 4-byte aligned notes. 88799cb0d91SMasahiro Yamada */ 8889c9b8b38SJeremy Fitzhardinge #define NOTES \ 889f7ba52f3SJosh Poimboeuf /DISCARD/ : { \ 890f7ba52f3SJosh Poimboeuf *(.note.GNU-stack) \ 891f7ba52f3SJosh Poimboeuf *(.note.gnu.property) \ 892f7ba52f3SJosh Poimboeuf } \ 893cbe87121SRoland McGrath .notes : AT(ADDR(.notes) - LOAD_OFFSET) { \ 8949b351be2SJim Cromie BOUNDED_SECTION_BY(.note.*, _notes) \ 895fbe6a8e6SKees Cook } NOTES_HEADERS \ 896fbe6a8e6SKees Cook NOTES_HEADERS_RESTORE 89761ce1efeSAndrew Morton 898ef53dae8SSam Ravnborg #define INIT_SETUP(initsetup_align) \ 899ef53dae8SSam Ravnborg . = ALIGN(initsetup_align); \ 9009b351be2SJim Cromie BOUNDED_SECTION_POST_LABEL(.init.setup, __setup, _start, _end) 901ef53dae8SSam Ravnborg 902026cee00SPawel Moll #define INIT_CALLS_LEVEL(level) \ 903a6214385SMasahiro Yamada __initcall##level##_start = .; \ 904b67067f1SNicholas Piggin KEEP(*(.initcall##level##.init)) \ 905b67067f1SNicholas Piggin KEEP(*(.initcall##level##s.init)) \ 90661ce1efeSAndrew Morton 907ef53dae8SSam Ravnborg #define INIT_CALLS \ 908a6214385SMasahiro Yamada __initcall_start = .; \ 909b67067f1SNicholas Piggin KEEP(*(.initcallearly.init)) \ 910026cee00SPawel Moll INIT_CALLS_LEVEL(0) \ 911026cee00SPawel Moll INIT_CALLS_LEVEL(1) \ 912026cee00SPawel Moll INIT_CALLS_LEVEL(2) \ 913026cee00SPawel Moll INIT_CALLS_LEVEL(3) \ 914026cee00SPawel Moll INIT_CALLS_LEVEL(4) \ 915026cee00SPawel Moll INIT_CALLS_LEVEL(5) \ 916026cee00SPawel Moll INIT_CALLS_LEVEL(rootfs) \ 917026cee00SPawel Moll INIT_CALLS_LEVEL(6) \ 918026cee00SPawel Moll INIT_CALLS_LEVEL(7) \ 919a6214385SMasahiro Yamada __initcall_end = .; 920ef53dae8SSam Ravnborg 921ef53dae8SSam Ravnborg #define CON_INITCALL \ 9229b351be2SJim Cromie BOUNDED_SECTION_POST_LABEL(.con_initcall.init, __con_initcall, _start, _end) 923ef53dae8SSam Ravnborg 92490a025a8SBrendan Higgins /* Alignment must be consistent with (kunit_suite *) in include/kunit/test.h */ 92590a025a8SBrendan Higgins #define KUNIT_TABLE() \ 92690a025a8SBrendan Higgins . = ALIGN(8); \ 9279b351be2SJim Cromie BOUNDED_SECTION_POST_LABEL(.kunit_test_suites, __kunit_suites, _start, _end) 92890a025a8SBrendan Higgins 929ef53dae8SSam Ravnborg #ifdef CONFIG_BLK_DEV_INITRD 930ef53dae8SSam Ravnborg #define INIT_RAM_FS \ 931d8826262SMike Frysinger . = ALIGN(4); \ 932a6214385SMasahiro Yamada __initramfs_start = .; \ 933b67067f1SNicholas Piggin KEEP(*(.init.ramfs)) \ 934ffe8018cSHendrik Brueckner . = ALIGN(8); \ 935b67067f1SNicholas Piggin KEEP(*(.init.ramfs.info)) 936ef53dae8SSam Ravnborg #else 937eadfe219SDavid Howells #define INIT_RAM_FS 938ef53dae8SSam Ravnborg #endif 939ef53dae8SSam Ravnborg 940023bf6f1STejun Heo /* 941ac26963aSBrijesh Singh * Memory encryption operates on a page basis. Since we need to clear 942ac26963aSBrijesh Singh * the memory encryption mask for this section, it needs to be aligned 943ac26963aSBrijesh Singh * on a page boundary and be a page-size multiple in length. 944ac26963aSBrijesh Singh * 945ac26963aSBrijesh Singh * Note: We use a separate section so that only this section gets 946ac26963aSBrijesh Singh * decrypted to avoid exposing more than we wish. 947ac26963aSBrijesh Singh */ 948ac26963aSBrijesh Singh #ifdef CONFIG_AMD_MEM_ENCRYPT 949ac26963aSBrijesh Singh #define PERCPU_DECRYPTED_SECTION \ 950ac26963aSBrijesh Singh . = ALIGN(PAGE_SIZE); \ 951ac26963aSBrijesh Singh *(.data..percpu..decrypted) \ 952ac26963aSBrijesh Singh . = ALIGN(PAGE_SIZE); 953ac26963aSBrijesh Singh #else 954ac26963aSBrijesh Singh #define PERCPU_DECRYPTED_SECTION 955ac26963aSBrijesh Singh #endif 956ac26963aSBrijesh Singh 957ac26963aSBrijesh Singh 958ac26963aSBrijesh Singh /* 959023bf6f1STejun Heo * Default discarded sections. 960023bf6f1STejun Heo * 961023bf6f1STejun Heo * Some archs want to discard exit text/data at runtime rather than 962023bf6f1STejun Heo * link time due to cross-section references such as alt instructions, 963023bf6f1STejun Heo * bug table, eh_frame, etc. DISCARDS must be the last of output 964023bf6f1STejun Heo * section definitions so that such archs put those in earlier section 965023bf6f1STejun Heo * definitions. 966023bf6f1STejun Heo */ 96784d5f77fSH.J. Lu #ifdef RUNTIME_DISCARD_EXIT 96884d5f77fSH.J. Lu #define EXIT_DISCARDS 96984d5f77fSH.J. Lu #else 97084d5f77fSH.J. Lu #define EXIT_DISCARDS \ 97184d5f77fSH.J. Lu EXIT_TEXT \ 97284d5f77fSH.J. Lu EXIT_DATA 97384d5f77fSH.J. Lu #endif 97484d5f77fSH.J. Lu 975d812db78SKees Cook /* 976f5b6a74dSNathan Chancellor * Clang's -fprofile-arcs, -fsanitize=kernel-address, and 977f5b6a74dSNathan Chancellor * -fsanitize=thread produce unwanted sections (.eh_frame 978f5b6a74dSNathan Chancellor * and .init_array.*), but CONFIG_CONSTRUCTORS wants to 979f5b6a74dSNathan Chancellor * keep any .init_array.* sections. 980d812db78SKees Cook * https://bugs.llvm.org/show_bug.cgi?id=46478 981d812db78SKees Cook */ 98268c76ad4SArd Biesheuvel #ifdef CONFIG_UNWIND_TABLES 98368c76ad4SArd Biesheuvel #define DISCARD_EH_FRAME 98468c76ad4SArd Biesheuvel #else 98568c76ad4SArd Biesheuvel #define DISCARD_EH_FRAME *(.eh_frame) 98668c76ad4SArd Biesheuvel #endif 98789245600SSami Tolvanen #if defined(CONFIG_GCOV_KERNEL) || defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KCSAN) 988d812db78SKees Cook # ifdef CONFIG_CONSTRUCTORS 989d812db78SKees Cook # define SANITIZER_DISCARDS \ 99068c76ad4SArd Biesheuvel DISCARD_EH_FRAME 991d812db78SKees Cook # else 992d812db78SKees Cook # define SANITIZER_DISCARDS \ 993d812db78SKees Cook *(.init_array) *(.init_array.*) \ 99468c76ad4SArd Biesheuvel DISCARD_EH_FRAME 995d812db78SKees Cook # endif 996d812db78SKees Cook #else 997d812db78SKees Cook # define SANITIZER_DISCARDS 998d812db78SKees Cook #endif 999d812db78SKees Cook 100003c2b85cSKees Cook #define COMMON_DISCARDS \ 1001d812db78SKees Cook SANITIZER_DISCARDS \ 10029440155cSPeter Zijlstra (Intel) PATCHABLE_DISCARDS \ 100303c2b85cSKees Cook *(.discard) \ 100403c2b85cSKees Cook *(.discard.*) \ 1005ddb5cdbaSMasahiro Yamada *(.export_symbol) \ 1006dfbe6968SKees Cook *(.modinfo) \ 1007dfbe6968SKees Cook /* ld.bfd warns about .gnu.version* even when not emitted */ \ 1008dfbe6968SKees Cook *(.gnu.version*) \ 100903c2b85cSKees Cook 1010405d967dSTejun Heo #define DISCARDS \ 1011405d967dSTejun Heo /DISCARD/ : { \ 101284d5f77fSH.J. Lu EXIT_DISCARDS \ 1013023bf6f1STejun Heo EXIT_CALL \ 101403c2b85cSKees Cook COMMON_DISCARDS \ 1015405d967dSTejun Heo } 1016405d967dSTejun Heo 10173e5d8f97STejun Heo /** 10186ea0c34dSMike Frysinger * PERCPU_INPUT - the percpu input sections 10196ea0c34dSMike Frysinger * @cacheline: cacheline size 10206ea0c34dSMike Frysinger * 10216ea0c34dSMike Frysinger * The core percpu section names and core symbols which do not rely 10226ea0c34dSMike Frysinger * directly upon load addresses. 10236ea0c34dSMike Frysinger * 10246ea0c34dSMike Frysinger * @cacheline is used to align subsections to avoid false cacheline 10256ea0c34dSMike Frysinger * sharing between subsections for different purposes. 10266ea0c34dSMike Frysinger */ 10276ea0c34dSMike Frysinger #define PERCPU_INPUT(cacheline) \ 1028a6214385SMasahiro Yamada __per_cpu_start = .; \ 10296ea0c34dSMike Frysinger *(.data..percpu..first) \ 10306ea0c34dSMike Frysinger . = ALIGN(PAGE_SIZE); \ 10316ea0c34dSMike Frysinger *(.data..percpu..page_aligned) \ 10326ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 1033330d2822SZhengyu He *(.data..percpu..read_mostly) \ 10346ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 10356ea0c34dSMike Frysinger *(.data..percpu) \ 10366ea0c34dSMike Frysinger *(.data..percpu..shared_aligned) \ 1037ac26963aSBrijesh Singh PERCPU_DECRYPTED_SECTION \ 1038a6214385SMasahiro Yamada __per_cpu_end = .; 10396ea0c34dSMike Frysinger 10406ea0c34dSMike Frysinger /** 10416b7c38d5STejun Heo * PERCPU_VADDR - define output section for percpu area 104219df0c2fSTejun Heo * @cacheline: cacheline size 10433e5d8f97STejun Heo * @vaddr: explicit base address (optional) 10443e5d8f97STejun Heo * @phdr: destination PHDR (optional) 10453e5d8f97STejun Heo * 104619df0c2fSTejun Heo * Macro which expands to output section for percpu area. 104719df0c2fSTejun Heo * 104819df0c2fSTejun Heo * @cacheline is used to align subsections to avoid false cacheline 104919df0c2fSTejun Heo * sharing between subsections for different purposes. 105019df0c2fSTejun Heo * 105119df0c2fSTejun Heo * If @vaddr is not blank, it specifies explicit base address and all 105219df0c2fSTejun Heo * percpu symbols will be offset from the given address. If blank, 105319df0c2fSTejun Heo * @vaddr always equals @laddr + LOAD_OFFSET. 10543e5d8f97STejun Heo * 10553e5d8f97STejun Heo * @phdr defines the output PHDR to use if not blank. Be warned that 10563e5d8f97STejun Heo * output PHDR is sticky. If @phdr is specified, the next output 10573e5d8f97STejun Heo * section in the linker script will go there too. @phdr should have 10583e5d8f97STejun Heo * a leading colon. 10593e5d8f97STejun Heo * 10603ac6cffeSTejun Heo * Note that this macros defines __per_cpu_load as an absolute symbol. 10613ac6cffeSTejun Heo * If there is no need to put the percpu section at a predetermined 10620415b00dSTejun Heo * address, use PERCPU_SECTION. 10633e5d8f97STejun Heo */ 106419df0c2fSTejun Heo #define PERCPU_VADDR(cacheline, vaddr, phdr) \ 1065a6214385SMasahiro Yamada __per_cpu_load = .; \ 1066a6214385SMasahiro Yamada .data..percpu vaddr : AT(__per_cpu_load - LOAD_OFFSET) { \ 10676ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 10686b7c38d5STejun Heo } phdr \ 1069a6214385SMasahiro Yamada . = __per_cpu_load + SIZEOF(.data..percpu); 10703e5d8f97STejun Heo 10713e5d8f97STejun Heo /** 10720415b00dSTejun Heo * PERCPU_SECTION - define output section for percpu area, simple version 107319df0c2fSTejun Heo * @cacheline: cacheline size 10743e5d8f97STejun Heo * 10750415b00dSTejun Heo * Align to PAGE_SIZE and outputs output section for percpu area. This 10760415b00dSTejun Heo * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and 10773e5d8f97STejun Heo * __per_cpu_start will be identical. 10783ac6cffeSTejun Heo * 10790415b00dSTejun Heo * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,) 108019df0c2fSTejun Heo * except that __per_cpu_load is defined as a relative symbol against 108119df0c2fSTejun Heo * .data..percpu which is required for relocatable x86_32 configuration. 10823e5d8f97STejun Heo */ 10830415b00dSTejun Heo #define PERCPU_SECTION(cacheline) \ 10840415b00dSTejun Heo . = ALIGN(PAGE_SIZE); \ 10853d9a854cSDenys Vlasenko .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ 1086a6214385SMasahiro Yamada __per_cpu_load = .; \ 10876ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 10883ac6cffeSTejun Heo } 1089ef53dae8SSam Ravnborg 1090ef53dae8SSam Ravnborg 1091ef53dae8SSam Ravnborg /* 1092ef53dae8SSam Ravnborg * Definition of the high level *_SECTION macros 1093ef53dae8SSam Ravnborg * They will fit only a subset of the architectures 1094ef53dae8SSam Ravnborg */ 1095ef53dae8SSam Ravnborg 1096ef53dae8SSam Ravnborg 1097ef53dae8SSam Ravnborg /* 1098ef53dae8SSam Ravnborg * Writeable data. 1099ef53dae8SSam Ravnborg * All sections are combined in a single .data section. 1100ef53dae8SSam Ravnborg * The sections following CONSTRUCTORS are arranged so their 1101ef53dae8SSam Ravnborg * typical alignment matches. 1102ef53dae8SSam Ravnborg * A cacheline is typical/always less than a PAGE_SIZE so 1103ef53dae8SSam Ravnborg * the sections that has this restriction (or similar) 1104ef53dae8SSam Ravnborg * is located before the ones requiring PAGE_SIZE alignment. 1105ef53dae8SSam Ravnborg * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which 110625985edcSLucas De Marchi * matches the requirement of PAGE_ALIGNED_DATA. 1107ef53dae8SSam Ravnborg * 11087923f90fSSam Ravnborg * use 0 as page_align if page_aligned data is not used */ 1109c9174047SKees Cook #define RW_DATA(cacheline, pagealigned, inittask) \ 1110ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 1111ef53dae8SSam Ravnborg .data : AT(ADDR(.data) - LOAD_OFFSET) { \ 111239a449d9STim Abbott INIT_TASK_DATA(inittask) \ 11131b208622STim Abbott NOSAVE_DATA \ 11141b208622STim Abbott PAGE_ALIGNED_DATA(pagealigned) \ 1115ef53dae8SSam Ravnborg CACHELINE_ALIGNED_DATA(cacheline) \ 1116ef53dae8SSam Ravnborg READ_MOSTLY_DATA(cacheline) \ 1117ef53dae8SSam Ravnborg DATA_DATA \ 1118ef53dae8SSam Ravnborg CONSTRUCTORS \ 111919d43626SPeter Zijlstra } \ 1120ee9f8fceSJosh Poimboeuf BUG_TABLE \ 1121ef53dae8SSam Ravnborg 1122ef53dae8SSam Ravnborg #define INIT_TEXT_SECTION(inittext_align) \ 1123ef53dae8SSam Ravnborg . = ALIGN(inittext_align); \ 1124ef53dae8SSam Ravnborg .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { \ 1125a6214385SMasahiro Yamada _sinittext = .; \ 1126ef53dae8SSam Ravnborg INIT_TEXT \ 1127a6214385SMasahiro Yamada _einittext = .; \ 1128ef53dae8SSam Ravnborg } 1129ef53dae8SSam Ravnborg 1130ef53dae8SSam Ravnborg #define INIT_DATA_SECTION(initsetup_align) \ 1131ef53dae8SSam Ravnborg .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { \ 1132ef53dae8SSam Ravnborg INIT_DATA \ 1133ef53dae8SSam Ravnborg INIT_SETUP(initsetup_align) \ 1134ef53dae8SSam Ravnborg INIT_CALLS \ 1135ef53dae8SSam Ravnborg CON_INITCALL \ 1136ef53dae8SSam Ravnborg INIT_RAM_FS \ 1137ef53dae8SSam Ravnborg } 1138ef53dae8SSam Ravnborg 113904e448d9STim Abbott #define BSS_SECTION(sbss_align, bss_align, stop_align) \ 114004e448d9STim Abbott . = ALIGN(sbss_align); \ 1141a6214385SMasahiro Yamada __bss_start = .; \ 114204e448d9STim Abbott SBSS(sbss_align) \ 1143ef53dae8SSam Ravnborg BSS(bss_align) \ 114404e448d9STim Abbott . = ALIGN(stop_align); \ 1145a6214385SMasahiro Yamada __bss_stop = .; 1146