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) = .; \ 117376e2424SMasami Hiramatsu *(_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) = .; \ 126b77e38aaSSteven Rostedt *(_ftrace_events) \ 127b77e38aaSSteven Rostedt VMLINUX_SYMBOL(__stop_ftrace_events) = .; 128b77e38aaSSteven Rostedt #else 129b77e38aaSSteven Rostedt #define FTRACE_EVENTS() 130b77e38aaSSteven Rostedt #endif 131b77e38aaSSteven Rostedt 1321ba28e02SLai Jiangshan #ifdef CONFIG_TRACING 1331ba28e02SLai Jiangshan #define TRACE_PRINTKS() VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .; \ 1341ba28e02SLai Jiangshan *(__trace_printk_fmt) /* Trace_printk fmt' pointer */ \ 1351ba28e02SLai Jiangshan VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .; 136102c9323SSteven Rostedt (Red Hat) #define TRACEPOINT_STR() VMLINUX_SYMBOL(__start___tracepoint_str) = .; \ 137102c9323SSteven Rostedt (Red Hat) *(__tracepoint_str) /* Trace_printk fmt' pointer */ \ 138102c9323SSteven Rostedt (Red Hat) VMLINUX_SYMBOL(__stop___tracepoint_str) = .; 1391ba28e02SLai Jiangshan #else 1401ba28e02SLai Jiangshan #define TRACE_PRINTKS() 141102c9323SSteven Rostedt (Red Hat) #define TRACEPOINT_STR() 1421ba28e02SLai Jiangshan #endif 1431ba28e02SLai Jiangshan 144bed1ffcaSFrederic Weisbecker #ifdef CONFIG_FTRACE_SYSCALLS 1453d56e331SSteven Rostedt #define TRACE_SYSCALLS() . = ALIGN(8); \ 1463d56e331SSteven Rostedt VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \ 147bed1ffcaSFrederic Weisbecker *(__syscalls_metadata) \ 148bed1ffcaSFrederic Weisbecker VMLINUX_SYMBOL(__stop_syscalls_metadata) = .; 149bed1ffcaSFrederic Weisbecker #else 150bed1ffcaSFrederic Weisbecker #define TRACE_SYSCALLS() 151bed1ffcaSFrederic Weisbecker #endif 152bed1ffcaSFrederic Weisbecker 153aab94339SDirk Brandewie 15406309288SRob Herring #define ___OF_TABLE(cfg, name) _OF_TABLE_##cfg(name) 15506309288SRob Herring #define __OF_TABLE(cfg, name) ___OF_TABLE(cfg, name) 15606309288SRob Herring #define OF_TABLE(cfg, name) __OF_TABLE(config_enabled(cfg), name) 15706309288SRob Herring #define _OF_TABLE_0(name) 15806309288SRob Herring #define _OF_TABLE_1(name) \ 159f6e916b8SThomas Petazzoni . = ALIGN(8); \ 16006309288SRob Herring VMLINUX_SYMBOL(__##name##_of_table) = .; \ 16106309288SRob Herring *(__##name##_of_table) \ 16206309288SRob Herring *(__##name##_of_table_end) 163aab94339SDirk Brandewie 16406309288SRob Herring #define CLKSRC_OF_TABLES() OF_TABLE(CONFIG_CLKSRC_OF, clksrc) 16506309288SRob Herring #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip) 16606309288SRob Herring #define CLK_OF_TABLES() OF_TABLE(CONFIG_COMMON_CLK, clk) 1671cd076bfSWill Deacon #define IOMMU_OF_TABLES() OF_TABLE(CONFIG_OF_IOMMU, iommu) 16806309288SRob Herring #define RESERVEDMEM_OF_TABLES() OF_TABLE(CONFIG_OF_RESERVED_MEM, reservedmem) 16906309288SRob Herring #define CPU_METHOD_OF_TABLES() OF_TABLE(CONFIG_SMP, cpu_method) 170b0b6abd3SRob Herring #define EARLYCON_OF_TABLES() OF_TABLE(CONFIG_SERIAL_EARLYCON, earlycon) 1716c3ff8b1SStephen Boyd 172aab94339SDirk Brandewie #define KERNEL_DTB() \ 173aab94339SDirk Brandewie STRUCT_ALIGN(); \ 174aab94339SDirk Brandewie VMLINUX_SYMBOL(__dtb_start) = .; \ 175aab94339SDirk Brandewie *(.dtb.init.rodata) \ 176aab94339SDirk Brandewie VMLINUX_SYMBOL(__dtb_end) = .; 177aab94339SDirk Brandewie 178ca967258SSam Ravnborg /* .data section */ 179ca967258SSam Ravnborg #define DATA_DATA \ 1800e0d314eSSam Ravnborg *(.data) \ 181312b1485SSam Ravnborg *(.ref.data) \ 182d356c0b6SMike Frysinger *(.data..shared_aligned) /* percpu related */ \ 183eb8f6890SSam Ravnborg MEM_KEEP(init.data) \ 184eb8f6890SSam Ravnborg MEM_KEEP(exit.data) \ 1857ccaba53SJan Beulich *(.data.unlikely) \ 18665498646SMathieu Desnoyers STRUCT_ALIGN(); \ 18797e1c18eSMathieu Desnoyers *(__tracepoints) \ 188e9d376f0SJason Baron /* implement dynamic printk debug */ \ 189e9d376f0SJason Baron . = ALIGN(8); \ 190d430d3d7SJason Baron VMLINUX_SYMBOL(__start___jump_table) = .; \ 191d430d3d7SJason Baron *(__jump_table) \ 192d430d3d7SJason Baron VMLINUX_SYMBOL(__stop___jump_table) = .; \ 193d430d3d7SJason Baron . = ALIGN(8); \ 194e9d376f0SJason Baron VMLINUX_SYMBOL(__start___verbose) = .; \ 195e9d376f0SJason Baron *(__verbose) \ 196e9d376f0SJason Baron VMLINUX_SYMBOL(__stop___verbose) = .; \ 1972bcd521aSSteven Rostedt LIKELY_PROFILE() \ 198b77e38aaSSteven Rostedt BRANCH_PROFILE() \ 199102c9323SSteven Rostedt (Red Hat) TRACE_PRINTKS() \ 200102c9323SSteven Rostedt (Red Hat) TRACEPOINT_STR() 201ca967258SSam Ravnborg 202ef53dae8SSam Ravnborg /* 203ef53dae8SSam Ravnborg * Data section helpers 204ef53dae8SSam Ravnborg */ 205ef53dae8SSam Ravnborg #define NOSAVE_DATA \ 206ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 207ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__nosave_begin) = .; \ 20807b3bb1eSDenys Vlasenko *(.data..nosave) \ 209ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 210ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__nosave_end) = .; 211ef53dae8SSam Ravnborg 212ef53dae8SSam Ravnborg #define PAGE_ALIGNED_DATA(page_align) \ 213ef53dae8SSam Ravnborg . = ALIGN(page_align); \ 21475b13483STim Abbott *(.data..page_aligned) 215ef53dae8SSam Ravnborg 216ef53dae8SSam Ravnborg #define READ_MOSTLY_DATA(align) \ 217ef53dae8SSam Ravnborg . = ALIGN(align); \ 2188369744fSShaohua Li *(.data..read_mostly) \ 2198369744fSShaohua Li . = ALIGN(align); 220ef53dae8SSam Ravnborg 221ef53dae8SSam Ravnborg #define CACHELINE_ALIGNED_DATA(align) \ 222ef53dae8SSam Ravnborg . = ALIGN(align); \ 2234af57b78STim Abbott *(.data..cacheline_aligned) 224ef53dae8SSam Ravnborg 22539a449d9STim Abbott #define INIT_TASK_DATA(align) \ 226ef53dae8SSam Ravnborg . = ALIGN(align); \ 2272af7687fSTim Abbott *(.data..init_task) 228ef53dae8SSam Ravnborg 229ef53dae8SSam Ravnborg /* 230ef53dae8SSam Ravnborg * Read only Data 231ef53dae8SSam Ravnborg */ 232ef53dae8SSam Ravnborg #define RO_DATA_SECTION(align) \ 2334096b46fSSam Ravnborg . = ALIGN((align)); \ 2341da177e4SLinus Torvalds .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ 2356569580dSVivek Goyal VMLINUX_SYMBOL(__start_rodata) = .; \ 2361da177e4SLinus Torvalds *(.rodata) *(.rodata.*) \ 2371da177e4SLinus Torvalds *(__vermagic) /* Kernel version magic */ \ 23865498646SMathieu Desnoyers . = ALIGN(8); \ 23965498646SMathieu Desnoyers VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .; \ 24065498646SMathieu Desnoyers *(__tracepoints_ptrs) /* Tracepoints: pointer array */\ 24165498646SMathieu Desnoyers VMLINUX_SYMBOL(__stop___tracepoints_ptrs) = .; \ 24297e1c18eSMathieu Desnoyers *(__tracepoints_strings)/* Tracepoints: strings */ \ 2431da177e4SLinus Torvalds } \ 2441da177e4SLinus Torvalds \ 2451da177e4SLinus Torvalds .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \ 2461da177e4SLinus Torvalds *(.rodata1) \ 2471da177e4SLinus Torvalds } \ 2481da177e4SLinus Torvalds \ 2496360b1fbSJan Beulich BUG_TABLE \ 2506360b1fbSJan Beulich \ 2511da177e4SLinus Torvalds /* PCI quirks */ \ 2521da177e4SLinus Torvalds .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ 2531da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \ 2541da177e4SLinus Torvalds *(.pci_fixup_early) \ 2551da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_early) = .; \ 2561da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_header) = .; \ 2571da177e4SLinus Torvalds *(.pci_fixup_header) \ 2581da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_header) = .; \ 2591da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_final) = .; \ 2601da177e4SLinus Torvalds *(.pci_fixup_final) \ 2611da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_final) = .; \ 2621da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_enable) = .; \ 2631da177e4SLinus Torvalds *(.pci_fixup_enable) \ 2641da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_enable) = .; \ 2651597cacbSAlan Cox VMLINUX_SYMBOL(__start_pci_fixups_resume) = .; \ 2661597cacbSAlan Cox *(.pci_fixup_resume) \ 2671597cacbSAlan Cox VMLINUX_SYMBOL(__end_pci_fixups_resume) = .; \ 268e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .; \ 269e1a2a51eSRafael J. Wysocki *(.pci_fixup_resume_early) \ 270e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .; \ 271e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .; \ 272e1a2a51eSRafael J. Wysocki *(.pci_fixup_suspend) \ 273e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .; \ 2747d2a01b8SAndreas Noever VMLINUX_SYMBOL(__start_pci_fixups_suspend_late) = .; \ 2757d2a01b8SAndreas Noever *(.pci_fixup_suspend_late) \ 2767d2a01b8SAndreas Noever VMLINUX_SYMBOL(__end_pci_fixups_suspend_late) = .; \ 2771da177e4SLinus Torvalds } \ 2781da177e4SLinus Torvalds \ 2795658c769SDavid Woodhouse /* Built-in firmware blobs */ \ 2805658c769SDavid Woodhouse .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \ 2815658c769SDavid Woodhouse VMLINUX_SYMBOL(__start_builtin_fw) = .; \ 2825658c769SDavid Woodhouse *(.builtin_fw) \ 2835658c769SDavid Woodhouse VMLINUX_SYMBOL(__end_builtin_fw) = .; \ 2845658c769SDavid Woodhouse } \ 2855658c769SDavid Woodhouse \ 28663687a52SJan Beulich TRACEDATA \ 28763687a52SJan Beulich \ 2881da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 2891da177e4SLinus Torvalds __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ 2901da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___ksymtab) = .; \ 291f02e8a65SAlessio Igor Bogani *(SORT(___ksymtab+*)) \ 2921da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___ksymtab) = .; \ 2931da177e4SLinus Torvalds } \ 2941da177e4SLinus Torvalds \ 2951da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 2961da177e4SLinus Torvalds __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ 2971da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \ 298f02e8a65SAlessio Igor Bogani *(SORT(___ksymtab_gpl+*)) \ 2991da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \ 3001da177e4SLinus Torvalds } \ 3011da177e4SLinus Torvalds \ 302f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 303f71d20e9SArjan van de Ven __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ 304f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \ 305f02e8a65SAlessio Igor Bogani *(SORT(___ksymtab_unused+*)) \ 306f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \ 307f71d20e9SArjan van de Ven } \ 308f71d20e9SArjan van de Ven \ 309f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 310f71d20e9SArjan van de Ven __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ 311f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \ 312f02e8a65SAlessio Igor Bogani *(SORT(___ksymtab_unused_gpl+*)) \ 313f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \ 314f71d20e9SArjan van de Ven } \ 315f71d20e9SArjan van de Ven \ 3169f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 3179f28bb7eSGreg Kroah-Hartman __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ 3189f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \ 319f02e8a65SAlessio Igor Bogani *(SORT(___ksymtab_gpl_future+*)) \ 3209f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \ 3219f28bb7eSGreg Kroah-Hartman } \ 3229f28bb7eSGreg Kroah-Hartman \ 3231da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 3241da177e4SLinus Torvalds __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ 3251da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___kcrctab) = .; \ 326f02e8a65SAlessio Igor Bogani *(SORT(___kcrctab+*)) \ 3271da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___kcrctab) = .; \ 3281da177e4SLinus Torvalds } \ 3291da177e4SLinus Torvalds \ 3301da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 3311da177e4SLinus Torvalds __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ 3321da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___kcrctab_gpl) = .; \ 333f02e8a65SAlessio Igor Bogani *(SORT(___kcrctab_gpl+*)) \ 3341da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \ 3351da177e4SLinus Torvalds } \ 3361da177e4SLinus Torvalds \ 337f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 338f71d20e9SArjan van de Ven __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \ 339f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___kcrctab_unused) = .; \ 340f02e8a65SAlessio Igor Bogani *(SORT(___kcrctab_unused+*)) \ 341f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___kcrctab_unused) = .; \ 342f71d20e9SArjan van de Ven } \ 343f71d20e9SArjan van de Ven \ 344f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 345f71d20e9SArjan van de Ven __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ 346f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \ 347f02e8a65SAlessio Igor Bogani *(SORT(___kcrctab_unused_gpl+*)) \ 348f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .; \ 349f71d20e9SArjan van de Ven } \ 350f71d20e9SArjan van de Ven \ 3519f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 3529f28bb7eSGreg Kroah-Hartman __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ 3539f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \ 354f02e8a65SAlessio Igor Bogani *(SORT(___kcrctab_gpl_future+*)) \ 3559f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \ 3569f28bb7eSGreg Kroah-Hartman } \ 3579f28bb7eSGreg Kroah-Hartman \ 3581da177e4SLinus Torvalds /* Kernel symbol table: strings */ \ 3591da177e4SLinus Torvalds __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ 3601da177e4SLinus Torvalds *(__ksymtab_strings) \ 3611da177e4SLinus Torvalds } \ 3621da177e4SLinus Torvalds \ 363eb8f6890SSam Ravnborg /* __*init sections */ \ 364eb8f6890SSam Ravnborg __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) { \ 365312b1485SSam Ravnborg *(.ref.rodata) \ 366eb8f6890SSam Ravnborg MEM_KEEP(init.rodata) \ 367eb8f6890SSam Ravnborg MEM_KEEP(exit.rodata) \ 368eb8f6890SSam Ravnborg } \ 369eb8f6890SSam Ravnborg \ 3701da177e4SLinus Torvalds /* Built-in module parameters. */ \ 3711da177e4SLinus Torvalds __param : AT(ADDR(__param) - LOAD_OFFSET) { \ 3721da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___param) = .; \ 3731da177e4SLinus Torvalds *(__param) \ 3741da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___param) = .; \ 375e94965edSDmitry Torokhov } \ 376e94965edSDmitry Torokhov \ 377e94965edSDmitry Torokhov /* Built-in module versions. */ \ 378e94965edSDmitry Torokhov __modver : AT(ADDR(__modver) - LOAD_OFFSET) { \ 379e94965edSDmitry Torokhov VMLINUX_SYMBOL(__start___modver) = .; \ 380e94965edSDmitry Torokhov *(__modver) \ 381e94965edSDmitry Torokhov VMLINUX_SYMBOL(__stop___modver) = .; \ 382edeed305SArjan van de Ven . = ALIGN((align)); \ 3836569580dSVivek Goyal VMLINUX_SYMBOL(__end_rodata) = .; \ 3847583ddfdSMarcelo Tosatti } \ 3854096b46fSSam Ravnborg . = ALIGN((align)); 3864096b46fSSam Ravnborg 387ef53dae8SSam Ravnborg /* RODATA & RO_DATA provided for backward compatibility. 3884096b46fSSam Ravnborg * All archs are supposed to use RO_DATA() */ 389ef53dae8SSam Ravnborg #define RODATA RO_DATA_SECTION(4096) 390ef53dae8SSam Ravnborg #define RO_DATA(align) RO_DATA_SECTION(align) 3911da177e4SLinus Torvalds 3921da177e4SLinus Torvalds #define SECURITY_INIT \ 39360bad7faSEric W. Biederman .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \ 3941da177e4SLinus Torvalds VMLINUX_SYMBOL(__security_initcall_start) = .; \ 3951da177e4SLinus Torvalds *(.security_initcall.init) \ 3961da177e4SLinus Torvalds VMLINUX_SYMBOL(__security_initcall_end) = .; \ 3971da177e4SLinus Torvalds } 3981da177e4SLinus Torvalds 3997664709bSSam Ravnborg /* .text section. Map to function alignment to avoid address changes 4007664709bSSam Ravnborg * during second ld run in second ld pass when generating System.map */ 4017664709bSSam Ravnborg #define TEXT_TEXT \ 4027664709bSSam Ravnborg ALIGN_FUNCTION(); \ 403fb5e2b37SJan Beulich *(.text.hot) \ 4040e0d314eSSam Ravnborg *(.text) \ 405312b1485SSam Ravnborg *(.ref.text) \ 406eb8f6890SSam Ravnborg MEM_KEEP(init.text) \ 407fb5e2b37SJan Beulich MEM_KEEP(exit.text) \ 408fb5e2b37SJan Beulich *(.text.unlikely) 409eb8f6890SSam Ravnborg 4107664709bSSam Ravnborg 4116d30e3a8SSam Ravnborg /* sched.text is aling to function alignment to secure we have same 4126d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 4131da177e4SLinus Torvalds #define SCHED_TEXT \ 4146d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 4151da177e4SLinus Torvalds VMLINUX_SYMBOL(__sched_text_start) = .; \ 4161da177e4SLinus Torvalds *(.sched.text) \ 4171da177e4SLinus Torvalds VMLINUX_SYMBOL(__sched_text_end) = .; 4181da177e4SLinus Torvalds 4196d30e3a8SSam Ravnborg /* spinlock.text is aling to function alignment to secure we have same 4206d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 4211da177e4SLinus Torvalds #define LOCK_TEXT \ 4226d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 4231da177e4SLinus Torvalds VMLINUX_SYMBOL(__lock_text_start) = .; \ 4241da177e4SLinus Torvalds *(.spinlock.text) \ 4251da177e4SLinus Torvalds VMLINUX_SYMBOL(__lock_text_end) = .; 426d0aaff97SPrasanna S Panchamukhi 427d0aaff97SPrasanna S Panchamukhi #define KPROBES_TEXT \ 428d0aaff97SPrasanna S Panchamukhi ALIGN_FUNCTION(); \ 429d0aaff97SPrasanna S Panchamukhi VMLINUX_SYMBOL(__kprobes_text_start) = .; \ 430d0aaff97SPrasanna S Panchamukhi *(.kprobes.text) \ 431d0aaff97SPrasanna S Panchamukhi VMLINUX_SYMBOL(__kprobes_text_end) = .; 432a7d0c210SPaolo 'Blaisorblade' Giarrusso 433ea714547SJiri Olsa #define ENTRY_TEXT \ 434ea714547SJiri Olsa ALIGN_FUNCTION(); \ 435ea714547SJiri Olsa VMLINUX_SYMBOL(__entry_text_start) = .; \ 436ea714547SJiri Olsa *(.entry.text) \ 437ea714547SJiri Olsa VMLINUX_SYMBOL(__entry_text_end) = .; 438ea714547SJiri Olsa 439a0343e82SFrederic Weisbecker #ifdef CONFIG_FUNCTION_GRAPH_TRACER 440a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT \ 441a0343e82SFrederic Weisbecker ALIGN_FUNCTION(); \ 442a0343e82SFrederic Weisbecker VMLINUX_SYMBOL(__irqentry_text_start) = .; \ 443a0343e82SFrederic Weisbecker *(.irqentry.text) \ 444a0343e82SFrederic Weisbecker VMLINUX_SYMBOL(__irqentry_text_end) = .; 445a0343e82SFrederic Weisbecker #else 446a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT 447a0343e82SFrederic Weisbecker #endif 448a0343e82SFrederic Weisbecker 44937c514e3SSam Ravnborg /* Section used for early init (in .S files) */ 4507923f90fSSam Ravnborg #define HEAD_TEXT *(.head.text) 45137c514e3SSam Ravnborg 4527923f90fSSam Ravnborg #define HEAD_TEXT_SECTION \ 453ef53dae8SSam Ravnborg .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) { \ 454ef53dae8SSam Ravnborg HEAD_TEXT \ 455ef53dae8SSam Ravnborg } 456ef53dae8SSam Ravnborg 457ef53dae8SSam Ravnborg /* 458ef53dae8SSam Ravnborg * Exception table 459ef53dae8SSam Ravnborg */ 460ef53dae8SSam Ravnborg #define EXCEPTION_TABLE(align) \ 461ef53dae8SSam Ravnborg . = ALIGN(align); \ 462ef53dae8SSam Ravnborg __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \ 463ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__start___ex_table) = .; \ 464ef53dae8SSam Ravnborg *(__ex_table) \ 465ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__stop___ex_table) = .; \ 466ef53dae8SSam Ravnborg } 467ef53dae8SSam Ravnborg 468ef53dae8SSam Ravnborg /* 469ef53dae8SSam Ravnborg * Init task 470ef53dae8SSam Ravnborg */ 47139a449d9STim Abbott #define INIT_TASK_DATA_SECTION(align) \ 472ef53dae8SSam Ravnborg . = ALIGN(align); \ 473da5e37efSSam Ravnborg .data..init_task : AT(ADDR(.data..init_task) - LOAD_OFFSET) { \ 47439a449d9STim Abbott INIT_TASK_DATA(align) \ 475ef53dae8SSam Ravnborg } 476eb8f6890SSam Ravnborg 477b99b87f7SPeter Oberparleiter #ifdef CONFIG_CONSTRUCTORS 4782a2325e6SHeiko Carstens #define KERNEL_CTORS() . = ALIGN(8); \ 4792a2325e6SHeiko Carstens VMLINUX_SYMBOL(__ctors_start) = .; \ 480b99b87f7SPeter Oberparleiter *(.ctors) \ 481eb3057dfSFrantisek Hrbata *(.init_array) \ 482b99b87f7SPeter Oberparleiter VMLINUX_SYMBOL(__ctors_end) = .; 483b99b87f7SPeter Oberparleiter #else 484b99b87f7SPeter Oberparleiter #define KERNEL_CTORS() 485b99b87f7SPeter Oberparleiter #endif 486b99b87f7SPeter Oberparleiter 48701ba2bdcSSam Ravnborg /* init and exit section handling */ 488eb8f6890SSam Ravnborg #define INIT_DATA \ 489eb8f6890SSam Ravnborg *(.init.data) \ 490eb8f6890SSam Ravnborg MEM_DISCARD(init.data) \ 491b99b87f7SPeter Oberparleiter KERNEL_CTORS() \ 4924b3b4c5eSJohn Reiser MCOUNT_REC() \ 4939fd49328SSteven Rostedt *(.init.rodata) \ 494e4a9ea5eSSteven Rostedt FTRACE_EVENTS() \ 4953d56e331SSteven Rostedt TRACE_SYSCALLS() \ 496376e2424SMasami Hiramatsu KPROBE_BLACKLIST() \ 497aab94339SDirk Brandewie MEM_DISCARD(init.rodata) \ 498f2f6c255SPrashant Gaikwad CLK_OF_TABLES() \ 499f618c470SMarek Szyprowski RESERVEDMEM_OF_TABLES() \ 500ae278a93SStephen Warren CLKSRC_OF_TABLES() \ 5011cd076bfSWill Deacon IOMMU_OF_TABLES() \ 5026c3ff8b1SStephen Boyd CPU_METHOD_OF_TABLES() \ 503f6e916b8SThomas Petazzoni KERNEL_DTB() \ 504b0b6abd3SRob Herring IRQCHIP_OF_MATCH_TABLE() \ 505b0b6abd3SRob Herring EARLYCON_OF_TABLES() 50601ba2bdcSSam Ravnborg 507eb8f6890SSam Ravnborg #define INIT_TEXT \ 508eb8f6890SSam Ravnborg *(.init.text) \ 509eb8f6890SSam Ravnborg MEM_DISCARD(init.text) 510eb8f6890SSam Ravnborg 511eb8f6890SSam Ravnborg #define EXIT_DATA \ 512eb8f6890SSam Ravnborg *(.exit.data) \ 513eb8f6890SSam Ravnborg MEM_DISCARD(exit.data) \ 514eb8f6890SSam Ravnborg MEM_DISCARD(exit.rodata) 515eb8f6890SSam Ravnborg 516eb8f6890SSam Ravnborg #define EXIT_TEXT \ 517eb8f6890SSam Ravnborg *(.exit.text) \ 518eb8f6890SSam Ravnborg MEM_DISCARD(exit.text) 51901ba2bdcSSam Ravnborg 5207923f90fSSam Ravnborg #define EXIT_CALL \ 5217923f90fSSam Ravnborg *(.exitcall.exit) 5227923f90fSSam Ravnborg 523ef53dae8SSam Ravnborg /* 524ef53dae8SSam Ravnborg * bss (Block Started by Symbol) - uninitialized data 525ef53dae8SSam Ravnborg * zeroed during startup 526ef53dae8SSam Ravnborg */ 52704e448d9STim Abbott #define SBSS(sbss_align) \ 52804e448d9STim Abbott . = ALIGN(sbss_align); \ 529ef53dae8SSam Ravnborg .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \ 530ef53dae8SSam Ravnborg *(.sbss) \ 531ef53dae8SSam Ravnborg *(.scommon) \ 532ef53dae8SSam Ravnborg } 533ef53dae8SSam Ravnborg 534c87728caSDavid Daney /* 535c87728caSDavid Daney * Allow archectures to redefine BSS_FIRST_SECTIONS to add extra 536c87728caSDavid Daney * sections to the front of bss. 537c87728caSDavid Daney */ 538c87728caSDavid Daney #ifndef BSS_FIRST_SECTIONS 539c87728caSDavid Daney #define BSS_FIRST_SECTIONS 540c87728caSDavid Daney #endif 541c87728caSDavid Daney 542ef53dae8SSam Ravnborg #define BSS(bss_align) \ 543ef53dae8SSam Ravnborg . = ALIGN(bss_align); \ 544ef53dae8SSam Ravnborg .bss : AT(ADDR(.bss) - LOAD_OFFSET) { \ 545c87728caSDavid Daney BSS_FIRST_SECTIONS \ 5467c74df07STim Abbott *(.bss..page_aligned) \ 547ef53dae8SSam Ravnborg *(.dynbss) \ 548ef53dae8SSam Ravnborg *(.bss) \ 549ef53dae8SSam Ravnborg *(COMMON) \ 550ef53dae8SSam Ravnborg } 551ef53dae8SSam Ravnborg 552ef53dae8SSam Ravnborg /* 553ef53dae8SSam Ravnborg * DWARF debug sections. 554ef53dae8SSam Ravnborg * Symbols in the DWARF debugging sections are relative to 555ef53dae8SSam Ravnborg * the beginning of the section so we begin them at 0. 556ef53dae8SSam Ravnborg */ 557a7d0c210SPaolo 'Blaisorblade' Giarrusso #define DWARF_DEBUG \ 558a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1 */ \ 559a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug 0 : { *(.debug) } \ 560a7d0c210SPaolo 'Blaisorblade' Giarrusso .line 0 : { *(.line) } \ 561a7d0c210SPaolo 'Blaisorblade' Giarrusso /* GNU DWARF 1 extensions */ \ 562a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_srcinfo 0 : { *(.debug_srcinfo) } \ 563a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_sfnames 0 : { *(.debug_sfnames) } \ 564a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1.1 and DWARF 2 */ \ 565a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_aranges 0 : { *(.debug_aranges) } \ 566a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_pubnames 0 : { *(.debug_pubnames) } \ 567a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 2 */ \ 568a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_info 0 : { *(.debug_info \ 569a7d0c210SPaolo 'Blaisorblade' Giarrusso .gnu.linkonce.wi.*) } \ 570a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_abbrev 0 : { *(.debug_abbrev) } \ 571a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_line 0 : { *(.debug_line) } \ 572a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_frame 0 : { *(.debug_frame) } \ 573a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_str 0 : { *(.debug_str) } \ 574a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_loc 0 : { *(.debug_loc) } \ 575a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_macinfo 0 : { *(.debug_macinfo) } \ 576a7d0c210SPaolo 'Blaisorblade' Giarrusso /* SGI/MIPS DWARF 2 extensions */ \ 577a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_weaknames 0 : { *(.debug_weaknames) } \ 578a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_funcnames 0 : { *(.debug_funcnames) } \ 579a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_typenames 0 : { *(.debug_typenames) } \ 580a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_varnames 0 : { *(.debug_varnames) } \ 581a7d0c210SPaolo 'Blaisorblade' Giarrusso 582a7d0c210SPaolo 'Blaisorblade' Giarrusso /* Stabs debugging sections. */ 583a7d0c210SPaolo 'Blaisorblade' Giarrusso #define STABS_DEBUG \ 584a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab 0 : { *(.stab) } \ 585a7d0c210SPaolo 'Blaisorblade' Giarrusso .stabstr 0 : { *(.stabstr) } \ 586a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.excl 0 : { *(.stab.excl) } \ 587a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.exclstr 0 : { *(.stab.exclstr) } \ 588a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.index 0 : { *(.stab.index) } \ 589a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.indexstr 0 : { *(.stab.indexstr) } \ 590a7d0c210SPaolo 'Blaisorblade' Giarrusso .comment 0 : { *(.comment) } 5919c9b8b38SJeremy Fitzhardinge 5926360b1fbSJan Beulich #ifdef CONFIG_GENERIC_BUG 5937664c5a1SJeremy Fitzhardinge #define BUG_TABLE \ 5947664c5a1SJeremy Fitzhardinge . = ALIGN(8); \ 5957664c5a1SJeremy Fitzhardinge __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \ 596c6de0026SYoshinori Sato VMLINUX_SYMBOL(__start___bug_table) = .; \ 5977664c5a1SJeremy Fitzhardinge *(__bug_table) \ 598c6de0026SYoshinori Sato VMLINUX_SYMBOL(__stop___bug_table) = .; \ 5997664c5a1SJeremy Fitzhardinge } 6006360b1fbSJan Beulich #else 6016360b1fbSJan Beulich #define BUG_TABLE 6026360b1fbSJan Beulich #endif 6037664c5a1SJeremy Fitzhardinge 60463687a52SJan Beulich #ifdef CONFIG_PM_TRACE 60563687a52SJan Beulich #define TRACEDATA \ 60663687a52SJan Beulich . = ALIGN(4); \ 60763687a52SJan Beulich .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \ 608c6de0026SYoshinori Sato VMLINUX_SYMBOL(__tracedata_start) = .; \ 60963687a52SJan Beulich *(.tracedata) \ 610c6de0026SYoshinori Sato VMLINUX_SYMBOL(__tracedata_end) = .; \ 61163687a52SJan Beulich } 61263687a52SJan Beulich #else 61363687a52SJan Beulich #define TRACEDATA 61463687a52SJan Beulich #endif 61563687a52SJan Beulich 6169c9b8b38SJeremy Fitzhardinge #define NOTES \ 617cbe87121SRoland McGrath .notes : AT(ADDR(.notes) - LOAD_OFFSET) { \ 618cbe87121SRoland McGrath VMLINUX_SYMBOL(__start_notes) = .; \ 619cbe87121SRoland McGrath *(.note.*) \ 620cbe87121SRoland McGrath VMLINUX_SYMBOL(__stop_notes) = .; \ 621cbe87121SRoland McGrath } 62261ce1efeSAndrew Morton 623ef53dae8SSam Ravnborg #define INIT_SETUP(initsetup_align) \ 624ef53dae8SSam Ravnborg . = ALIGN(initsetup_align); \ 625ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__setup_start) = .; \ 626ef53dae8SSam Ravnborg *(.init.setup) \ 627ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__setup_end) = .; 628ef53dae8SSam Ravnborg 629026cee00SPawel Moll #define INIT_CALLS_LEVEL(level) \ 630026cee00SPawel Moll VMLINUX_SYMBOL(__initcall##level##_start) = .; \ 631026cee00SPawel Moll *(.initcall##level##.init) \ 632026cee00SPawel Moll *(.initcall##level##s.init) \ 63361ce1efeSAndrew Morton 634ef53dae8SSam Ravnborg #define INIT_CALLS \ 635ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initcall_start) = .; \ 636026cee00SPawel Moll *(.initcallearly.init) \ 637026cee00SPawel Moll INIT_CALLS_LEVEL(0) \ 638026cee00SPawel Moll INIT_CALLS_LEVEL(1) \ 639026cee00SPawel Moll INIT_CALLS_LEVEL(2) \ 640026cee00SPawel Moll INIT_CALLS_LEVEL(3) \ 641026cee00SPawel Moll INIT_CALLS_LEVEL(4) \ 642026cee00SPawel Moll INIT_CALLS_LEVEL(5) \ 643026cee00SPawel Moll INIT_CALLS_LEVEL(rootfs) \ 644026cee00SPawel Moll INIT_CALLS_LEVEL(6) \ 645026cee00SPawel Moll INIT_CALLS_LEVEL(7) \ 646ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initcall_end) = .; 647ef53dae8SSam Ravnborg 648ef53dae8SSam Ravnborg #define CON_INITCALL \ 649ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__con_initcall_start) = .; \ 650ef53dae8SSam Ravnborg *(.con_initcall.init) \ 651ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__con_initcall_end) = .; 652ef53dae8SSam Ravnborg 653ef53dae8SSam Ravnborg #define SECURITY_INITCALL \ 654ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__security_initcall_start) = .; \ 655ef53dae8SSam Ravnborg *(.security_initcall.init) \ 656ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__security_initcall_end) = .; 657ef53dae8SSam Ravnborg 658ef53dae8SSam Ravnborg #ifdef CONFIG_BLK_DEV_INITRD 659ef53dae8SSam Ravnborg #define INIT_RAM_FS \ 660d8826262SMike Frysinger . = ALIGN(4); \ 661ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initramfs_start) = .; \ 662ef53dae8SSam Ravnborg *(.init.ramfs) \ 663ffe8018cSHendrik Brueckner . = ALIGN(8); \ 664ffe8018cSHendrik Brueckner *(.init.ramfs.info) 665ef53dae8SSam Ravnborg #else 666eadfe219SDavid Howells #define INIT_RAM_FS 667ef53dae8SSam Ravnborg #endif 668ef53dae8SSam Ravnborg 669023bf6f1STejun Heo /* 670023bf6f1STejun Heo * Default discarded sections. 671023bf6f1STejun Heo * 672023bf6f1STejun Heo * Some archs want to discard exit text/data at runtime rather than 673023bf6f1STejun Heo * link time due to cross-section references such as alt instructions, 674023bf6f1STejun Heo * bug table, eh_frame, etc. DISCARDS must be the last of output 675023bf6f1STejun Heo * section definitions so that such archs put those in earlier section 676023bf6f1STejun Heo * definitions. 677023bf6f1STejun Heo */ 678405d967dSTejun Heo #define DISCARDS \ 679405d967dSTejun Heo /DISCARD/ : { \ 680405d967dSTejun Heo EXIT_TEXT \ 681405d967dSTejun Heo EXIT_DATA \ 682023bf6f1STejun Heo EXIT_CALL \ 683405d967dSTejun Heo *(.discard) \ 684c7f52cdcSJeremy Fitzhardinge *(.discard.*) \ 685405d967dSTejun Heo } 686405d967dSTejun Heo 6873e5d8f97STejun Heo /** 6886ea0c34dSMike Frysinger * PERCPU_INPUT - the percpu input sections 6896ea0c34dSMike Frysinger * @cacheline: cacheline size 6906ea0c34dSMike Frysinger * 6916ea0c34dSMike Frysinger * The core percpu section names and core symbols which do not rely 6926ea0c34dSMike Frysinger * directly upon load addresses. 6936ea0c34dSMike Frysinger * 6946ea0c34dSMike Frysinger * @cacheline is used to align subsections to avoid false cacheline 6956ea0c34dSMike Frysinger * sharing between subsections for different purposes. 6966ea0c34dSMike Frysinger */ 6976ea0c34dSMike Frysinger #define PERCPU_INPUT(cacheline) \ 6986ea0c34dSMike Frysinger VMLINUX_SYMBOL(__per_cpu_start) = .; \ 6996ea0c34dSMike Frysinger *(.data..percpu..first) \ 7006ea0c34dSMike Frysinger . = ALIGN(PAGE_SIZE); \ 7016ea0c34dSMike Frysinger *(.data..percpu..page_aligned) \ 7026ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 703330d2822SZhengyu He *(.data..percpu..read_mostly) \ 7046ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 7056ea0c34dSMike Frysinger *(.data..percpu) \ 7066ea0c34dSMike Frysinger *(.data..percpu..shared_aligned) \ 7076ea0c34dSMike Frysinger VMLINUX_SYMBOL(__per_cpu_end) = .; 7086ea0c34dSMike Frysinger 7096ea0c34dSMike Frysinger /** 7106b7c38d5STejun Heo * PERCPU_VADDR - define output section for percpu area 71119df0c2fSTejun Heo * @cacheline: cacheline size 7123e5d8f97STejun Heo * @vaddr: explicit base address (optional) 7133e5d8f97STejun Heo * @phdr: destination PHDR (optional) 7143e5d8f97STejun Heo * 71519df0c2fSTejun Heo * Macro which expands to output section for percpu area. 71619df0c2fSTejun Heo * 71719df0c2fSTejun Heo * @cacheline is used to align subsections to avoid false cacheline 71819df0c2fSTejun Heo * sharing between subsections for different purposes. 71919df0c2fSTejun Heo * 72019df0c2fSTejun Heo * If @vaddr is not blank, it specifies explicit base address and all 72119df0c2fSTejun Heo * percpu symbols will be offset from the given address. If blank, 72219df0c2fSTejun Heo * @vaddr always equals @laddr + LOAD_OFFSET. 7233e5d8f97STejun Heo * 7243e5d8f97STejun Heo * @phdr defines the output PHDR to use if not blank. Be warned that 7253e5d8f97STejun Heo * output PHDR is sticky. If @phdr is specified, the next output 7263e5d8f97STejun Heo * section in the linker script will go there too. @phdr should have 7273e5d8f97STejun Heo * a leading colon. 7283e5d8f97STejun Heo * 7293ac6cffeSTejun Heo * Note that this macros defines __per_cpu_load as an absolute symbol. 7303ac6cffeSTejun Heo * If there is no need to put the percpu section at a predetermined 7310415b00dSTejun Heo * address, use PERCPU_SECTION. 7323e5d8f97STejun Heo */ 73319df0c2fSTejun Heo #define PERCPU_VADDR(cacheline, vaddr, phdr) \ 734dba3d36bSIngo Molnar VMLINUX_SYMBOL(__per_cpu_load) = .; \ 7353d9a854cSDenys Vlasenko .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ 7366b7c38d5STejun Heo - LOAD_OFFSET) { \ 7376ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 7386b7c38d5STejun Heo } phdr \ 7393d9a854cSDenys Vlasenko . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data..percpu); 7403e5d8f97STejun Heo 7413e5d8f97STejun Heo /** 7420415b00dSTejun Heo * PERCPU_SECTION - define output section for percpu area, simple version 74319df0c2fSTejun Heo * @cacheline: cacheline size 7443e5d8f97STejun Heo * 7450415b00dSTejun Heo * Align to PAGE_SIZE and outputs output section for percpu area. This 7460415b00dSTejun Heo * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and 7473e5d8f97STejun Heo * __per_cpu_start will be identical. 7483ac6cffeSTejun Heo * 7490415b00dSTejun Heo * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,) 75019df0c2fSTejun Heo * except that __per_cpu_load is defined as a relative symbol against 75119df0c2fSTejun Heo * .data..percpu which is required for relocatable x86_32 configuration. 7523e5d8f97STejun Heo */ 7530415b00dSTejun Heo #define PERCPU_SECTION(cacheline) \ 7540415b00dSTejun Heo . = ALIGN(PAGE_SIZE); \ 7553d9a854cSDenys Vlasenko .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ 7563ac6cffeSTejun Heo VMLINUX_SYMBOL(__per_cpu_load) = .; \ 7576ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 7583ac6cffeSTejun Heo } 759ef53dae8SSam Ravnborg 760ef53dae8SSam Ravnborg 761ef53dae8SSam Ravnborg /* 762ef53dae8SSam Ravnborg * Definition of the high level *_SECTION macros 763ef53dae8SSam Ravnborg * They will fit only a subset of the architectures 764ef53dae8SSam Ravnborg */ 765ef53dae8SSam Ravnborg 766ef53dae8SSam Ravnborg 767ef53dae8SSam Ravnborg /* 768ef53dae8SSam Ravnborg * Writeable data. 769ef53dae8SSam Ravnborg * All sections are combined in a single .data section. 770ef53dae8SSam Ravnborg * The sections following CONSTRUCTORS are arranged so their 771ef53dae8SSam Ravnborg * typical alignment matches. 772ef53dae8SSam Ravnborg * A cacheline is typical/always less than a PAGE_SIZE so 773ef53dae8SSam Ravnborg * the sections that has this restriction (or similar) 774ef53dae8SSam Ravnborg * is located before the ones requiring PAGE_SIZE alignment. 775ef53dae8SSam Ravnborg * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which 77625985edcSLucas De Marchi * matches the requirement of PAGE_ALIGNED_DATA. 777ef53dae8SSam Ravnborg * 7787923f90fSSam Ravnborg * use 0 as page_align if page_aligned data is not used */ 77973f1d939SPaul Mundt #define RW_DATA_SECTION(cacheline, pagealigned, inittask) \ 780ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 781ef53dae8SSam Ravnborg .data : AT(ADDR(.data) - LOAD_OFFSET) { \ 78239a449d9STim Abbott INIT_TASK_DATA(inittask) \ 7831b208622STim Abbott NOSAVE_DATA \ 7841b208622STim Abbott PAGE_ALIGNED_DATA(pagealigned) \ 785ef53dae8SSam Ravnborg CACHELINE_ALIGNED_DATA(cacheline) \ 786ef53dae8SSam Ravnborg READ_MOSTLY_DATA(cacheline) \ 787ef53dae8SSam Ravnborg DATA_DATA \ 788ef53dae8SSam Ravnborg CONSTRUCTORS \ 789ef53dae8SSam Ravnborg } 790ef53dae8SSam Ravnborg 791ef53dae8SSam Ravnborg #define INIT_TEXT_SECTION(inittext_align) \ 792ef53dae8SSam Ravnborg . = ALIGN(inittext_align); \ 793ef53dae8SSam Ravnborg .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { \ 794ef53dae8SSam Ravnborg VMLINUX_SYMBOL(_sinittext) = .; \ 795ef53dae8SSam Ravnborg INIT_TEXT \ 796ef53dae8SSam Ravnborg VMLINUX_SYMBOL(_einittext) = .; \ 797ef53dae8SSam Ravnborg } 798ef53dae8SSam Ravnborg 799ef53dae8SSam Ravnborg #define INIT_DATA_SECTION(initsetup_align) \ 800ef53dae8SSam Ravnborg .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { \ 801ef53dae8SSam Ravnborg INIT_DATA \ 802ef53dae8SSam Ravnborg INIT_SETUP(initsetup_align) \ 803ef53dae8SSam Ravnborg INIT_CALLS \ 804ef53dae8SSam Ravnborg CON_INITCALL \ 805ef53dae8SSam Ravnborg SECURITY_INITCALL \ 806ef53dae8SSam Ravnborg INIT_RAM_FS \ 807ef53dae8SSam Ravnborg } 808ef53dae8SSam Ravnborg 80904e448d9STim Abbott #define BSS_SECTION(sbss_align, bss_align, stop_align) \ 81004e448d9STim Abbott . = ALIGN(sbss_align); \ 81104e448d9STim Abbott VMLINUX_SYMBOL(__bss_start) = .; \ 81204e448d9STim Abbott SBSS(sbss_align) \ 813ef53dae8SSam Ravnborg BSS(bss_align) \ 81404e448d9STim Abbott . = ALIGN(stop_align); \ 81504e448d9STim Abbott VMLINUX_SYMBOL(__bss_stop) = .; 816