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 = .; 26ef53dae8SSam Ravnborg * RO_DATA_SECTION(PAGE_SIZE) 27ef53dae8SSam Ravnborg * RW_DATA_SECTION(...) 28ef53dae8SSam Ravnborg * _edata = .; 29ef53dae8SSam Ravnborg * 30ef53dae8SSam Ravnborg * EXCEPTION_TABLE(...) 31ef53dae8SSam Ravnborg * NOTES 32ef53dae8SSam Ravnborg * 3304e448d9STim Abbott * BSS_SECTION(0, 0, 0) 34ef53dae8SSam Ravnborg * _end = .; 35ef53dae8SSam Ravnborg * 36ef53dae8SSam Ravnborg * STABS_DEBUG 37ef53dae8SSam Ravnborg * DWARF_DEBUG 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 57b92021b0SRusty Russell #include <linux/export.h> 581da177e4SLinus Torvalds 596d30e3a8SSam Ravnborg /* Align . to a 8 byte boundary equals to maximum function alignment. */ 606d30e3a8SSam Ravnborg #define ALIGN_FUNCTION() . = ALIGN(8) 616d30e3a8SSam Ravnborg 6207fca0e5SSam Ravnborg /* 63cb87481eSNicholas Piggin * LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections, which 64cb87481eSNicholas Piggin * generates .data.identifier sections, which need to be pulled in with 65cb87481eSNicholas Piggin * .data. We don't want to pull in .data..other sections, which Linux 66cb87481eSNicholas Piggin * has defined. Same for text and bss. 67cb87481eSNicholas Piggin */ 68cb87481eSNicholas Piggin #ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION 69cb87481eSNicholas Piggin #define TEXT_MAIN .text .text.[0-9a-zA-Z_]* 70cb87481eSNicholas Piggin #define DATA_MAIN .data .data.[0-9a-zA-Z_]* 71cb87481eSNicholas Piggin #define BSS_MAIN .bss .bss.[0-9a-zA-Z_]* 72cb87481eSNicholas Piggin #else 73cb87481eSNicholas Piggin #define TEXT_MAIN .text 74cb87481eSNicholas Piggin #define DATA_MAIN .data 75cb87481eSNicholas Piggin #define BSS_MAIN .bss 76cb87481eSNicholas Piggin #endif 77cb87481eSNicholas Piggin 78cb87481eSNicholas Piggin /* 7907fca0e5SSam Ravnborg * Align to a 32 byte boundary equal to the 8007fca0e5SSam Ravnborg * alignment gcc 4.5 uses for a struct 8107fca0e5SSam Ravnborg */ 82aab94339SDirk Brandewie #define STRUCT_ALIGNMENT 32 83aab94339SDirk Brandewie #define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT) 8407fca0e5SSam Ravnborg 85eb8f6890SSam Ravnborg /* The actual configuration determine if the init/exit sections 86eb8f6890SSam Ravnborg * are handled as text/data or they can be discarded (which 87eb8f6890SSam Ravnborg * often happens at runtime) 88eb8f6890SSam Ravnborg */ 89eb8f6890SSam Ravnborg #ifdef CONFIG_HOTPLUG_CPU 90eb8f6890SSam Ravnborg #define CPU_KEEP(sec) *(.cpu##sec) 91eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) 92eb8f6890SSam Ravnborg #else 93eb8f6890SSam Ravnborg #define CPU_KEEP(sec) 94eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) *(.cpu##sec) 95eb8f6890SSam Ravnborg #endif 96eb8f6890SSam Ravnborg 971a3fb6d4SAdrian Bunk #if defined(CONFIG_MEMORY_HOTPLUG) 98eb8f6890SSam Ravnborg #define MEM_KEEP(sec) *(.mem##sec) 99eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) 100eb8f6890SSam Ravnborg #else 101eb8f6890SSam Ravnborg #define MEM_KEEP(sec) 102eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) *(.mem##sec) 103eb8f6890SSam Ravnborg #endif 104eb8f6890SSam Ravnborg 1058da3821bSSteven Rostedt #ifdef CONFIG_FTRACE_MCOUNT_RECORD 1064b3b4c5eSJohn Reiser #define MCOUNT_REC() . = ALIGN(8); \ 1074b3b4c5eSJohn Reiser VMLINUX_SYMBOL(__start_mcount_loc) = .; \ 1088da3821bSSteven Rostedt *(__mcount_loc) \ 1098da3821bSSteven Rostedt VMLINUX_SYMBOL(__stop_mcount_loc) = .; 1108da3821bSSteven Rostedt #else 1118da3821bSSteven Rostedt #define MCOUNT_REC() 1128da3821bSSteven Rostedt #endif 113eb8f6890SSam Ravnborg 1142ed84eebSSteven Rostedt #ifdef CONFIG_TRACE_BRANCH_PROFILING 11545b79749SSteven Rostedt #define LIKELY_PROFILE() VMLINUX_SYMBOL(__start_annotated_branch_profile) = .; \ 11645b79749SSteven Rostedt *(_ftrace_annotated_branch) \ 11745b79749SSteven Rostedt VMLINUX_SYMBOL(__stop_annotated_branch_profile) = .; 1181f0d69a9SSteven Rostedt #else 1191f0d69a9SSteven Rostedt #define LIKELY_PROFILE() 1201f0d69a9SSteven Rostedt #endif 1211f0d69a9SSteven Rostedt 1222bcd521aSSteven Rostedt #ifdef CONFIG_PROFILE_ALL_BRANCHES 1232bcd521aSSteven Rostedt #define BRANCH_PROFILE() VMLINUX_SYMBOL(__start_branch_profile) = .; \ 1242bcd521aSSteven Rostedt *(_ftrace_branch) \ 1252bcd521aSSteven Rostedt VMLINUX_SYMBOL(__stop_branch_profile) = .; 1262bcd521aSSteven Rostedt #else 1272bcd521aSSteven Rostedt #define BRANCH_PROFILE() 1282bcd521aSSteven Rostedt #endif 1292bcd521aSSteven Rostedt 130376e2424SMasami Hiramatsu #ifdef CONFIG_KPROBES 13169902c71SVineet Gupta #define KPROBE_BLACKLIST() . = ALIGN(8); \ 13269902c71SVineet Gupta VMLINUX_SYMBOL(__start_kprobe_blacklist) = .; \ 1334b89b7f7SNicholas Piggin KEEP(*(_kprobe_blacklist)) \ 134376e2424SMasami Hiramatsu VMLINUX_SYMBOL(__stop_kprobe_blacklist) = .; 135376e2424SMasami Hiramatsu #else 136376e2424SMasami Hiramatsu #define KPROBE_BLACKLIST() 137376e2424SMasami Hiramatsu #endif 138376e2424SMasami Hiramatsu 139540adea3SMasami Hiramatsu #ifdef CONFIG_FUNCTION_ERROR_INJECTION 140540adea3SMasami Hiramatsu #define ERROR_INJECT_WHITELIST() . = ALIGN(8); \ 141540adea3SMasami Hiramatsu VMLINUX_SYMBOL(__start_error_injection_whitelist) = .;\ 142540adea3SMasami Hiramatsu KEEP(*(_error_injection_whitelist)) \ 143540adea3SMasami Hiramatsu VMLINUX_SYMBOL(__stop_error_injection_whitelist) = .; 14492ace999SJosef Bacik #else 145540adea3SMasami Hiramatsu #define ERROR_INJECT_WHITELIST() 14692ace999SJosef Bacik #endif 14792ace999SJosef Bacik 1485f77a88bSTom Zanussi #ifdef CONFIG_EVENT_TRACING 149e4a9ea5eSSteven Rostedt #define FTRACE_EVENTS() . = ALIGN(8); \ 150e4a9ea5eSSteven Rostedt VMLINUX_SYMBOL(__start_ftrace_events) = .; \ 1514b89b7f7SNicholas Piggin KEEP(*(_ftrace_events)) \ 1520c564a53SSteven Rostedt (Red Hat) VMLINUX_SYMBOL(__stop_ftrace_events) = .; \ 15302fd7f68SJeremy Linton VMLINUX_SYMBOL(__start_ftrace_eval_maps) = .; \ 15402fd7f68SJeremy Linton KEEP(*(_ftrace_eval_map)) \ 15502fd7f68SJeremy Linton VMLINUX_SYMBOL(__stop_ftrace_eval_maps) = .; 156b77e38aaSSteven Rostedt #else 157b77e38aaSSteven Rostedt #define FTRACE_EVENTS() 158b77e38aaSSteven Rostedt #endif 159b77e38aaSSteven Rostedt 1601ba28e02SLai Jiangshan #ifdef CONFIG_TRACING 1611ba28e02SLai Jiangshan #define TRACE_PRINTKS() VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .; \ 1624b89b7f7SNicholas Piggin KEEP(*(__trace_printk_fmt)) /* Trace_printk fmt' pointer */ \ 1631ba28e02SLai Jiangshan VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .; 164102c9323SSteven Rostedt (Red Hat) #define TRACEPOINT_STR() VMLINUX_SYMBOL(__start___tracepoint_str) = .; \ 1654b89b7f7SNicholas Piggin KEEP(*(__tracepoint_str)) /* Trace_printk fmt' pointer */ \ 166102c9323SSteven Rostedt (Red Hat) VMLINUX_SYMBOL(__stop___tracepoint_str) = .; 1671ba28e02SLai Jiangshan #else 1681ba28e02SLai Jiangshan #define TRACE_PRINTKS() 169102c9323SSteven Rostedt (Red Hat) #define TRACEPOINT_STR() 1701ba28e02SLai Jiangshan #endif 1711ba28e02SLai Jiangshan 172bed1ffcaSFrederic Weisbecker #ifdef CONFIG_FTRACE_SYSCALLS 1733d56e331SSteven Rostedt #define TRACE_SYSCALLS() . = ALIGN(8); \ 1743d56e331SSteven Rostedt VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \ 1754b89b7f7SNicholas Piggin KEEP(*(__syscalls_metadata)) \ 176bed1ffcaSFrederic Weisbecker VMLINUX_SYMBOL(__stop_syscalls_metadata) = .; 177bed1ffcaSFrederic Weisbecker #else 178bed1ffcaSFrederic Weisbecker #define TRACE_SYSCALLS() 179bed1ffcaSFrederic Weisbecker #endif 180bed1ffcaSFrederic Weisbecker 181470ca0deSPeter Hurley #ifdef CONFIG_SERIAL_EARLYCON 18299492c39SPeter Hurley #define EARLYCON_TABLE() STRUCT_ALIGN(); \ 183470ca0deSPeter Hurley VMLINUX_SYMBOL(__earlycon_table) = .; \ 1844b89b7f7SNicholas Piggin KEEP(*(__earlycon_table)) \ 1852eaa7909SPeter Hurley VMLINUX_SYMBOL(__earlycon_table_end) = .; 186470ca0deSPeter Hurley #else 187470ca0deSPeter Hurley #define EARLYCON_TABLE() 188470ca0deSPeter Hurley #endif 189aab94339SDirk Brandewie 19006309288SRob Herring #define ___OF_TABLE(cfg, name) _OF_TABLE_##cfg(name) 19106309288SRob Herring #define __OF_TABLE(cfg, name) ___OF_TABLE(cfg, name) 1925ee02af1SMasahiro Yamada #define OF_TABLE(cfg, name) __OF_TABLE(IS_ENABLED(cfg), name) 19306309288SRob Herring #define _OF_TABLE_0(name) 19406309288SRob Herring #define _OF_TABLE_1(name) \ 195f6e916b8SThomas Petazzoni . = ALIGN(8); \ 19606309288SRob Herring VMLINUX_SYMBOL(__##name##_of_table) = .; \ 1974b89b7f7SNicholas Piggin KEEP(*(__##name##_of_table)) \ 1984b89b7f7SNicholas Piggin KEEP(*(__##name##_of_table_end)) 199aab94339SDirk Brandewie 200bb0eb050SDaniel Lezcano #define TIMER_OF_TABLES() OF_TABLE(CONFIG_TIMER_OF, timer) 20106309288SRob Herring #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip) 20206309288SRob Herring #define CLK_OF_TABLES() OF_TABLE(CONFIG_COMMON_CLK, clk) 2031cd076bfSWill Deacon #define IOMMU_OF_TABLES() OF_TABLE(CONFIG_OF_IOMMU, iommu) 20406309288SRob Herring #define RESERVEDMEM_OF_TABLES() OF_TABLE(CONFIG_OF_RESERVED_MEM, reservedmem) 20506309288SRob Herring #define CPU_METHOD_OF_TABLES() OF_TABLE(CONFIG_SMP, cpu_method) 206449e056cSDaniel Lezcano #define CPUIDLE_METHOD_OF_TABLES() OF_TABLE(CONFIG_CPU_IDLE, cpuidle_method) 2076c3ff8b1SStephen Boyd 208e647b532SMarc Zyngier #ifdef CONFIG_ACPI 209e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name) \ 210e647b532SMarc Zyngier . = ALIGN(8); \ 211e647b532SMarc Zyngier VMLINUX_SYMBOL(__##name##_acpi_probe_table) = .; \ 2124b89b7f7SNicholas Piggin KEEP(*(__##name##_acpi_probe_table)) \ 213e647b532SMarc Zyngier VMLINUX_SYMBOL(__##name##_acpi_probe_table_end) = .; 214e647b532SMarc Zyngier #else 215e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name) 216e647b532SMarc Zyngier #endif 217e647b532SMarc Zyngier 218aab94339SDirk Brandewie #define KERNEL_DTB() \ 219aab94339SDirk Brandewie STRUCT_ALIGN(); \ 220aab94339SDirk Brandewie VMLINUX_SYMBOL(__dtb_start) = .; \ 2214b89b7f7SNicholas Piggin KEEP(*(.dtb.init.rodata)) \ 222aab94339SDirk Brandewie VMLINUX_SYMBOL(__dtb_end) = .; 223aab94339SDirk Brandewie 224b67067f1SNicholas Piggin /* 225b67067f1SNicholas Piggin * .data section 226b67067f1SNicholas Piggin */ 227ca967258SSam Ravnborg #define DATA_DATA \ 228129f6c48SArnd Bergmann *(.xiptext) \ 229cb87481eSNicholas Piggin *(DATA_MAIN) \ 230312b1485SSam Ravnborg *(.ref.data) \ 231d356c0b6SMike Frysinger *(.data..shared_aligned) /* percpu related */ \ 232eb8f6890SSam Ravnborg MEM_KEEP(init.data) \ 233eb8f6890SSam Ravnborg MEM_KEEP(exit.data) \ 2347ccaba53SJan Beulich *(.data.unlikely) \ 235b1fca27dSAndi Kleen VMLINUX_SYMBOL(__start_once) = .; \ 236b1fca27dSAndi Kleen *(.data.once) \ 237b1fca27dSAndi Kleen VMLINUX_SYMBOL(__end_once) = .; \ 23865498646SMathieu Desnoyers STRUCT_ALIGN(); \ 23997e1c18eSMathieu Desnoyers *(__tracepoints) \ 240e9d376f0SJason Baron /* implement dynamic printk debug */ \ 241e9d376f0SJason Baron . = ALIGN(8); \ 242d430d3d7SJason Baron VMLINUX_SYMBOL(__start___jump_table) = .; \ 2434b89b7f7SNicholas Piggin KEEP(*(__jump_table)) \ 244d430d3d7SJason Baron VMLINUX_SYMBOL(__stop___jump_table) = .; \ 245d430d3d7SJason Baron . = ALIGN(8); \ 246e9d376f0SJason Baron VMLINUX_SYMBOL(__start___verbose) = .; \ 2474b89b7f7SNicholas Piggin KEEP(*(__verbose)) \ 248e9d376f0SJason Baron VMLINUX_SYMBOL(__stop___verbose) = .; \ 2492bcd521aSSteven Rostedt LIKELY_PROFILE() \ 250b77e38aaSSteven Rostedt BRANCH_PROFILE() \ 251102c9323SSteven Rostedt (Red Hat) TRACE_PRINTKS() \ 252102c9323SSteven Rostedt (Red Hat) TRACEPOINT_STR() 253ca967258SSam Ravnborg 254ef53dae8SSam Ravnborg /* 255ef53dae8SSam Ravnborg * Data section helpers 256ef53dae8SSam Ravnborg */ 257ef53dae8SSam Ravnborg #define NOSAVE_DATA \ 258ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 259ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__nosave_begin) = .; \ 26007b3bb1eSDenys Vlasenko *(.data..nosave) \ 261ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 262ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__nosave_end) = .; 263ef53dae8SSam Ravnborg 264ef53dae8SSam Ravnborg #define PAGE_ALIGNED_DATA(page_align) \ 265ef53dae8SSam Ravnborg . = ALIGN(page_align); \ 26675b13483STim Abbott *(.data..page_aligned) 267ef53dae8SSam Ravnborg 268ef53dae8SSam Ravnborg #define READ_MOSTLY_DATA(align) \ 269ef53dae8SSam Ravnborg . = ALIGN(align); \ 2708369744fSShaohua Li *(.data..read_mostly) \ 2718369744fSShaohua Li . = ALIGN(align); 272ef53dae8SSam Ravnborg 273ef53dae8SSam Ravnborg #define CACHELINE_ALIGNED_DATA(align) \ 274ef53dae8SSam Ravnborg . = ALIGN(align); \ 2754af57b78STim Abbott *(.data..cacheline_aligned) 276ef53dae8SSam Ravnborg 27739a449d9STim Abbott #define INIT_TASK_DATA(align) \ 278ef53dae8SSam Ravnborg . = ALIGN(align); \ 27991ed140dSBorislav Petkov VMLINUX_SYMBOL(__start_init_task) = .; \ 28091ed140dSBorislav Petkov *(.data..init_task) \ 28191ed140dSBorislav Petkov VMLINUX_SYMBOL(__end_init_task) = .; 282ef53dae8SSam Ravnborg 283ef53dae8SSam Ravnborg /* 28432fb2fc5SHeiko Carstens * Allow architectures to handle ro_after_init data on their 28532fb2fc5SHeiko Carstens * own by defining an empty RO_AFTER_INIT_DATA. 28632fb2fc5SHeiko Carstens */ 28732fb2fc5SHeiko Carstens #ifndef RO_AFTER_INIT_DATA 288d7c19b06SJakub Kicinski #define RO_AFTER_INIT_DATA \ 289d79bf21eSJessica Yu VMLINUX_SYMBOL(__start_ro_after_init) = .; \ 290d7c19b06SJakub Kicinski *(.data..ro_after_init) \ 291d79bf21eSJessica Yu VMLINUX_SYMBOL(__end_ro_after_init) = .; 29232fb2fc5SHeiko Carstens #endif 29332fb2fc5SHeiko Carstens 29432fb2fc5SHeiko Carstens /* 295ef53dae8SSam Ravnborg * Read only Data 296ef53dae8SSam Ravnborg */ 297ef53dae8SSam Ravnborg #define RO_DATA_SECTION(align) \ 2984096b46fSSam Ravnborg . = ALIGN((align)); \ 2991da177e4SLinus Torvalds .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ 3006569580dSVivek Goyal VMLINUX_SYMBOL(__start_rodata) = .; \ 3011da177e4SLinus Torvalds *(.rodata) *(.rodata.*) \ 30232fb2fc5SHeiko Carstens RO_AFTER_INIT_DATA /* Read only after init */ \ 3034b89b7f7SNicholas Piggin KEEP(*(__vermagic)) /* Kernel version magic */ \ 30465498646SMathieu Desnoyers . = ALIGN(8); \ 30565498646SMathieu Desnoyers VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .; \ 3064b89b7f7SNicholas Piggin KEEP(*(__tracepoints_ptrs)) /* Tracepoints: pointer array */ \ 30765498646SMathieu Desnoyers VMLINUX_SYMBOL(__stop___tracepoints_ptrs) = .; \ 30897e1c18eSMathieu Desnoyers *(__tracepoints_strings)/* Tracepoints: strings */ \ 3091da177e4SLinus Torvalds } \ 3101da177e4SLinus Torvalds \ 3111da177e4SLinus Torvalds .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \ 3121da177e4SLinus Torvalds *(.rodata1) \ 3131da177e4SLinus Torvalds } \ 3141da177e4SLinus Torvalds \ 3151da177e4SLinus Torvalds /* PCI quirks */ \ 3161da177e4SLinus Torvalds .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ 3171da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \ 3184b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_early)) \ 3191da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_early) = .; \ 3201da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_header) = .; \ 3214b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_header)) \ 3221da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_header) = .; \ 3231da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_final) = .; \ 3244b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_final)) \ 3251da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_final) = .; \ 3261da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_enable) = .; \ 3274b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_enable)) \ 3281da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_enable) = .; \ 3291597cacbSAlan Cox VMLINUX_SYMBOL(__start_pci_fixups_resume) = .; \ 3304b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_resume)) \ 3311597cacbSAlan Cox VMLINUX_SYMBOL(__end_pci_fixups_resume) = .; \ 332e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .; \ 3334b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_resume_early)) \ 334e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .; \ 335e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .; \ 3364b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_suspend)) \ 337e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .; \ 3387d2a01b8SAndreas Noever VMLINUX_SYMBOL(__start_pci_fixups_suspend_late) = .; \ 3394b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_suspend_late)) \ 3407d2a01b8SAndreas Noever VMLINUX_SYMBOL(__end_pci_fixups_suspend_late) = .; \ 3411da177e4SLinus Torvalds } \ 3421da177e4SLinus Torvalds \ 3435658c769SDavid Woodhouse /* Built-in firmware blobs */ \ 3445658c769SDavid Woodhouse .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \ 3455658c769SDavid Woodhouse VMLINUX_SYMBOL(__start_builtin_fw) = .; \ 3464b89b7f7SNicholas Piggin KEEP(*(.builtin_fw)) \ 3475658c769SDavid Woodhouse VMLINUX_SYMBOL(__end_builtin_fw) = .; \ 3485658c769SDavid Woodhouse } \ 3495658c769SDavid Woodhouse \ 35063687a52SJan Beulich TRACEDATA \ 35163687a52SJan Beulich \ 3521da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 3531da177e4SLinus Torvalds __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ 3541da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___ksymtab) = .; \ 355b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab+*))) \ 3561da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___ksymtab) = .; \ 3571da177e4SLinus Torvalds } \ 3581da177e4SLinus Torvalds \ 3591da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 3601da177e4SLinus Torvalds __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ 3611da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \ 362b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_gpl+*))) \ 3631da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \ 3641da177e4SLinus Torvalds } \ 3651da177e4SLinus Torvalds \ 366f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 367f71d20e9SArjan van de Ven __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ 368f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \ 369b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_unused+*))) \ 370f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \ 371f71d20e9SArjan van de Ven } \ 372f71d20e9SArjan van de Ven \ 373f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 374f71d20e9SArjan van de Ven __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ 375f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \ 376b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_unused_gpl+*))) \ 377f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \ 378f71d20e9SArjan van de Ven } \ 379f71d20e9SArjan van de Ven \ 3809f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 3819f28bb7eSGreg Kroah-Hartman __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ 3829f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \ 383b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_gpl_future+*))) \ 3849f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \ 3859f28bb7eSGreg Kroah-Hartman } \ 3869f28bb7eSGreg Kroah-Hartman \ 3871da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 3881da177e4SLinus Torvalds __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ 3891da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___kcrctab) = .; \ 390b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab+*))) \ 3911da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___kcrctab) = .; \ 3921da177e4SLinus Torvalds } \ 3931da177e4SLinus Torvalds \ 3941da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 3951da177e4SLinus Torvalds __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ 3961da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___kcrctab_gpl) = .; \ 397b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_gpl+*))) \ 3981da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \ 3991da177e4SLinus Torvalds } \ 4001da177e4SLinus Torvalds \ 401f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 402f71d20e9SArjan van de Ven __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \ 403f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___kcrctab_unused) = .; \ 404b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_unused+*))) \ 405f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___kcrctab_unused) = .; \ 406f71d20e9SArjan van de Ven } \ 407f71d20e9SArjan van de Ven \ 408f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 409f71d20e9SArjan van de Ven __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ 410f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \ 411b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_unused_gpl+*))) \ 412f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .; \ 413f71d20e9SArjan van de Ven } \ 414f71d20e9SArjan van de Ven \ 4159f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 4169f28bb7eSGreg Kroah-Hartman __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ 4179f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \ 418b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_gpl_future+*))) \ 4199f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \ 4209f28bb7eSGreg Kroah-Hartman } \ 4219f28bb7eSGreg Kroah-Hartman \ 4221da177e4SLinus Torvalds /* Kernel symbol table: strings */ \ 4231da177e4SLinus Torvalds __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ 4244b89b7f7SNicholas Piggin *(__ksymtab_strings) \ 4251da177e4SLinus Torvalds } \ 4261da177e4SLinus Torvalds \ 427eb8f6890SSam Ravnborg /* __*init sections */ \ 428eb8f6890SSam Ravnborg __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) { \ 429312b1485SSam Ravnborg *(.ref.rodata) \ 430eb8f6890SSam Ravnborg MEM_KEEP(init.rodata) \ 431eb8f6890SSam Ravnborg MEM_KEEP(exit.rodata) \ 432eb8f6890SSam Ravnborg } \ 433eb8f6890SSam Ravnborg \ 4341da177e4SLinus Torvalds /* Built-in module parameters. */ \ 4351da177e4SLinus Torvalds __param : AT(ADDR(__param) - LOAD_OFFSET) { \ 4361da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___param) = .; \ 4374b89b7f7SNicholas Piggin KEEP(*(__param)) \ 4381da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___param) = .; \ 439e94965edSDmitry Torokhov } \ 440e94965edSDmitry Torokhov \ 441e94965edSDmitry Torokhov /* Built-in module versions. */ \ 442e94965edSDmitry Torokhov __modver : AT(ADDR(__modver) - LOAD_OFFSET) { \ 443e94965edSDmitry Torokhov VMLINUX_SYMBOL(__start___modver) = .; \ 4444b89b7f7SNicholas Piggin KEEP(*(__modver)) \ 445e94965edSDmitry Torokhov VMLINUX_SYMBOL(__stop___modver) = .; \ 446edeed305SArjan van de Ven . = ALIGN((align)); \ 4476569580dSVivek Goyal VMLINUX_SYMBOL(__end_rodata) = .; \ 4487583ddfdSMarcelo Tosatti } \ 4494096b46fSSam Ravnborg . = ALIGN((align)); 4504096b46fSSam Ravnborg 451ef53dae8SSam Ravnborg /* RODATA & RO_DATA provided for backward compatibility. 4524096b46fSSam Ravnborg * All archs are supposed to use RO_DATA() */ 453ef53dae8SSam Ravnborg #define RODATA RO_DATA_SECTION(4096) 454ef53dae8SSam Ravnborg #define RO_DATA(align) RO_DATA_SECTION(align) 4551da177e4SLinus Torvalds 4561da177e4SLinus Torvalds #define SECURITY_INIT \ 45760bad7faSEric W. Biederman .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \ 4581da177e4SLinus Torvalds VMLINUX_SYMBOL(__security_initcall_start) = .; \ 459b67067f1SNicholas Piggin KEEP(*(.security_initcall.init)) \ 4601da177e4SLinus Torvalds VMLINUX_SYMBOL(__security_initcall_end) = .; \ 4611da177e4SLinus Torvalds } 4621da177e4SLinus Torvalds 463cb87481eSNicholas Piggin /* 464cb87481eSNicholas Piggin * .text section. Map to function alignment to avoid address changes 4650f4c4af0SNicholas Piggin * during second ld run in second ld pass when generating System.map 466cb87481eSNicholas Piggin * 467cb87481eSNicholas Piggin * TEXT_MAIN here will match .text.fixup and .text.unlikely if dead 468cb87481eSNicholas Piggin * code elimination is enabled, so these sections should be converted 469cb87481eSNicholas Piggin * to use ".." first. 470cb87481eSNicholas Piggin */ 4717664709bSSam Ravnborg #define TEXT_TEXT \ 4727664709bSSam Ravnborg ALIGN_FUNCTION(); \ 473cb87481eSNicholas Piggin *(.text.hot TEXT_MAIN .text.fixup .text.unlikely) \ 474564c9cc8SKees Cook *(.text..refcount) \ 475312b1485SSam Ravnborg *(.ref.text) \ 476eb8f6890SSam Ravnborg MEM_KEEP(init.text) \ 477fb5e2b37SJan Beulich MEM_KEEP(exit.text) \ 478eb8f6890SSam Ravnborg 4797664709bSSam Ravnborg 4806d30e3a8SSam Ravnborg /* sched.text is aling to function alignment to secure we have same 4816d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 4821da177e4SLinus Torvalds #define SCHED_TEXT \ 4836d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 4841da177e4SLinus Torvalds VMLINUX_SYMBOL(__sched_text_start) = .; \ 4851da177e4SLinus Torvalds *(.sched.text) \ 4861da177e4SLinus Torvalds VMLINUX_SYMBOL(__sched_text_end) = .; 4871da177e4SLinus Torvalds 4886d30e3a8SSam Ravnborg /* spinlock.text is aling to function alignment to secure we have same 4896d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 4901da177e4SLinus Torvalds #define LOCK_TEXT \ 4916d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 4921da177e4SLinus Torvalds VMLINUX_SYMBOL(__lock_text_start) = .; \ 4931da177e4SLinus Torvalds *(.spinlock.text) \ 4941da177e4SLinus Torvalds VMLINUX_SYMBOL(__lock_text_end) = .; 495d0aaff97SPrasanna S Panchamukhi 4966727ad9eSChris Metcalf #define CPUIDLE_TEXT \ 4976727ad9eSChris Metcalf ALIGN_FUNCTION(); \ 4986727ad9eSChris Metcalf VMLINUX_SYMBOL(__cpuidle_text_start) = .; \ 4996727ad9eSChris Metcalf *(.cpuidle.text) \ 5006727ad9eSChris Metcalf VMLINUX_SYMBOL(__cpuidle_text_end) = .; 5016727ad9eSChris Metcalf 502d0aaff97SPrasanna S Panchamukhi #define KPROBES_TEXT \ 503d0aaff97SPrasanna S Panchamukhi ALIGN_FUNCTION(); \ 504d0aaff97SPrasanna S Panchamukhi VMLINUX_SYMBOL(__kprobes_text_start) = .; \ 505d0aaff97SPrasanna S Panchamukhi *(.kprobes.text) \ 506d0aaff97SPrasanna S Panchamukhi VMLINUX_SYMBOL(__kprobes_text_end) = .; 507a7d0c210SPaolo 'Blaisorblade' Giarrusso 508ea714547SJiri Olsa #define ENTRY_TEXT \ 509ea714547SJiri Olsa ALIGN_FUNCTION(); \ 510ea714547SJiri Olsa VMLINUX_SYMBOL(__entry_text_start) = .; \ 511ea714547SJiri Olsa *(.entry.text) \ 512ea714547SJiri Olsa VMLINUX_SYMBOL(__entry_text_end) = .; 513ea714547SJiri Olsa 514a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT \ 515a0343e82SFrederic Weisbecker ALIGN_FUNCTION(); \ 516a0343e82SFrederic Weisbecker VMLINUX_SYMBOL(__irqentry_text_start) = .; \ 517a0343e82SFrederic Weisbecker *(.irqentry.text) \ 518a0343e82SFrederic Weisbecker VMLINUX_SYMBOL(__irqentry_text_end) = .; 519a0343e82SFrederic Weisbecker 520be7635e7SAlexander Potapenko #define SOFTIRQENTRY_TEXT \ 521be7635e7SAlexander Potapenko ALIGN_FUNCTION(); \ 522be7635e7SAlexander Potapenko VMLINUX_SYMBOL(__softirqentry_text_start) = .; \ 523be7635e7SAlexander Potapenko *(.softirqentry.text) \ 524be7635e7SAlexander Potapenko VMLINUX_SYMBOL(__softirqentry_text_end) = .; 525be7635e7SAlexander Potapenko 52637c514e3SSam Ravnborg /* Section used for early init (in .S files) */ 5277923f90fSSam Ravnborg #define HEAD_TEXT *(.head.text) 52837c514e3SSam Ravnborg 5297923f90fSSam Ravnborg #define HEAD_TEXT_SECTION \ 530ef53dae8SSam Ravnborg .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) { \ 531ef53dae8SSam Ravnborg HEAD_TEXT \ 532ef53dae8SSam Ravnborg } 533ef53dae8SSam Ravnborg 534ef53dae8SSam Ravnborg /* 535ef53dae8SSam Ravnborg * Exception table 536ef53dae8SSam Ravnborg */ 537ef53dae8SSam Ravnborg #define EXCEPTION_TABLE(align) \ 538ef53dae8SSam Ravnborg . = ALIGN(align); \ 539ef53dae8SSam Ravnborg __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \ 540ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__start___ex_table) = .; \ 5414b89b7f7SNicholas Piggin KEEP(*(__ex_table)) \ 542ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__stop___ex_table) = .; \ 543ef53dae8SSam Ravnborg } 544ef53dae8SSam Ravnborg 545ef53dae8SSam Ravnborg /* 546ef53dae8SSam Ravnborg * Init task 547ef53dae8SSam Ravnborg */ 54839a449d9STim Abbott #define INIT_TASK_DATA_SECTION(align) \ 549ef53dae8SSam Ravnborg . = ALIGN(align); \ 550da5e37efSSam Ravnborg .data..init_task : AT(ADDR(.data..init_task) - LOAD_OFFSET) { \ 55139a449d9STim Abbott INIT_TASK_DATA(align) \ 552ef53dae8SSam Ravnborg } 553eb8f6890SSam Ravnborg 554b99b87f7SPeter Oberparleiter #ifdef CONFIG_CONSTRUCTORS 5552a2325e6SHeiko Carstens #define KERNEL_CTORS() . = ALIGN(8); \ 5562a2325e6SHeiko Carstens VMLINUX_SYMBOL(__ctors_start) = .; \ 5574b89b7f7SNicholas Piggin KEEP(*(.ctors)) \ 5584b89b7f7SNicholas Piggin KEEP(*(SORT(.init_array.*))) \ 5594b89b7f7SNicholas Piggin KEEP(*(.init_array)) \ 560b99b87f7SPeter Oberparleiter VMLINUX_SYMBOL(__ctors_end) = .; 561b99b87f7SPeter Oberparleiter #else 562b99b87f7SPeter Oberparleiter #define KERNEL_CTORS() 563b99b87f7SPeter Oberparleiter #endif 564b99b87f7SPeter Oberparleiter 56501ba2bdcSSam Ravnborg /* init and exit section handling */ 566eb8f6890SSam Ravnborg #define INIT_DATA \ 567b67067f1SNicholas Piggin KEEP(*(SORT(___kentry+*))) \ 568eb8f6890SSam Ravnborg *(.init.data) \ 569eb8f6890SSam Ravnborg MEM_DISCARD(init.data) \ 570b99b87f7SPeter Oberparleiter KERNEL_CTORS() \ 5714b3b4c5eSJohn Reiser MCOUNT_REC() \ 5729fd49328SSteven Rostedt *(.init.rodata) \ 573e4a9ea5eSSteven Rostedt FTRACE_EVENTS() \ 5743d56e331SSteven Rostedt TRACE_SYSCALLS() \ 575376e2424SMasami Hiramatsu KPROBE_BLACKLIST() \ 576540adea3SMasami Hiramatsu ERROR_INJECT_WHITELIST() \ 577aab94339SDirk Brandewie MEM_DISCARD(init.rodata) \ 578f2f6c255SPrashant Gaikwad CLK_OF_TABLES() \ 579f618c470SMarek Szyprowski RESERVEDMEM_OF_TABLES() \ 5802fcc112aSDaniel Lezcano TIMER_OF_TABLES() \ 5811cd076bfSWill Deacon IOMMU_OF_TABLES() \ 5826c3ff8b1SStephen Boyd CPU_METHOD_OF_TABLES() \ 583449e056cSDaniel Lezcano CPUIDLE_METHOD_OF_TABLES() \ 584f6e916b8SThomas Petazzoni KERNEL_DTB() \ 585b0b6abd3SRob Herring IRQCHIP_OF_MATCH_TABLE() \ 58646e589a3SMarc Zyngier ACPI_PROBE_TABLE(irqchip) \ 5872fcc112aSDaniel Lezcano ACPI_PROBE_TABLE(timer) \ 5882fcc112aSDaniel Lezcano ACPI_PROBE_TABLE(iort) \ 5892eaa7909SPeter Hurley EARLYCON_TABLE() 59001ba2bdcSSam Ravnborg 591eb8f6890SSam Ravnborg #define INIT_TEXT \ 592eb8f6890SSam Ravnborg *(.init.text) \ 593e41f501dSDmitry Vyukov *(.text.startup) \ 594eb8f6890SSam Ravnborg MEM_DISCARD(init.text) 595eb8f6890SSam Ravnborg 596eb8f6890SSam Ravnborg #define EXIT_DATA \ 597eb8f6890SSam Ravnborg *(.exit.data) \ 598e41f501dSDmitry Vyukov *(.fini_array) \ 599e41f501dSDmitry Vyukov *(.dtors) \ 600eb8f6890SSam Ravnborg MEM_DISCARD(exit.data) \ 601eb8f6890SSam Ravnborg MEM_DISCARD(exit.rodata) 602eb8f6890SSam Ravnborg 603eb8f6890SSam Ravnborg #define EXIT_TEXT \ 604eb8f6890SSam Ravnborg *(.exit.text) \ 605e41f501dSDmitry Vyukov *(.text.exit) \ 606eb8f6890SSam Ravnborg MEM_DISCARD(exit.text) 60701ba2bdcSSam Ravnborg 6087923f90fSSam Ravnborg #define EXIT_CALL \ 6097923f90fSSam Ravnborg *(.exitcall.exit) 6107923f90fSSam Ravnborg 611ef53dae8SSam Ravnborg /* 612ef53dae8SSam Ravnborg * bss (Block Started by Symbol) - uninitialized data 613ef53dae8SSam Ravnborg * zeroed during startup 614ef53dae8SSam Ravnborg */ 61504e448d9STim Abbott #define SBSS(sbss_align) \ 61604e448d9STim Abbott . = ALIGN(sbss_align); \ 617ef53dae8SSam Ravnborg .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \ 61883a092cfSNicholas Piggin *(.dynsbss) \ 619ef53dae8SSam Ravnborg *(.sbss) \ 620ef53dae8SSam Ravnborg *(.scommon) \ 621ef53dae8SSam Ravnborg } 622ef53dae8SSam Ravnborg 623c87728caSDavid Daney /* 624c87728caSDavid Daney * Allow archectures to redefine BSS_FIRST_SECTIONS to add extra 625c87728caSDavid Daney * sections to the front of bss. 626c87728caSDavid Daney */ 627c87728caSDavid Daney #ifndef BSS_FIRST_SECTIONS 628c87728caSDavid Daney #define BSS_FIRST_SECTIONS 629c87728caSDavid Daney #endif 630c87728caSDavid Daney 631ef53dae8SSam Ravnborg #define BSS(bss_align) \ 632ef53dae8SSam Ravnborg . = ALIGN(bss_align); \ 633ef53dae8SSam Ravnborg .bss : AT(ADDR(.bss) - LOAD_OFFSET) { \ 634c87728caSDavid Daney BSS_FIRST_SECTIONS \ 6357c74df07STim Abbott *(.bss..page_aligned) \ 636ef53dae8SSam Ravnborg *(.dynbss) \ 637cb87481eSNicholas Piggin *(BSS_MAIN) \ 638ef53dae8SSam Ravnborg *(COMMON) \ 639ef53dae8SSam Ravnborg } 640ef53dae8SSam Ravnborg 641ef53dae8SSam Ravnborg /* 642ef53dae8SSam Ravnborg * DWARF debug sections. 643ef53dae8SSam Ravnborg * Symbols in the DWARF debugging sections are relative to 644ef53dae8SSam Ravnborg * the beginning of the section so we begin them at 0. 645ef53dae8SSam Ravnborg */ 646a7d0c210SPaolo 'Blaisorblade' Giarrusso #define DWARF_DEBUG \ 647a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1 */ \ 648a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug 0 : { *(.debug) } \ 649a7d0c210SPaolo 'Blaisorblade' Giarrusso .line 0 : { *(.line) } \ 650a7d0c210SPaolo 'Blaisorblade' Giarrusso /* GNU DWARF 1 extensions */ \ 651a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_srcinfo 0 : { *(.debug_srcinfo) } \ 652a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_sfnames 0 : { *(.debug_sfnames) } \ 653a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1.1 and DWARF 2 */ \ 654a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_aranges 0 : { *(.debug_aranges) } \ 655a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_pubnames 0 : { *(.debug_pubnames) } \ 656a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 2 */ \ 657a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_info 0 : { *(.debug_info \ 658a7d0c210SPaolo 'Blaisorblade' Giarrusso .gnu.linkonce.wi.*) } \ 659a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_abbrev 0 : { *(.debug_abbrev) } \ 660a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_line 0 : { *(.debug_line) } \ 661a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_frame 0 : { *(.debug_frame) } \ 662a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_str 0 : { *(.debug_str) } \ 663a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_loc 0 : { *(.debug_loc) } \ 664a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_macinfo 0 : { *(.debug_macinfo) } \ 66583a092cfSNicholas Piggin .debug_pubtypes 0 : { *(.debug_pubtypes) } \ 66683a092cfSNicholas Piggin /* DWARF 3 */ \ 66783a092cfSNicholas Piggin .debug_ranges 0 : { *(.debug_ranges) } \ 668a7d0c210SPaolo 'Blaisorblade' Giarrusso /* SGI/MIPS DWARF 2 extensions */ \ 669a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_weaknames 0 : { *(.debug_weaknames) } \ 670a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_funcnames 0 : { *(.debug_funcnames) } \ 671a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_typenames 0 : { *(.debug_typenames) } \ 672a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_varnames 0 : { *(.debug_varnames) } \ 67383a092cfSNicholas Piggin /* GNU DWARF 2 extensions */ \ 67483a092cfSNicholas Piggin .debug_gnu_pubnames 0 : { *(.debug_gnu_pubnames) } \ 67583a092cfSNicholas Piggin .debug_gnu_pubtypes 0 : { *(.debug_gnu_pubtypes) } \ 67683a092cfSNicholas Piggin /* DWARF 4 */ \ 67783a092cfSNicholas Piggin .debug_types 0 : { *(.debug_types) } \ 67883a092cfSNicholas Piggin /* DWARF 5 */ \ 67983a092cfSNicholas Piggin .debug_macro 0 : { *(.debug_macro) } \ 68083a092cfSNicholas Piggin .debug_addr 0 : { *(.debug_addr) } 681a7d0c210SPaolo 'Blaisorblade' Giarrusso 682a7d0c210SPaolo 'Blaisorblade' Giarrusso /* Stabs debugging sections. */ 683a7d0c210SPaolo 'Blaisorblade' Giarrusso #define STABS_DEBUG \ 684a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab 0 : { *(.stab) } \ 685a7d0c210SPaolo 'Blaisorblade' Giarrusso .stabstr 0 : { *(.stabstr) } \ 686a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.excl 0 : { *(.stab.excl) } \ 687a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.exclstr 0 : { *(.stab.exclstr) } \ 688a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.index 0 : { *(.stab.index) } \ 689a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.indexstr 0 : { *(.stab.indexstr) } \ 690a7d0c210SPaolo 'Blaisorblade' Giarrusso .comment 0 : { *(.comment) } 6919c9b8b38SJeremy Fitzhardinge 6926360b1fbSJan Beulich #ifdef CONFIG_GENERIC_BUG 6937664c5a1SJeremy Fitzhardinge #define BUG_TABLE \ 6947664c5a1SJeremy Fitzhardinge . = ALIGN(8); \ 6957664c5a1SJeremy Fitzhardinge __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \ 696c6de0026SYoshinori Sato VMLINUX_SYMBOL(__start___bug_table) = .; \ 6974b89b7f7SNicholas Piggin KEEP(*(__bug_table)) \ 698c6de0026SYoshinori Sato VMLINUX_SYMBOL(__stop___bug_table) = .; \ 6997664c5a1SJeremy Fitzhardinge } 7006360b1fbSJan Beulich #else 7016360b1fbSJan Beulich #define BUG_TABLE 7026360b1fbSJan Beulich #endif 7037664c5a1SJeremy Fitzhardinge 70411af8474SJosh Poimboeuf #ifdef CONFIG_UNWINDER_ORC 705ee9f8fceSJosh Poimboeuf #define ORC_UNWIND_TABLE \ 706ee9f8fceSJosh Poimboeuf . = ALIGN(4); \ 707ee9f8fceSJosh Poimboeuf .orc_unwind_ip : AT(ADDR(.orc_unwind_ip) - LOAD_OFFSET) { \ 708ee9f8fceSJosh Poimboeuf VMLINUX_SYMBOL(__start_orc_unwind_ip) = .; \ 709ee9f8fceSJosh Poimboeuf KEEP(*(.orc_unwind_ip)) \ 710ee9f8fceSJosh Poimboeuf VMLINUX_SYMBOL(__stop_orc_unwind_ip) = .; \ 711ee9f8fceSJosh Poimboeuf } \ 712ee9f8fceSJosh Poimboeuf . = ALIGN(6); \ 713ee9f8fceSJosh Poimboeuf .orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) { \ 714ee9f8fceSJosh Poimboeuf VMLINUX_SYMBOL(__start_orc_unwind) = .; \ 715ee9f8fceSJosh Poimboeuf KEEP(*(.orc_unwind)) \ 716ee9f8fceSJosh Poimboeuf VMLINUX_SYMBOL(__stop_orc_unwind) = .; \ 717ee9f8fceSJosh Poimboeuf } \ 718ee9f8fceSJosh Poimboeuf . = ALIGN(4); \ 719ee9f8fceSJosh Poimboeuf .orc_lookup : AT(ADDR(.orc_lookup) - LOAD_OFFSET) { \ 720ee9f8fceSJosh Poimboeuf VMLINUX_SYMBOL(orc_lookup) = .; \ 721ee9f8fceSJosh Poimboeuf . += (((SIZEOF(.text) + LOOKUP_BLOCK_SIZE - 1) / \ 722ee9f8fceSJosh Poimboeuf LOOKUP_BLOCK_SIZE) + 1) * 4; \ 723ee9f8fceSJosh Poimboeuf VMLINUX_SYMBOL(orc_lookup_end) = .; \ 724ee9f8fceSJosh Poimboeuf } 725ee9f8fceSJosh Poimboeuf #else 726ee9f8fceSJosh Poimboeuf #define ORC_UNWIND_TABLE 727ee9f8fceSJosh Poimboeuf #endif 728ee9f8fceSJosh Poimboeuf 72963687a52SJan Beulich #ifdef CONFIG_PM_TRACE 73063687a52SJan Beulich #define TRACEDATA \ 73163687a52SJan Beulich . = ALIGN(4); \ 73263687a52SJan Beulich .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \ 733c6de0026SYoshinori Sato VMLINUX_SYMBOL(__tracedata_start) = .; \ 7344b89b7f7SNicholas Piggin KEEP(*(.tracedata)) \ 735c6de0026SYoshinori Sato VMLINUX_SYMBOL(__tracedata_end) = .; \ 73663687a52SJan Beulich } 73763687a52SJan Beulich #else 73863687a52SJan Beulich #define TRACEDATA 73963687a52SJan Beulich #endif 74063687a52SJan Beulich 7419c9b8b38SJeremy Fitzhardinge #define NOTES \ 742cbe87121SRoland McGrath .notes : AT(ADDR(.notes) - LOAD_OFFSET) { \ 743cbe87121SRoland McGrath VMLINUX_SYMBOL(__start_notes) = .; \ 744cbe87121SRoland McGrath *(.note.*) \ 745cbe87121SRoland McGrath VMLINUX_SYMBOL(__stop_notes) = .; \ 746cbe87121SRoland McGrath } 74761ce1efeSAndrew Morton 748ef53dae8SSam Ravnborg #define INIT_SETUP(initsetup_align) \ 749ef53dae8SSam Ravnborg . = ALIGN(initsetup_align); \ 750ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__setup_start) = .; \ 7514b89b7f7SNicholas Piggin KEEP(*(.init.setup)) \ 752ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__setup_end) = .; 753ef53dae8SSam Ravnborg 754026cee00SPawel Moll #define INIT_CALLS_LEVEL(level) \ 755026cee00SPawel Moll VMLINUX_SYMBOL(__initcall##level##_start) = .; \ 756b67067f1SNicholas Piggin KEEP(*(.initcall##level##.init)) \ 757b67067f1SNicholas Piggin KEEP(*(.initcall##level##s.init)) \ 75861ce1efeSAndrew Morton 759ef53dae8SSam Ravnborg #define INIT_CALLS \ 760ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initcall_start) = .; \ 761b67067f1SNicholas Piggin KEEP(*(.initcallearly.init)) \ 762026cee00SPawel Moll INIT_CALLS_LEVEL(0) \ 763026cee00SPawel Moll INIT_CALLS_LEVEL(1) \ 764026cee00SPawel Moll INIT_CALLS_LEVEL(2) \ 765026cee00SPawel Moll INIT_CALLS_LEVEL(3) \ 766026cee00SPawel Moll INIT_CALLS_LEVEL(4) \ 767026cee00SPawel Moll INIT_CALLS_LEVEL(5) \ 768026cee00SPawel Moll INIT_CALLS_LEVEL(rootfs) \ 769026cee00SPawel Moll INIT_CALLS_LEVEL(6) \ 770026cee00SPawel Moll INIT_CALLS_LEVEL(7) \ 771ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initcall_end) = .; 772ef53dae8SSam Ravnborg 773ef53dae8SSam Ravnborg #define CON_INITCALL \ 774ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__con_initcall_start) = .; \ 775b67067f1SNicholas Piggin KEEP(*(.con_initcall.init)) \ 776ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__con_initcall_end) = .; 777ef53dae8SSam Ravnborg 778ef53dae8SSam Ravnborg #define SECURITY_INITCALL \ 779ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__security_initcall_start) = .; \ 780b67067f1SNicholas Piggin KEEP(*(.security_initcall.init)) \ 781ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__security_initcall_end) = .; 782ef53dae8SSam Ravnborg 783ef53dae8SSam Ravnborg #ifdef CONFIG_BLK_DEV_INITRD 784ef53dae8SSam Ravnborg #define INIT_RAM_FS \ 785d8826262SMike Frysinger . = ALIGN(4); \ 786ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initramfs_start) = .; \ 787b67067f1SNicholas Piggin KEEP(*(.init.ramfs)) \ 788ffe8018cSHendrik Brueckner . = ALIGN(8); \ 789b67067f1SNicholas Piggin KEEP(*(.init.ramfs.info)) 790ef53dae8SSam Ravnborg #else 791eadfe219SDavid Howells #define INIT_RAM_FS 792ef53dae8SSam Ravnborg #endif 793ef53dae8SSam Ravnborg 794023bf6f1STejun Heo /* 795ac26963aSBrijesh Singh * Memory encryption operates on a page basis. Since we need to clear 796ac26963aSBrijesh Singh * the memory encryption mask for this section, it needs to be aligned 797ac26963aSBrijesh Singh * on a page boundary and be a page-size multiple in length. 798ac26963aSBrijesh Singh * 799ac26963aSBrijesh Singh * Note: We use a separate section so that only this section gets 800ac26963aSBrijesh Singh * decrypted to avoid exposing more than we wish. 801ac26963aSBrijesh Singh */ 802ac26963aSBrijesh Singh #ifdef CONFIG_AMD_MEM_ENCRYPT 803ac26963aSBrijesh Singh #define PERCPU_DECRYPTED_SECTION \ 804ac26963aSBrijesh Singh . = ALIGN(PAGE_SIZE); \ 805ac26963aSBrijesh Singh *(.data..percpu..decrypted) \ 806ac26963aSBrijesh Singh . = ALIGN(PAGE_SIZE); 807ac26963aSBrijesh Singh #else 808ac26963aSBrijesh Singh #define PERCPU_DECRYPTED_SECTION 809ac26963aSBrijesh Singh #endif 810ac26963aSBrijesh Singh 811ac26963aSBrijesh Singh 812ac26963aSBrijesh Singh /* 813023bf6f1STejun Heo * Default discarded sections. 814023bf6f1STejun Heo * 815023bf6f1STejun Heo * Some archs want to discard exit text/data at runtime rather than 816023bf6f1STejun Heo * link time due to cross-section references such as alt instructions, 817023bf6f1STejun Heo * bug table, eh_frame, etc. DISCARDS must be the last of output 818023bf6f1STejun Heo * section definitions so that such archs put those in earlier section 819023bf6f1STejun Heo * definitions. 820023bf6f1STejun Heo */ 821405d967dSTejun Heo #define DISCARDS \ 822405d967dSTejun Heo /DISCARD/ : { \ 823405d967dSTejun Heo EXIT_TEXT \ 824405d967dSTejun Heo EXIT_DATA \ 825023bf6f1STejun Heo EXIT_CALL \ 826405d967dSTejun Heo *(.discard) \ 827c7f52cdcSJeremy Fitzhardinge *(.discard.*) \ 828405d967dSTejun Heo } 829405d967dSTejun Heo 8303e5d8f97STejun Heo /** 8316ea0c34dSMike Frysinger * PERCPU_INPUT - the percpu input sections 8326ea0c34dSMike Frysinger * @cacheline: cacheline size 8336ea0c34dSMike Frysinger * 8346ea0c34dSMike Frysinger * The core percpu section names and core symbols which do not rely 8356ea0c34dSMike Frysinger * directly upon load addresses. 8366ea0c34dSMike Frysinger * 8376ea0c34dSMike Frysinger * @cacheline is used to align subsections to avoid false cacheline 8386ea0c34dSMike Frysinger * sharing between subsections for different purposes. 8396ea0c34dSMike Frysinger */ 8406ea0c34dSMike Frysinger #define PERCPU_INPUT(cacheline) \ 8416ea0c34dSMike Frysinger VMLINUX_SYMBOL(__per_cpu_start) = .; \ 8426ea0c34dSMike Frysinger *(.data..percpu..first) \ 8436ea0c34dSMike Frysinger . = ALIGN(PAGE_SIZE); \ 8446ea0c34dSMike Frysinger *(.data..percpu..page_aligned) \ 8456ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 846330d2822SZhengyu He *(.data..percpu..read_mostly) \ 8476ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 8486ea0c34dSMike Frysinger *(.data..percpu) \ 8496ea0c34dSMike Frysinger *(.data..percpu..shared_aligned) \ 850ac26963aSBrijesh Singh PERCPU_DECRYPTED_SECTION \ 8516ea0c34dSMike Frysinger VMLINUX_SYMBOL(__per_cpu_end) = .; 8526ea0c34dSMike Frysinger 8536ea0c34dSMike Frysinger /** 8546b7c38d5STejun Heo * PERCPU_VADDR - define output section for percpu area 85519df0c2fSTejun Heo * @cacheline: cacheline size 8563e5d8f97STejun Heo * @vaddr: explicit base address (optional) 8573e5d8f97STejun Heo * @phdr: destination PHDR (optional) 8583e5d8f97STejun Heo * 85919df0c2fSTejun Heo * Macro which expands to output section for percpu area. 86019df0c2fSTejun Heo * 86119df0c2fSTejun Heo * @cacheline is used to align subsections to avoid false cacheline 86219df0c2fSTejun Heo * sharing between subsections for different purposes. 86319df0c2fSTejun Heo * 86419df0c2fSTejun Heo * If @vaddr is not blank, it specifies explicit base address and all 86519df0c2fSTejun Heo * percpu symbols will be offset from the given address. If blank, 86619df0c2fSTejun Heo * @vaddr always equals @laddr + LOAD_OFFSET. 8673e5d8f97STejun Heo * 8683e5d8f97STejun Heo * @phdr defines the output PHDR to use if not blank. Be warned that 8693e5d8f97STejun Heo * output PHDR is sticky. If @phdr is specified, the next output 8703e5d8f97STejun Heo * section in the linker script will go there too. @phdr should have 8713e5d8f97STejun Heo * a leading colon. 8723e5d8f97STejun Heo * 8733ac6cffeSTejun Heo * Note that this macros defines __per_cpu_load as an absolute symbol. 8743ac6cffeSTejun Heo * If there is no need to put the percpu section at a predetermined 8750415b00dSTejun Heo * address, use PERCPU_SECTION. 8763e5d8f97STejun Heo */ 87719df0c2fSTejun Heo #define PERCPU_VADDR(cacheline, vaddr, phdr) \ 878dba3d36bSIngo Molnar VMLINUX_SYMBOL(__per_cpu_load) = .; \ 8793d9a854cSDenys Vlasenko .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ 8806b7c38d5STejun Heo - LOAD_OFFSET) { \ 8816ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 8826b7c38d5STejun Heo } phdr \ 8833d9a854cSDenys Vlasenko . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data..percpu); 8843e5d8f97STejun Heo 8853e5d8f97STejun Heo /** 8860415b00dSTejun Heo * PERCPU_SECTION - define output section for percpu area, simple version 88719df0c2fSTejun Heo * @cacheline: cacheline size 8883e5d8f97STejun Heo * 8890415b00dSTejun Heo * Align to PAGE_SIZE and outputs output section for percpu area. This 8900415b00dSTejun Heo * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and 8913e5d8f97STejun Heo * __per_cpu_start will be identical. 8923ac6cffeSTejun Heo * 8930415b00dSTejun Heo * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,) 89419df0c2fSTejun Heo * except that __per_cpu_load is defined as a relative symbol against 89519df0c2fSTejun Heo * .data..percpu which is required for relocatable x86_32 configuration. 8963e5d8f97STejun Heo */ 8970415b00dSTejun Heo #define PERCPU_SECTION(cacheline) \ 8980415b00dSTejun Heo . = ALIGN(PAGE_SIZE); \ 8993d9a854cSDenys Vlasenko .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ 9003ac6cffeSTejun Heo VMLINUX_SYMBOL(__per_cpu_load) = .; \ 9016ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 9023ac6cffeSTejun Heo } 903ef53dae8SSam Ravnborg 904ef53dae8SSam Ravnborg 905ef53dae8SSam Ravnborg /* 906ef53dae8SSam Ravnborg * Definition of the high level *_SECTION macros 907ef53dae8SSam Ravnborg * They will fit only a subset of the architectures 908ef53dae8SSam Ravnborg */ 909ef53dae8SSam Ravnborg 910ef53dae8SSam Ravnborg 911ef53dae8SSam Ravnborg /* 912ef53dae8SSam Ravnborg * Writeable data. 913ef53dae8SSam Ravnborg * All sections are combined in a single .data section. 914ef53dae8SSam Ravnborg * The sections following CONSTRUCTORS are arranged so their 915ef53dae8SSam Ravnborg * typical alignment matches. 916ef53dae8SSam Ravnborg * A cacheline is typical/always less than a PAGE_SIZE so 917ef53dae8SSam Ravnborg * the sections that has this restriction (or similar) 918ef53dae8SSam Ravnborg * is located before the ones requiring PAGE_SIZE alignment. 919ef53dae8SSam Ravnborg * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which 92025985edcSLucas De Marchi * matches the requirement of PAGE_ALIGNED_DATA. 921ef53dae8SSam Ravnborg * 9227923f90fSSam Ravnborg * use 0 as page_align if page_aligned data is not used */ 92373f1d939SPaul Mundt #define RW_DATA_SECTION(cacheline, pagealigned, inittask) \ 924ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 925ef53dae8SSam Ravnborg .data : AT(ADDR(.data) - LOAD_OFFSET) { \ 92639a449d9STim Abbott INIT_TASK_DATA(inittask) \ 9271b208622STim Abbott NOSAVE_DATA \ 9281b208622STim Abbott PAGE_ALIGNED_DATA(pagealigned) \ 929ef53dae8SSam Ravnborg CACHELINE_ALIGNED_DATA(cacheline) \ 930ef53dae8SSam Ravnborg READ_MOSTLY_DATA(cacheline) \ 931ef53dae8SSam Ravnborg DATA_DATA \ 932ef53dae8SSam Ravnborg CONSTRUCTORS \ 93319d43626SPeter Zijlstra } \ 934ee9f8fceSJosh Poimboeuf BUG_TABLE \ 935ef53dae8SSam Ravnborg 936ef53dae8SSam Ravnborg #define INIT_TEXT_SECTION(inittext_align) \ 937ef53dae8SSam Ravnborg . = ALIGN(inittext_align); \ 938ef53dae8SSam Ravnborg .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { \ 939ef53dae8SSam Ravnborg VMLINUX_SYMBOL(_sinittext) = .; \ 940ef53dae8SSam Ravnborg INIT_TEXT \ 941ef53dae8SSam Ravnborg VMLINUX_SYMBOL(_einittext) = .; \ 942ef53dae8SSam Ravnborg } 943ef53dae8SSam Ravnborg 944ef53dae8SSam Ravnborg #define INIT_DATA_SECTION(initsetup_align) \ 945ef53dae8SSam Ravnborg .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { \ 946ef53dae8SSam Ravnborg INIT_DATA \ 947ef53dae8SSam Ravnborg INIT_SETUP(initsetup_align) \ 948ef53dae8SSam Ravnborg INIT_CALLS \ 949ef53dae8SSam Ravnborg CON_INITCALL \ 950ef53dae8SSam Ravnborg SECURITY_INITCALL \ 951ef53dae8SSam Ravnborg INIT_RAM_FS \ 952ef53dae8SSam Ravnborg } 953ef53dae8SSam Ravnborg 95404e448d9STim Abbott #define BSS_SECTION(sbss_align, bss_align, stop_align) \ 95504e448d9STim Abbott . = ALIGN(sbss_align); \ 95604e448d9STim Abbott VMLINUX_SYMBOL(__bss_start) = .; \ 95704e448d9STim Abbott SBSS(sbss_align) \ 958ef53dae8SSam Ravnborg BSS(bss_align) \ 95904e448d9STim Abbott . = ALIGN(stop_align); \ 96004e448d9STim Abbott VMLINUX_SYMBOL(__bss_stop) = .; 961