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 /* 6307fca0e5SSam Ravnborg * Align to a 32 byte boundary equal to the 6407fca0e5SSam Ravnborg * alignment gcc 4.5 uses for a struct 6507fca0e5SSam Ravnborg */ 66aab94339SDirk Brandewie #define STRUCT_ALIGNMENT 32 67aab94339SDirk Brandewie #define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT) 6807fca0e5SSam Ravnborg 69eb8f6890SSam Ravnborg /* The actual configuration determine if the init/exit sections 70eb8f6890SSam Ravnborg * are handled as text/data or they can be discarded (which 71eb8f6890SSam Ravnborg * often happens at runtime) 72eb8f6890SSam Ravnborg */ 73eb8f6890SSam Ravnborg #ifdef CONFIG_HOTPLUG_CPU 74eb8f6890SSam Ravnborg #define CPU_KEEP(sec) *(.cpu##sec) 75eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) 76eb8f6890SSam Ravnborg #else 77eb8f6890SSam Ravnborg #define CPU_KEEP(sec) 78eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) *(.cpu##sec) 79eb8f6890SSam Ravnborg #endif 80eb8f6890SSam Ravnborg 811a3fb6d4SAdrian Bunk #if defined(CONFIG_MEMORY_HOTPLUG) 82eb8f6890SSam Ravnborg #define MEM_KEEP(sec) *(.mem##sec) 83eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) 84eb8f6890SSam Ravnborg #else 85eb8f6890SSam Ravnborg #define MEM_KEEP(sec) 86eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) *(.mem##sec) 87eb8f6890SSam Ravnborg #endif 88eb8f6890SSam Ravnborg 898da3821bSSteven Rostedt #ifdef CONFIG_FTRACE_MCOUNT_RECORD 904b3b4c5eSJohn Reiser #define MCOUNT_REC() . = ALIGN(8); \ 914b3b4c5eSJohn Reiser VMLINUX_SYMBOL(__start_mcount_loc) = .; \ 928da3821bSSteven Rostedt *(__mcount_loc) \ 938da3821bSSteven Rostedt VMLINUX_SYMBOL(__stop_mcount_loc) = .; 948da3821bSSteven Rostedt #else 958da3821bSSteven Rostedt #define MCOUNT_REC() 968da3821bSSteven Rostedt #endif 97eb8f6890SSam Ravnborg 982ed84eebSSteven Rostedt #ifdef CONFIG_TRACE_BRANCH_PROFILING 9945b79749SSteven Rostedt #define LIKELY_PROFILE() VMLINUX_SYMBOL(__start_annotated_branch_profile) = .; \ 10045b79749SSteven Rostedt *(_ftrace_annotated_branch) \ 10145b79749SSteven Rostedt VMLINUX_SYMBOL(__stop_annotated_branch_profile) = .; 1021f0d69a9SSteven Rostedt #else 1031f0d69a9SSteven Rostedt #define LIKELY_PROFILE() 1041f0d69a9SSteven Rostedt #endif 1051f0d69a9SSteven Rostedt 1062bcd521aSSteven Rostedt #ifdef CONFIG_PROFILE_ALL_BRANCHES 1072bcd521aSSteven Rostedt #define BRANCH_PROFILE() VMLINUX_SYMBOL(__start_branch_profile) = .; \ 1082bcd521aSSteven Rostedt *(_ftrace_branch) \ 1092bcd521aSSteven Rostedt VMLINUX_SYMBOL(__stop_branch_profile) = .; 1102bcd521aSSteven Rostedt #else 1112bcd521aSSteven Rostedt #define BRANCH_PROFILE() 1122bcd521aSSteven Rostedt #endif 1132bcd521aSSteven Rostedt 114376e2424SMasami Hiramatsu #ifdef CONFIG_KPROBES 11569902c71SVineet Gupta #define KPROBE_BLACKLIST() . = ALIGN(8); \ 11669902c71SVineet Gupta VMLINUX_SYMBOL(__start_kprobe_blacklist) = .; \ 1174b89b7f7SNicholas Piggin KEEP(*(_kprobe_blacklist)) \ 118376e2424SMasami Hiramatsu VMLINUX_SYMBOL(__stop_kprobe_blacklist) = .; 119376e2424SMasami Hiramatsu #else 120376e2424SMasami Hiramatsu #define KPROBE_BLACKLIST() 121376e2424SMasami Hiramatsu #endif 122376e2424SMasami Hiramatsu 1235f77a88bSTom Zanussi #ifdef CONFIG_EVENT_TRACING 124e4a9ea5eSSteven Rostedt #define FTRACE_EVENTS() . = ALIGN(8); \ 125e4a9ea5eSSteven Rostedt VMLINUX_SYMBOL(__start_ftrace_events) = .; \ 1264b89b7f7SNicholas Piggin KEEP(*(_ftrace_events)) \ 1270c564a53SSteven Rostedt (Red Hat) VMLINUX_SYMBOL(__stop_ftrace_events) = .; \ 1280c564a53SSteven Rostedt (Red Hat) VMLINUX_SYMBOL(__start_ftrace_enum_maps) = .; \ 1294b89b7f7SNicholas Piggin KEEP(*(_ftrace_enum_map)) \ 1300c564a53SSteven Rostedt (Red Hat) VMLINUX_SYMBOL(__stop_ftrace_enum_maps) = .; 131b77e38aaSSteven Rostedt #else 132b77e38aaSSteven Rostedt #define FTRACE_EVENTS() 133b77e38aaSSteven Rostedt #endif 134b77e38aaSSteven Rostedt 1351ba28e02SLai Jiangshan #ifdef CONFIG_TRACING 1361ba28e02SLai Jiangshan #define TRACE_PRINTKS() VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .; \ 1374b89b7f7SNicholas Piggin KEEP(*(__trace_printk_fmt)) /* Trace_printk fmt' pointer */ \ 1381ba28e02SLai Jiangshan VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .; 139102c9323SSteven Rostedt (Red Hat) #define TRACEPOINT_STR() VMLINUX_SYMBOL(__start___tracepoint_str) = .; \ 1404b89b7f7SNicholas Piggin KEEP(*(__tracepoint_str)) /* Trace_printk fmt' pointer */ \ 141102c9323SSteven Rostedt (Red Hat) VMLINUX_SYMBOL(__stop___tracepoint_str) = .; 1421ba28e02SLai Jiangshan #else 1431ba28e02SLai Jiangshan #define TRACE_PRINTKS() 144102c9323SSteven Rostedt (Red Hat) #define TRACEPOINT_STR() 1451ba28e02SLai Jiangshan #endif 1461ba28e02SLai Jiangshan 147bed1ffcaSFrederic Weisbecker #ifdef CONFIG_FTRACE_SYSCALLS 1483d56e331SSteven Rostedt #define TRACE_SYSCALLS() . = ALIGN(8); \ 1493d56e331SSteven Rostedt VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \ 1504b89b7f7SNicholas Piggin KEEP(*(__syscalls_metadata)) \ 151bed1ffcaSFrederic Weisbecker VMLINUX_SYMBOL(__stop_syscalls_metadata) = .; 152bed1ffcaSFrederic Weisbecker #else 153bed1ffcaSFrederic Weisbecker #define TRACE_SYSCALLS() 154bed1ffcaSFrederic Weisbecker #endif 155bed1ffcaSFrederic Weisbecker 156470ca0deSPeter Hurley #ifdef CONFIG_SERIAL_EARLYCON 15799492c39SPeter Hurley #define EARLYCON_TABLE() STRUCT_ALIGN(); \ 158470ca0deSPeter Hurley VMLINUX_SYMBOL(__earlycon_table) = .; \ 1594b89b7f7SNicholas Piggin KEEP(*(__earlycon_table)) \ 1602eaa7909SPeter Hurley VMLINUX_SYMBOL(__earlycon_table_end) = .; 161470ca0deSPeter Hurley #else 162470ca0deSPeter Hurley #define EARLYCON_TABLE() 163470ca0deSPeter Hurley #endif 164aab94339SDirk Brandewie 16506309288SRob Herring #define ___OF_TABLE(cfg, name) _OF_TABLE_##cfg(name) 16606309288SRob Herring #define __OF_TABLE(cfg, name) ___OF_TABLE(cfg, name) 1675ee02af1SMasahiro Yamada #define OF_TABLE(cfg, name) __OF_TABLE(IS_ENABLED(cfg), name) 16806309288SRob Herring #define _OF_TABLE_0(name) 16906309288SRob Herring #define _OF_TABLE_1(name) \ 170f6e916b8SThomas Petazzoni . = ALIGN(8); \ 17106309288SRob Herring VMLINUX_SYMBOL(__##name##_of_table) = .; \ 1724b89b7f7SNicholas Piggin KEEP(*(__##name##_of_table)) \ 1734b89b7f7SNicholas Piggin KEEP(*(__##name##_of_table_end)) 174aab94339SDirk Brandewie 175bb0eb050SDaniel Lezcano #define TIMER_OF_TABLES() OF_TABLE(CONFIG_TIMER_OF, timer) 17606309288SRob Herring #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip) 17706309288SRob Herring #define CLK_OF_TABLES() OF_TABLE(CONFIG_COMMON_CLK, clk) 1781cd076bfSWill Deacon #define IOMMU_OF_TABLES() OF_TABLE(CONFIG_OF_IOMMU, iommu) 17906309288SRob Herring #define RESERVEDMEM_OF_TABLES() OF_TABLE(CONFIG_OF_RESERVED_MEM, reservedmem) 18006309288SRob Herring #define CPU_METHOD_OF_TABLES() OF_TABLE(CONFIG_SMP, cpu_method) 181449e056cSDaniel Lezcano #define CPUIDLE_METHOD_OF_TABLES() OF_TABLE(CONFIG_CPU_IDLE, cpuidle_method) 1826c3ff8b1SStephen Boyd 183e647b532SMarc Zyngier #ifdef CONFIG_ACPI 184e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name) \ 185e647b532SMarc Zyngier . = ALIGN(8); \ 186e647b532SMarc Zyngier VMLINUX_SYMBOL(__##name##_acpi_probe_table) = .; \ 1874b89b7f7SNicholas Piggin KEEP(*(__##name##_acpi_probe_table)) \ 188e647b532SMarc Zyngier VMLINUX_SYMBOL(__##name##_acpi_probe_table_end) = .; 189e647b532SMarc Zyngier #else 190e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name) 191e647b532SMarc Zyngier #endif 192e647b532SMarc Zyngier 193aab94339SDirk Brandewie #define KERNEL_DTB() \ 194aab94339SDirk Brandewie STRUCT_ALIGN(); \ 195aab94339SDirk Brandewie VMLINUX_SYMBOL(__dtb_start) = .; \ 1964b89b7f7SNicholas Piggin KEEP(*(.dtb.init.rodata)) \ 197aab94339SDirk Brandewie VMLINUX_SYMBOL(__dtb_end) = .; 198aab94339SDirk Brandewie 199b67067f1SNicholas Piggin /* 200b67067f1SNicholas Piggin * .data section 2010f4c4af0SNicholas Piggin * LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections generates 2020f4c4af0SNicholas Piggin * .data.identifier which needs to be pulled in with .data, but don't want to 2030f4c4af0SNicholas Piggin * pull in .data..stuff which has its own requirements. Same for bss. 204b67067f1SNicholas Piggin */ 205ca967258SSam Ravnborg #define DATA_DATA \ 206b67067f1SNicholas Piggin *(.data .data.[0-9a-zA-Z_]*) \ 207312b1485SSam Ravnborg *(.ref.data) \ 208d356c0b6SMike Frysinger *(.data..shared_aligned) /* percpu related */ \ 209eb8f6890SSam Ravnborg MEM_KEEP(init.data) \ 210eb8f6890SSam Ravnborg MEM_KEEP(exit.data) \ 2117ccaba53SJan Beulich *(.data.unlikely) \ 21265498646SMathieu Desnoyers STRUCT_ALIGN(); \ 21397e1c18eSMathieu Desnoyers *(__tracepoints) \ 214e9d376f0SJason Baron /* implement dynamic printk debug */ \ 215e9d376f0SJason Baron . = ALIGN(8); \ 216d430d3d7SJason Baron VMLINUX_SYMBOL(__start___jump_table) = .; \ 2174b89b7f7SNicholas Piggin KEEP(*(__jump_table)) \ 218d430d3d7SJason Baron VMLINUX_SYMBOL(__stop___jump_table) = .; \ 219d430d3d7SJason Baron . = ALIGN(8); \ 220e9d376f0SJason Baron VMLINUX_SYMBOL(__start___verbose) = .; \ 2214b89b7f7SNicholas Piggin KEEP(*(__verbose)) \ 222e9d376f0SJason Baron VMLINUX_SYMBOL(__stop___verbose) = .; \ 2232bcd521aSSteven Rostedt LIKELY_PROFILE() \ 224b77e38aaSSteven Rostedt BRANCH_PROFILE() \ 225102c9323SSteven Rostedt (Red Hat) TRACE_PRINTKS() \ 226102c9323SSteven Rostedt (Red Hat) TRACEPOINT_STR() 227ca967258SSam Ravnborg 228ef53dae8SSam Ravnborg /* 229ef53dae8SSam Ravnborg * Data section helpers 230ef53dae8SSam Ravnborg */ 231ef53dae8SSam Ravnborg #define NOSAVE_DATA \ 232ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 233ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__nosave_begin) = .; \ 23407b3bb1eSDenys Vlasenko *(.data..nosave) \ 235ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 236ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__nosave_end) = .; 237ef53dae8SSam Ravnborg 238ef53dae8SSam Ravnborg #define PAGE_ALIGNED_DATA(page_align) \ 239ef53dae8SSam Ravnborg . = ALIGN(page_align); \ 24075b13483STim Abbott *(.data..page_aligned) 241ef53dae8SSam Ravnborg 242ef53dae8SSam Ravnborg #define READ_MOSTLY_DATA(align) \ 243ef53dae8SSam Ravnborg . = ALIGN(align); \ 2448369744fSShaohua Li *(.data..read_mostly) \ 2458369744fSShaohua Li . = ALIGN(align); 246ef53dae8SSam Ravnborg 247ef53dae8SSam Ravnborg #define CACHELINE_ALIGNED_DATA(align) \ 248ef53dae8SSam Ravnborg . = ALIGN(align); \ 2494af57b78STim Abbott *(.data..cacheline_aligned) 250ef53dae8SSam Ravnborg 25139a449d9STim Abbott #define INIT_TASK_DATA(align) \ 252ef53dae8SSam Ravnborg . = ALIGN(align); \ 25391ed140dSBorislav Petkov VMLINUX_SYMBOL(__start_init_task) = .; \ 25491ed140dSBorislav Petkov *(.data..init_task) \ 25591ed140dSBorislav Petkov VMLINUX_SYMBOL(__end_init_task) = .; 256ef53dae8SSam Ravnborg 257ef53dae8SSam Ravnborg /* 25832fb2fc5SHeiko Carstens * Allow architectures to handle ro_after_init data on their 25932fb2fc5SHeiko Carstens * own by defining an empty RO_AFTER_INIT_DATA. 26032fb2fc5SHeiko Carstens */ 26132fb2fc5SHeiko Carstens #ifndef RO_AFTER_INIT_DATA 262d7c19b06SJakub Kicinski #define RO_AFTER_INIT_DATA \ 263d79bf21eSJessica Yu VMLINUX_SYMBOL(__start_ro_after_init) = .; \ 264d7c19b06SJakub Kicinski *(.data..ro_after_init) \ 265d79bf21eSJessica Yu VMLINUX_SYMBOL(__end_ro_after_init) = .; 26632fb2fc5SHeiko Carstens #endif 26732fb2fc5SHeiko Carstens 26832fb2fc5SHeiko Carstens /* 269ef53dae8SSam Ravnborg * Read only Data 270ef53dae8SSam Ravnborg */ 271ef53dae8SSam Ravnborg #define RO_DATA_SECTION(align) \ 2724096b46fSSam Ravnborg . = ALIGN((align)); \ 2731da177e4SLinus Torvalds .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ 2746569580dSVivek Goyal VMLINUX_SYMBOL(__start_rodata) = .; \ 2751da177e4SLinus Torvalds *(.rodata) *(.rodata.*) \ 27632fb2fc5SHeiko Carstens RO_AFTER_INIT_DATA /* Read only after init */ \ 2774b89b7f7SNicholas Piggin KEEP(*(__vermagic)) /* Kernel version magic */ \ 27865498646SMathieu Desnoyers . = ALIGN(8); \ 27965498646SMathieu Desnoyers VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .; \ 2804b89b7f7SNicholas Piggin KEEP(*(__tracepoints_ptrs)) /* Tracepoints: pointer array */ \ 28165498646SMathieu Desnoyers VMLINUX_SYMBOL(__stop___tracepoints_ptrs) = .; \ 28297e1c18eSMathieu Desnoyers *(__tracepoints_strings)/* Tracepoints: strings */ \ 2831da177e4SLinus Torvalds } \ 2841da177e4SLinus Torvalds \ 2851da177e4SLinus Torvalds .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \ 2861da177e4SLinus Torvalds *(.rodata1) \ 2871da177e4SLinus Torvalds } \ 2881da177e4SLinus Torvalds \ 2891da177e4SLinus Torvalds /* PCI quirks */ \ 2901da177e4SLinus Torvalds .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ 2911da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \ 2924b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_early)) \ 2931da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_early) = .; \ 2941da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_header) = .; \ 2954b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_header)) \ 2961da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_header) = .; \ 2971da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_final) = .; \ 2984b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_final)) \ 2991da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_final) = .; \ 3001da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_enable) = .; \ 3014b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_enable)) \ 3021da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_enable) = .; \ 3031597cacbSAlan Cox VMLINUX_SYMBOL(__start_pci_fixups_resume) = .; \ 3044b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_resume)) \ 3051597cacbSAlan Cox VMLINUX_SYMBOL(__end_pci_fixups_resume) = .; \ 306e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .; \ 3074b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_resume_early)) \ 308e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .; \ 309e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .; \ 3104b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_suspend)) \ 311e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .; \ 3127d2a01b8SAndreas Noever VMLINUX_SYMBOL(__start_pci_fixups_suspend_late) = .; \ 3134b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_suspend_late)) \ 3147d2a01b8SAndreas Noever VMLINUX_SYMBOL(__end_pci_fixups_suspend_late) = .; \ 3151da177e4SLinus Torvalds } \ 3161da177e4SLinus Torvalds \ 3175658c769SDavid Woodhouse /* Built-in firmware blobs */ \ 3185658c769SDavid Woodhouse .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \ 3195658c769SDavid Woodhouse VMLINUX_SYMBOL(__start_builtin_fw) = .; \ 3204b89b7f7SNicholas Piggin KEEP(*(.builtin_fw)) \ 3215658c769SDavid Woodhouse VMLINUX_SYMBOL(__end_builtin_fw) = .; \ 3225658c769SDavid Woodhouse } \ 3235658c769SDavid Woodhouse \ 32463687a52SJan Beulich TRACEDATA \ 32563687a52SJan Beulich \ 3261da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 3271da177e4SLinus Torvalds __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ 3281da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___ksymtab) = .; \ 329b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab+*))) \ 3301da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___ksymtab) = .; \ 3311da177e4SLinus Torvalds } \ 3321da177e4SLinus Torvalds \ 3331da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 3341da177e4SLinus Torvalds __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ 3351da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \ 336b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_gpl+*))) \ 3371da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \ 3381da177e4SLinus Torvalds } \ 3391da177e4SLinus Torvalds \ 340f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 341f71d20e9SArjan van de Ven __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ 342f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \ 343b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_unused+*))) \ 344f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \ 345f71d20e9SArjan van de Ven } \ 346f71d20e9SArjan van de Ven \ 347f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 348f71d20e9SArjan van de Ven __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ 349f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \ 350b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_unused_gpl+*))) \ 351f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \ 352f71d20e9SArjan van de Ven } \ 353f71d20e9SArjan van de Ven \ 3549f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 3559f28bb7eSGreg Kroah-Hartman __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ 3569f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \ 357b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_gpl_future+*))) \ 3589f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \ 3599f28bb7eSGreg Kroah-Hartman } \ 3609f28bb7eSGreg Kroah-Hartman \ 3611da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 3621da177e4SLinus Torvalds __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ 3631da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___kcrctab) = .; \ 364b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab+*))) \ 3651da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___kcrctab) = .; \ 3661da177e4SLinus Torvalds } \ 3671da177e4SLinus Torvalds \ 3681da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 3691da177e4SLinus Torvalds __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ 3701da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___kcrctab_gpl) = .; \ 371b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_gpl+*))) \ 3721da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \ 3731da177e4SLinus Torvalds } \ 3741da177e4SLinus Torvalds \ 375f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 376f71d20e9SArjan van de Ven __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \ 377f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___kcrctab_unused) = .; \ 378b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_unused+*))) \ 379f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___kcrctab_unused) = .; \ 380f71d20e9SArjan van de Ven } \ 381f71d20e9SArjan van de Ven \ 382f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 383f71d20e9SArjan van de Ven __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ 384f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \ 385b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_unused_gpl+*))) \ 386f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .; \ 387f71d20e9SArjan van de Ven } \ 388f71d20e9SArjan van de Ven \ 3899f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 3909f28bb7eSGreg Kroah-Hartman __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ 3919f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \ 392b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_gpl_future+*))) \ 3939f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \ 3949f28bb7eSGreg Kroah-Hartman } \ 3959f28bb7eSGreg Kroah-Hartman \ 3961da177e4SLinus Torvalds /* Kernel symbol table: strings */ \ 3971da177e4SLinus Torvalds __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ 3984b89b7f7SNicholas Piggin *(__ksymtab_strings) \ 3991da177e4SLinus Torvalds } \ 4001da177e4SLinus Torvalds \ 401eb8f6890SSam Ravnborg /* __*init sections */ \ 402eb8f6890SSam Ravnborg __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) { \ 403312b1485SSam Ravnborg *(.ref.rodata) \ 404eb8f6890SSam Ravnborg MEM_KEEP(init.rodata) \ 405eb8f6890SSam Ravnborg MEM_KEEP(exit.rodata) \ 406eb8f6890SSam Ravnborg } \ 407eb8f6890SSam Ravnborg \ 4081da177e4SLinus Torvalds /* Built-in module parameters. */ \ 4091da177e4SLinus Torvalds __param : AT(ADDR(__param) - LOAD_OFFSET) { \ 4101da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___param) = .; \ 4114b89b7f7SNicholas Piggin KEEP(*(__param)) \ 4121da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___param) = .; \ 413e94965edSDmitry Torokhov } \ 414e94965edSDmitry Torokhov \ 415e94965edSDmitry Torokhov /* Built-in module versions. */ \ 416e94965edSDmitry Torokhov __modver : AT(ADDR(__modver) - LOAD_OFFSET) { \ 417e94965edSDmitry Torokhov VMLINUX_SYMBOL(__start___modver) = .; \ 4184b89b7f7SNicholas Piggin KEEP(*(__modver)) \ 419e94965edSDmitry Torokhov VMLINUX_SYMBOL(__stop___modver) = .; \ 420edeed305SArjan van de Ven . = ALIGN((align)); \ 4216569580dSVivek Goyal VMLINUX_SYMBOL(__end_rodata) = .; \ 4227583ddfdSMarcelo Tosatti } \ 4234096b46fSSam Ravnborg . = ALIGN((align)); 4244096b46fSSam Ravnborg 425ef53dae8SSam Ravnborg /* RODATA & RO_DATA provided for backward compatibility. 4264096b46fSSam Ravnborg * All archs are supposed to use RO_DATA() */ 427ef53dae8SSam Ravnborg #define RODATA RO_DATA_SECTION(4096) 428ef53dae8SSam Ravnborg #define RO_DATA(align) RO_DATA_SECTION(align) 4291da177e4SLinus Torvalds 4301da177e4SLinus Torvalds #define SECURITY_INIT \ 43160bad7faSEric W. Biederman .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \ 4321da177e4SLinus Torvalds VMLINUX_SYMBOL(__security_initcall_start) = .; \ 433b67067f1SNicholas Piggin KEEP(*(.security_initcall.init)) \ 4341da177e4SLinus Torvalds VMLINUX_SYMBOL(__security_initcall_end) = .; \ 4351da177e4SLinus Torvalds } 4361da177e4SLinus Torvalds 4377664709bSSam Ravnborg /* .text section. Map to function alignment to avoid address changes 4380f4c4af0SNicholas Piggin * during second ld run in second ld pass when generating System.map 4390f4c4af0SNicholas Piggin * LD_DEAD_CODE_DATA_ELIMINATION option enables -ffunction-sections generates 4400f4c4af0SNicholas Piggin * .text.identifier which needs to be pulled in with .text , but some 4410f4c4af0SNicholas Piggin * architectures define .text.foo which is not intended to be pulled in here. 4420f4c4af0SNicholas Piggin * Those enabling LD_DEAD_CODE_DATA_ELIMINATION must ensure they don't have 4430f4c4af0SNicholas Piggin * conflicting section names, and must pull in .text.[0-9a-zA-Z_]* */ 4447664709bSSam Ravnborg #define TEXT_TEXT \ 4457664709bSSam Ravnborg ALIGN_FUNCTION(); \ 4469bebe9e5SAndi Kleen *(.text.hot .text .text.fixup .text.unlikely) \ 447312b1485SSam Ravnborg *(.ref.text) \ 448eb8f6890SSam Ravnborg MEM_KEEP(init.text) \ 449fb5e2b37SJan Beulich MEM_KEEP(exit.text) \ 450eb8f6890SSam Ravnborg 4517664709bSSam Ravnborg 4526d30e3a8SSam Ravnborg /* sched.text is aling to function alignment to secure we have same 4536d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 4541da177e4SLinus Torvalds #define SCHED_TEXT \ 4556d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 4561da177e4SLinus Torvalds VMLINUX_SYMBOL(__sched_text_start) = .; \ 4571da177e4SLinus Torvalds *(.sched.text) \ 4581da177e4SLinus Torvalds VMLINUX_SYMBOL(__sched_text_end) = .; 4591da177e4SLinus Torvalds 4606d30e3a8SSam Ravnborg /* spinlock.text is aling to function alignment to secure we have same 4616d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 4621da177e4SLinus Torvalds #define LOCK_TEXT \ 4636d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 4641da177e4SLinus Torvalds VMLINUX_SYMBOL(__lock_text_start) = .; \ 4651da177e4SLinus Torvalds *(.spinlock.text) \ 4661da177e4SLinus Torvalds VMLINUX_SYMBOL(__lock_text_end) = .; 467d0aaff97SPrasanna S Panchamukhi 4686727ad9eSChris Metcalf #define CPUIDLE_TEXT \ 4696727ad9eSChris Metcalf ALIGN_FUNCTION(); \ 4706727ad9eSChris Metcalf VMLINUX_SYMBOL(__cpuidle_text_start) = .; \ 4716727ad9eSChris Metcalf *(.cpuidle.text) \ 4726727ad9eSChris Metcalf VMLINUX_SYMBOL(__cpuidle_text_end) = .; 4736727ad9eSChris Metcalf 474d0aaff97SPrasanna S Panchamukhi #define KPROBES_TEXT \ 475d0aaff97SPrasanna S Panchamukhi ALIGN_FUNCTION(); \ 476d0aaff97SPrasanna S Panchamukhi VMLINUX_SYMBOL(__kprobes_text_start) = .; \ 477d0aaff97SPrasanna S Panchamukhi *(.kprobes.text) \ 478d0aaff97SPrasanna S Panchamukhi VMLINUX_SYMBOL(__kprobes_text_end) = .; 479a7d0c210SPaolo 'Blaisorblade' Giarrusso 480ea714547SJiri Olsa #define ENTRY_TEXT \ 481ea714547SJiri Olsa ALIGN_FUNCTION(); \ 482ea714547SJiri Olsa VMLINUX_SYMBOL(__entry_text_start) = .; \ 483ea714547SJiri Olsa *(.entry.text) \ 484ea714547SJiri Olsa VMLINUX_SYMBOL(__entry_text_end) = .; 485ea714547SJiri Olsa 486be7635e7SAlexander Potapenko #if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN) 487a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT \ 488a0343e82SFrederic Weisbecker ALIGN_FUNCTION(); \ 489a0343e82SFrederic Weisbecker VMLINUX_SYMBOL(__irqentry_text_start) = .; \ 490a0343e82SFrederic Weisbecker *(.irqentry.text) \ 491a0343e82SFrederic Weisbecker VMLINUX_SYMBOL(__irqentry_text_end) = .; 492a0343e82SFrederic Weisbecker #else 493a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT 494a0343e82SFrederic Weisbecker #endif 495a0343e82SFrederic Weisbecker 496be7635e7SAlexander Potapenko #if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN) 497be7635e7SAlexander Potapenko #define SOFTIRQENTRY_TEXT \ 498be7635e7SAlexander Potapenko ALIGN_FUNCTION(); \ 499be7635e7SAlexander Potapenko VMLINUX_SYMBOL(__softirqentry_text_start) = .; \ 500be7635e7SAlexander Potapenko *(.softirqentry.text) \ 501be7635e7SAlexander Potapenko VMLINUX_SYMBOL(__softirqentry_text_end) = .; 502be7635e7SAlexander Potapenko #else 503be7635e7SAlexander Potapenko #define SOFTIRQENTRY_TEXT 504be7635e7SAlexander Potapenko #endif 505be7635e7SAlexander Potapenko 50637c514e3SSam Ravnborg /* Section used for early init (in .S files) */ 5077923f90fSSam Ravnborg #define HEAD_TEXT *(.head.text) 50837c514e3SSam Ravnborg 5097923f90fSSam Ravnborg #define HEAD_TEXT_SECTION \ 510ef53dae8SSam Ravnborg .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) { \ 511ef53dae8SSam Ravnborg HEAD_TEXT \ 512ef53dae8SSam Ravnborg } 513ef53dae8SSam Ravnborg 514ef53dae8SSam Ravnborg /* 515ef53dae8SSam Ravnborg * Exception table 516ef53dae8SSam Ravnborg */ 517ef53dae8SSam Ravnborg #define EXCEPTION_TABLE(align) \ 518ef53dae8SSam Ravnborg . = ALIGN(align); \ 519ef53dae8SSam Ravnborg __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \ 520ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__start___ex_table) = .; \ 5214b89b7f7SNicholas Piggin KEEP(*(__ex_table)) \ 522ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__stop___ex_table) = .; \ 523ef53dae8SSam Ravnborg } 524ef53dae8SSam Ravnborg 525ef53dae8SSam Ravnborg /* 526ef53dae8SSam Ravnborg * Init task 527ef53dae8SSam Ravnborg */ 52839a449d9STim Abbott #define INIT_TASK_DATA_SECTION(align) \ 529ef53dae8SSam Ravnborg . = ALIGN(align); \ 530da5e37efSSam Ravnborg .data..init_task : AT(ADDR(.data..init_task) - LOAD_OFFSET) { \ 53139a449d9STim Abbott INIT_TASK_DATA(align) \ 532ef53dae8SSam Ravnborg } 533eb8f6890SSam Ravnborg 534b99b87f7SPeter Oberparleiter #ifdef CONFIG_CONSTRUCTORS 5352a2325e6SHeiko Carstens #define KERNEL_CTORS() . = ALIGN(8); \ 5362a2325e6SHeiko Carstens VMLINUX_SYMBOL(__ctors_start) = .; \ 5374b89b7f7SNicholas Piggin KEEP(*(.ctors)) \ 5384b89b7f7SNicholas Piggin KEEP(*(SORT(.init_array.*))) \ 5394b89b7f7SNicholas Piggin KEEP(*(.init_array)) \ 540b99b87f7SPeter Oberparleiter VMLINUX_SYMBOL(__ctors_end) = .; 541b99b87f7SPeter Oberparleiter #else 542b99b87f7SPeter Oberparleiter #define KERNEL_CTORS() 543b99b87f7SPeter Oberparleiter #endif 544b99b87f7SPeter Oberparleiter 54501ba2bdcSSam Ravnborg /* init and exit section handling */ 546eb8f6890SSam Ravnborg #define INIT_DATA \ 547b67067f1SNicholas Piggin KEEP(*(SORT(___kentry+*))) \ 548eb8f6890SSam Ravnborg *(.init.data) \ 549eb8f6890SSam Ravnborg MEM_DISCARD(init.data) \ 550b99b87f7SPeter Oberparleiter KERNEL_CTORS() \ 5514b3b4c5eSJohn Reiser MCOUNT_REC() \ 5529fd49328SSteven Rostedt *(.init.rodata) \ 553e4a9ea5eSSteven Rostedt FTRACE_EVENTS() \ 5543d56e331SSteven Rostedt TRACE_SYSCALLS() \ 555376e2424SMasami Hiramatsu KPROBE_BLACKLIST() \ 556aab94339SDirk Brandewie MEM_DISCARD(init.rodata) \ 557f2f6c255SPrashant Gaikwad CLK_OF_TABLES() \ 558f618c470SMarek Szyprowski RESERVEDMEM_OF_TABLES() \ 5592fcc112aSDaniel Lezcano TIMER_OF_TABLES() \ 5601cd076bfSWill Deacon IOMMU_OF_TABLES() \ 5616c3ff8b1SStephen Boyd CPU_METHOD_OF_TABLES() \ 562449e056cSDaniel Lezcano CPUIDLE_METHOD_OF_TABLES() \ 563f6e916b8SThomas Petazzoni KERNEL_DTB() \ 564b0b6abd3SRob Herring IRQCHIP_OF_MATCH_TABLE() \ 56546e589a3SMarc Zyngier ACPI_PROBE_TABLE(irqchip) \ 5662fcc112aSDaniel Lezcano ACPI_PROBE_TABLE(timer) \ 5672fcc112aSDaniel Lezcano ACPI_PROBE_TABLE(iort) \ 5682eaa7909SPeter Hurley EARLYCON_TABLE() 56901ba2bdcSSam Ravnborg 570eb8f6890SSam Ravnborg #define INIT_TEXT \ 571eb8f6890SSam Ravnborg *(.init.text) \ 572e41f501dSDmitry Vyukov *(.text.startup) \ 573eb8f6890SSam Ravnborg MEM_DISCARD(init.text) 574eb8f6890SSam Ravnborg 575eb8f6890SSam Ravnborg #define EXIT_DATA \ 576eb8f6890SSam Ravnborg *(.exit.data) \ 577e41f501dSDmitry Vyukov *(.fini_array) \ 578e41f501dSDmitry Vyukov *(.dtors) \ 579eb8f6890SSam Ravnborg MEM_DISCARD(exit.data) \ 580eb8f6890SSam Ravnborg MEM_DISCARD(exit.rodata) 581eb8f6890SSam Ravnborg 582eb8f6890SSam Ravnborg #define EXIT_TEXT \ 583eb8f6890SSam Ravnborg *(.exit.text) \ 584e41f501dSDmitry Vyukov *(.text.exit) \ 585eb8f6890SSam Ravnborg MEM_DISCARD(exit.text) 58601ba2bdcSSam Ravnborg 5877923f90fSSam Ravnborg #define EXIT_CALL \ 5887923f90fSSam Ravnborg *(.exitcall.exit) 5897923f90fSSam Ravnborg 590ef53dae8SSam Ravnborg /* 591ef53dae8SSam Ravnborg * bss (Block Started by Symbol) - uninitialized data 592ef53dae8SSam Ravnborg * zeroed during startup 593ef53dae8SSam Ravnborg */ 59404e448d9STim Abbott #define SBSS(sbss_align) \ 59504e448d9STim Abbott . = ALIGN(sbss_align); \ 596ef53dae8SSam Ravnborg .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \ 597ef53dae8SSam Ravnborg *(.sbss) \ 598ef53dae8SSam Ravnborg *(.scommon) \ 599ef53dae8SSam Ravnborg } 600ef53dae8SSam Ravnborg 601c87728caSDavid Daney /* 602c87728caSDavid Daney * Allow archectures to redefine BSS_FIRST_SECTIONS to add extra 603c87728caSDavid Daney * sections to the front of bss. 604c87728caSDavid Daney */ 605c87728caSDavid Daney #ifndef BSS_FIRST_SECTIONS 606c87728caSDavid Daney #define BSS_FIRST_SECTIONS 607c87728caSDavid Daney #endif 608c87728caSDavid Daney 609ef53dae8SSam Ravnborg #define BSS(bss_align) \ 610ef53dae8SSam Ravnborg . = ALIGN(bss_align); \ 611ef53dae8SSam Ravnborg .bss : AT(ADDR(.bss) - LOAD_OFFSET) { \ 612c87728caSDavid Daney BSS_FIRST_SECTIONS \ 6137c74df07STim Abbott *(.bss..page_aligned) \ 614ef53dae8SSam Ravnborg *(.dynbss) \ 615b67067f1SNicholas Piggin *(.bss .bss.[0-9a-zA-Z_]*) \ 616ef53dae8SSam Ravnborg *(COMMON) \ 617ef53dae8SSam Ravnborg } 618ef53dae8SSam Ravnborg 619ef53dae8SSam Ravnborg /* 620ef53dae8SSam Ravnborg * DWARF debug sections. 621ef53dae8SSam Ravnborg * Symbols in the DWARF debugging sections are relative to 622ef53dae8SSam Ravnborg * the beginning of the section so we begin them at 0. 623ef53dae8SSam Ravnborg */ 624a7d0c210SPaolo 'Blaisorblade' Giarrusso #define DWARF_DEBUG \ 625a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1 */ \ 626a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug 0 : { *(.debug) } \ 627a7d0c210SPaolo 'Blaisorblade' Giarrusso .line 0 : { *(.line) } \ 628a7d0c210SPaolo 'Blaisorblade' Giarrusso /* GNU DWARF 1 extensions */ \ 629a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_srcinfo 0 : { *(.debug_srcinfo) } \ 630a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_sfnames 0 : { *(.debug_sfnames) } \ 631a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1.1 and DWARF 2 */ \ 632a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_aranges 0 : { *(.debug_aranges) } \ 633a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_pubnames 0 : { *(.debug_pubnames) } \ 634a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 2 */ \ 635a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_info 0 : { *(.debug_info \ 636a7d0c210SPaolo 'Blaisorblade' Giarrusso .gnu.linkonce.wi.*) } \ 637a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_abbrev 0 : { *(.debug_abbrev) } \ 638a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_line 0 : { *(.debug_line) } \ 639a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_frame 0 : { *(.debug_frame) } \ 640a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_str 0 : { *(.debug_str) } \ 641a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_loc 0 : { *(.debug_loc) } \ 642a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_macinfo 0 : { *(.debug_macinfo) } \ 643a7d0c210SPaolo 'Blaisorblade' Giarrusso /* SGI/MIPS DWARF 2 extensions */ \ 644a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_weaknames 0 : { *(.debug_weaknames) } \ 645a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_funcnames 0 : { *(.debug_funcnames) } \ 646a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_typenames 0 : { *(.debug_typenames) } \ 647a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_varnames 0 : { *(.debug_varnames) } \ 648a7d0c210SPaolo 'Blaisorblade' Giarrusso 649a7d0c210SPaolo 'Blaisorblade' Giarrusso /* Stabs debugging sections. */ 650a7d0c210SPaolo 'Blaisorblade' Giarrusso #define STABS_DEBUG \ 651a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab 0 : { *(.stab) } \ 652a7d0c210SPaolo 'Blaisorblade' Giarrusso .stabstr 0 : { *(.stabstr) } \ 653a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.excl 0 : { *(.stab.excl) } \ 654a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.exclstr 0 : { *(.stab.exclstr) } \ 655a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.index 0 : { *(.stab.index) } \ 656a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.indexstr 0 : { *(.stab.indexstr) } \ 657a7d0c210SPaolo 'Blaisorblade' Giarrusso .comment 0 : { *(.comment) } 6589c9b8b38SJeremy Fitzhardinge 6596360b1fbSJan Beulich #ifdef CONFIG_GENERIC_BUG 6607664c5a1SJeremy Fitzhardinge #define BUG_TABLE \ 6617664c5a1SJeremy Fitzhardinge . = ALIGN(8); \ 6627664c5a1SJeremy Fitzhardinge __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \ 663c6de0026SYoshinori Sato VMLINUX_SYMBOL(__start___bug_table) = .; \ 6644b89b7f7SNicholas Piggin KEEP(*(__bug_table)) \ 665c6de0026SYoshinori Sato VMLINUX_SYMBOL(__stop___bug_table) = .; \ 6667664c5a1SJeremy Fitzhardinge } 6676360b1fbSJan Beulich #else 6686360b1fbSJan Beulich #define BUG_TABLE 6696360b1fbSJan Beulich #endif 6707664c5a1SJeremy Fitzhardinge 67163687a52SJan Beulich #ifdef CONFIG_PM_TRACE 67263687a52SJan Beulich #define TRACEDATA \ 67363687a52SJan Beulich . = ALIGN(4); \ 67463687a52SJan Beulich .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \ 675c6de0026SYoshinori Sato VMLINUX_SYMBOL(__tracedata_start) = .; \ 6764b89b7f7SNicholas Piggin KEEP(*(.tracedata)) \ 677c6de0026SYoshinori Sato VMLINUX_SYMBOL(__tracedata_end) = .; \ 67863687a52SJan Beulich } 67963687a52SJan Beulich #else 68063687a52SJan Beulich #define TRACEDATA 68163687a52SJan Beulich #endif 68263687a52SJan Beulich 6839c9b8b38SJeremy Fitzhardinge #define NOTES \ 684cbe87121SRoland McGrath .notes : AT(ADDR(.notes) - LOAD_OFFSET) { \ 685cbe87121SRoland McGrath VMLINUX_SYMBOL(__start_notes) = .; \ 686cbe87121SRoland McGrath *(.note.*) \ 687cbe87121SRoland McGrath VMLINUX_SYMBOL(__stop_notes) = .; \ 688cbe87121SRoland McGrath } 68961ce1efeSAndrew Morton 690ef53dae8SSam Ravnborg #define INIT_SETUP(initsetup_align) \ 691ef53dae8SSam Ravnborg . = ALIGN(initsetup_align); \ 692ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__setup_start) = .; \ 6934b89b7f7SNicholas Piggin KEEP(*(.init.setup)) \ 694ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__setup_end) = .; 695ef53dae8SSam Ravnborg 696026cee00SPawel Moll #define INIT_CALLS_LEVEL(level) \ 697026cee00SPawel Moll VMLINUX_SYMBOL(__initcall##level##_start) = .; \ 698b67067f1SNicholas Piggin KEEP(*(.initcall##level##.init)) \ 699b67067f1SNicholas Piggin KEEP(*(.initcall##level##s.init)) \ 70061ce1efeSAndrew Morton 701ef53dae8SSam Ravnborg #define INIT_CALLS \ 702ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initcall_start) = .; \ 703b67067f1SNicholas Piggin KEEP(*(.initcallearly.init)) \ 704026cee00SPawel Moll INIT_CALLS_LEVEL(0) \ 705026cee00SPawel Moll INIT_CALLS_LEVEL(1) \ 706026cee00SPawel Moll INIT_CALLS_LEVEL(2) \ 707026cee00SPawel Moll INIT_CALLS_LEVEL(3) \ 708026cee00SPawel Moll INIT_CALLS_LEVEL(4) \ 709026cee00SPawel Moll INIT_CALLS_LEVEL(5) \ 710026cee00SPawel Moll INIT_CALLS_LEVEL(rootfs) \ 711026cee00SPawel Moll INIT_CALLS_LEVEL(6) \ 712026cee00SPawel Moll INIT_CALLS_LEVEL(7) \ 713ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initcall_end) = .; 714ef53dae8SSam Ravnborg 715ef53dae8SSam Ravnborg #define CON_INITCALL \ 716ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__con_initcall_start) = .; \ 717b67067f1SNicholas Piggin KEEP(*(.con_initcall.init)) \ 718ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__con_initcall_end) = .; 719ef53dae8SSam Ravnborg 720ef53dae8SSam Ravnborg #define SECURITY_INITCALL \ 721ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__security_initcall_start) = .; \ 722b67067f1SNicholas Piggin KEEP(*(.security_initcall.init)) \ 723ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__security_initcall_end) = .; 724ef53dae8SSam Ravnborg 725ef53dae8SSam Ravnborg #ifdef CONFIG_BLK_DEV_INITRD 726ef53dae8SSam Ravnborg #define INIT_RAM_FS \ 727d8826262SMike Frysinger . = ALIGN(4); \ 728ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initramfs_start) = .; \ 729b67067f1SNicholas Piggin KEEP(*(.init.ramfs)) \ 730ffe8018cSHendrik Brueckner . = ALIGN(8); \ 731b67067f1SNicholas Piggin KEEP(*(.init.ramfs.info)) 732ef53dae8SSam Ravnborg #else 733eadfe219SDavid Howells #define INIT_RAM_FS 734ef53dae8SSam Ravnborg #endif 735ef53dae8SSam Ravnborg 736023bf6f1STejun Heo /* 737023bf6f1STejun Heo * Default discarded sections. 738023bf6f1STejun Heo * 739023bf6f1STejun Heo * Some archs want to discard exit text/data at runtime rather than 740023bf6f1STejun Heo * link time due to cross-section references such as alt instructions, 741023bf6f1STejun Heo * bug table, eh_frame, etc. DISCARDS must be the last of output 742023bf6f1STejun Heo * section definitions so that such archs put those in earlier section 743023bf6f1STejun Heo * definitions. 744023bf6f1STejun Heo */ 745405d967dSTejun Heo #define DISCARDS \ 746405d967dSTejun Heo /DISCARD/ : { \ 747405d967dSTejun Heo EXIT_TEXT \ 748405d967dSTejun Heo EXIT_DATA \ 749023bf6f1STejun Heo EXIT_CALL \ 750405d967dSTejun Heo *(.discard) \ 751c7f52cdcSJeremy Fitzhardinge *(.discard.*) \ 752405d967dSTejun Heo } 753405d967dSTejun Heo 7543e5d8f97STejun Heo /** 7556ea0c34dSMike Frysinger * PERCPU_INPUT - the percpu input sections 7566ea0c34dSMike Frysinger * @cacheline: cacheline size 7576ea0c34dSMike Frysinger * 7586ea0c34dSMike Frysinger * The core percpu section names and core symbols which do not rely 7596ea0c34dSMike Frysinger * directly upon load addresses. 7606ea0c34dSMike Frysinger * 7616ea0c34dSMike Frysinger * @cacheline is used to align subsections to avoid false cacheline 7626ea0c34dSMike Frysinger * sharing between subsections for different purposes. 7636ea0c34dSMike Frysinger */ 7646ea0c34dSMike Frysinger #define PERCPU_INPUT(cacheline) \ 7656ea0c34dSMike Frysinger VMLINUX_SYMBOL(__per_cpu_start) = .; \ 7666ea0c34dSMike Frysinger *(.data..percpu..first) \ 7676ea0c34dSMike Frysinger . = ALIGN(PAGE_SIZE); \ 7686ea0c34dSMike Frysinger *(.data..percpu..page_aligned) \ 7696ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 770330d2822SZhengyu He *(.data..percpu..read_mostly) \ 7716ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 7726ea0c34dSMike Frysinger *(.data..percpu) \ 7736ea0c34dSMike Frysinger *(.data..percpu..shared_aligned) \ 7746ea0c34dSMike Frysinger VMLINUX_SYMBOL(__per_cpu_end) = .; 7756ea0c34dSMike Frysinger 7766ea0c34dSMike Frysinger /** 7776b7c38d5STejun Heo * PERCPU_VADDR - define output section for percpu area 77819df0c2fSTejun Heo * @cacheline: cacheline size 7793e5d8f97STejun Heo * @vaddr: explicit base address (optional) 7803e5d8f97STejun Heo * @phdr: destination PHDR (optional) 7813e5d8f97STejun Heo * 78219df0c2fSTejun Heo * Macro which expands to output section for percpu area. 78319df0c2fSTejun Heo * 78419df0c2fSTejun Heo * @cacheline is used to align subsections to avoid false cacheline 78519df0c2fSTejun Heo * sharing between subsections for different purposes. 78619df0c2fSTejun Heo * 78719df0c2fSTejun Heo * If @vaddr is not blank, it specifies explicit base address and all 78819df0c2fSTejun Heo * percpu symbols will be offset from the given address. If blank, 78919df0c2fSTejun Heo * @vaddr always equals @laddr + LOAD_OFFSET. 7903e5d8f97STejun Heo * 7913e5d8f97STejun Heo * @phdr defines the output PHDR to use if not blank. Be warned that 7923e5d8f97STejun Heo * output PHDR is sticky. If @phdr is specified, the next output 7933e5d8f97STejun Heo * section in the linker script will go there too. @phdr should have 7943e5d8f97STejun Heo * a leading colon. 7953e5d8f97STejun Heo * 7963ac6cffeSTejun Heo * Note that this macros defines __per_cpu_load as an absolute symbol. 7973ac6cffeSTejun Heo * If there is no need to put the percpu section at a predetermined 7980415b00dSTejun Heo * address, use PERCPU_SECTION. 7993e5d8f97STejun Heo */ 80019df0c2fSTejun Heo #define PERCPU_VADDR(cacheline, vaddr, phdr) \ 801dba3d36bSIngo Molnar VMLINUX_SYMBOL(__per_cpu_load) = .; \ 8023d9a854cSDenys Vlasenko .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ 8036b7c38d5STejun Heo - LOAD_OFFSET) { \ 8046ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 8056b7c38d5STejun Heo } phdr \ 8063d9a854cSDenys Vlasenko . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data..percpu); 8073e5d8f97STejun Heo 8083e5d8f97STejun Heo /** 8090415b00dSTejun Heo * PERCPU_SECTION - define output section for percpu area, simple version 81019df0c2fSTejun Heo * @cacheline: cacheline size 8113e5d8f97STejun Heo * 8120415b00dSTejun Heo * Align to PAGE_SIZE and outputs output section for percpu area. This 8130415b00dSTejun Heo * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and 8143e5d8f97STejun Heo * __per_cpu_start will be identical. 8153ac6cffeSTejun Heo * 8160415b00dSTejun Heo * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,) 81719df0c2fSTejun Heo * except that __per_cpu_load is defined as a relative symbol against 81819df0c2fSTejun Heo * .data..percpu which is required for relocatable x86_32 configuration. 8193e5d8f97STejun Heo */ 8200415b00dSTejun Heo #define PERCPU_SECTION(cacheline) \ 8210415b00dSTejun Heo . = ALIGN(PAGE_SIZE); \ 8223d9a854cSDenys Vlasenko .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ 8233ac6cffeSTejun Heo VMLINUX_SYMBOL(__per_cpu_load) = .; \ 8246ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 8253ac6cffeSTejun Heo } 826ef53dae8SSam Ravnborg 827ef53dae8SSam Ravnborg 828ef53dae8SSam Ravnborg /* 829ef53dae8SSam Ravnborg * Definition of the high level *_SECTION macros 830ef53dae8SSam Ravnborg * They will fit only a subset of the architectures 831ef53dae8SSam Ravnborg */ 832ef53dae8SSam Ravnborg 833ef53dae8SSam Ravnborg 834ef53dae8SSam Ravnborg /* 835ef53dae8SSam Ravnborg * Writeable data. 836ef53dae8SSam Ravnborg * All sections are combined in a single .data section. 837ef53dae8SSam Ravnborg * The sections following CONSTRUCTORS are arranged so their 838ef53dae8SSam Ravnborg * typical alignment matches. 839ef53dae8SSam Ravnborg * A cacheline is typical/always less than a PAGE_SIZE so 840ef53dae8SSam Ravnborg * the sections that has this restriction (or similar) 841ef53dae8SSam Ravnborg * is located before the ones requiring PAGE_SIZE alignment. 842ef53dae8SSam Ravnborg * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which 84325985edcSLucas De Marchi * matches the requirement of PAGE_ALIGNED_DATA. 844ef53dae8SSam Ravnborg * 8457923f90fSSam Ravnborg * use 0 as page_align if page_aligned data is not used */ 84673f1d939SPaul Mundt #define RW_DATA_SECTION(cacheline, pagealigned, inittask) \ 847ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 848ef53dae8SSam Ravnborg .data : AT(ADDR(.data) - LOAD_OFFSET) { \ 84939a449d9STim Abbott INIT_TASK_DATA(inittask) \ 8501b208622STim Abbott NOSAVE_DATA \ 8511b208622STim Abbott PAGE_ALIGNED_DATA(pagealigned) \ 852ef53dae8SSam Ravnborg CACHELINE_ALIGNED_DATA(cacheline) \ 853ef53dae8SSam Ravnborg READ_MOSTLY_DATA(cacheline) \ 854ef53dae8SSam Ravnborg DATA_DATA \ 855ef53dae8SSam Ravnborg CONSTRUCTORS \ 85619d43626SPeter Zijlstra } \ 85719d43626SPeter Zijlstra BUG_TABLE 858ef53dae8SSam Ravnborg 859ef53dae8SSam Ravnborg #define INIT_TEXT_SECTION(inittext_align) \ 860ef53dae8SSam Ravnborg . = ALIGN(inittext_align); \ 861ef53dae8SSam Ravnborg .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { \ 862ef53dae8SSam Ravnborg VMLINUX_SYMBOL(_sinittext) = .; \ 863ef53dae8SSam Ravnborg INIT_TEXT \ 864ef53dae8SSam Ravnborg VMLINUX_SYMBOL(_einittext) = .; \ 865ef53dae8SSam Ravnborg } 866ef53dae8SSam Ravnborg 867ef53dae8SSam Ravnborg #define INIT_DATA_SECTION(initsetup_align) \ 868ef53dae8SSam Ravnborg .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { \ 869ef53dae8SSam Ravnborg INIT_DATA \ 870ef53dae8SSam Ravnborg INIT_SETUP(initsetup_align) \ 871ef53dae8SSam Ravnborg INIT_CALLS \ 872ef53dae8SSam Ravnborg CON_INITCALL \ 873ef53dae8SSam Ravnborg SECURITY_INITCALL \ 874ef53dae8SSam Ravnborg INIT_RAM_FS \ 875ef53dae8SSam Ravnborg } 876ef53dae8SSam Ravnborg 87704e448d9STim Abbott #define BSS_SECTION(sbss_align, bss_align, stop_align) \ 87804e448d9STim Abbott . = ALIGN(sbss_align); \ 87904e448d9STim Abbott VMLINUX_SYMBOL(__bss_start) = .; \ 88004e448d9STim Abbott SBSS(sbss_align) \ 881ef53dae8SSam Ravnborg BSS(bss_align) \ 88204e448d9STim Abbott . = ALIGN(stop_align); \ 88304e448d9STim Abbott VMLINUX_SYMBOL(__bss_stop) = .; 884