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(...) 18ef53dae8SSam Ravnborg * PERCPU(PAGE_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 43ef53dae8SSam Ravnborg * [_stext, _etext] is the text section 44ef53dae8SSam Ravnborg * [_sdata, _edata] is the data section 45ef53dae8SSam Ravnborg * 46ef53dae8SSam Ravnborg * Some of the included output section have their own set of constants. 47ef53dae8SSam Ravnborg * Examples are: [__initramfs_start, __initramfs_end] for initramfs and 48ef53dae8SSam Ravnborg * [__nosave_begin, __nosave_end] for the nosave data 49ef53dae8SSam Ravnborg */ 50c80d471aSTim Abbott 511da177e4SLinus Torvalds #ifndef LOAD_OFFSET 521da177e4SLinus Torvalds #define LOAD_OFFSET 0 531da177e4SLinus Torvalds #endif 541da177e4SLinus Torvalds 559e1b9b80SAlan Jenkins #ifndef SYMBOL_PREFIX 569e1b9b80SAlan Jenkins #define VMLINUX_SYMBOL(sym) sym 579e1b9b80SAlan Jenkins #else 589e1b9b80SAlan Jenkins #define PASTE2(x,y) x##y 599e1b9b80SAlan Jenkins #define PASTE(x,y) PASTE2(x,y) 609e1b9b80SAlan Jenkins #define VMLINUX_SYMBOL(sym) PASTE(SYMBOL_PREFIX, sym) 611da177e4SLinus Torvalds #endif 621da177e4SLinus Torvalds 636d30e3a8SSam Ravnborg /* Align . to a 8 byte boundary equals to maximum function alignment. */ 646d30e3a8SSam Ravnborg #define ALIGN_FUNCTION() . = ALIGN(8) 656d30e3a8SSam Ravnborg 6607fca0e5SSam Ravnborg /* 6707fca0e5SSam Ravnborg * Align to a 32 byte boundary equal to the 6807fca0e5SSam Ravnborg * alignment gcc 4.5 uses for a struct 6907fca0e5SSam Ravnborg */ 7007fca0e5SSam Ravnborg #define STRUCT_ALIGN() . = ALIGN(32) 7107fca0e5SSam Ravnborg 72eb8f6890SSam Ravnborg /* The actual configuration determine if the init/exit sections 73eb8f6890SSam Ravnborg * are handled as text/data or they can be discarded (which 74eb8f6890SSam Ravnborg * often happens at runtime) 75eb8f6890SSam Ravnborg */ 76eb8f6890SSam Ravnborg #ifdef CONFIG_HOTPLUG 77eb8f6890SSam Ravnborg #define DEV_KEEP(sec) *(.dev##sec) 78eb8f6890SSam Ravnborg #define DEV_DISCARD(sec) 79eb8f6890SSam Ravnborg #else 80eb8f6890SSam Ravnborg #define DEV_KEEP(sec) 81eb8f6890SSam Ravnborg #define DEV_DISCARD(sec) *(.dev##sec) 82eb8f6890SSam Ravnborg #endif 83eb8f6890SSam Ravnborg 84eb8f6890SSam Ravnborg #ifdef CONFIG_HOTPLUG_CPU 85eb8f6890SSam Ravnborg #define CPU_KEEP(sec) *(.cpu##sec) 86eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) 87eb8f6890SSam Ravnborg #else 88eb8f6890SSam Ravnborg #define CPU_KEEP(sec) 89eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) *(.cpu##sec) 90eb8f6890SSam Ravnborg #endif 91eb8f6890SSam Ravnborg 921a3fb6d4SAdrian Bunk #if defined(CONFIG_MEMORY_HOTPLUG) 93eb8f6890SSam Ravnborg #define MEM_KEEP(sec) *(.mem##sec) 94eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) 95eb8f6890SSam Ravnborg #else 96eb8f6890SSam Ravnborg #define MEM_KEEP(sec) 97eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) *(.mem##sec) 98eb8f6890SSam Ravnborg #endif 99eb8f6890SSam Ravnborg 1008da3821bSSteven Rostedt #ifdef CONFIG_FTRACE_MCOUNT_RECORD 1014b3b4c5eSJohn Reiser #define MCOUNT_REC() . = ALIGN(8); \ 1024b3b4c5eSJohn Reiser VMLINUX_SYMBOL(__start_mcount_loc) = .; \ 1038da3821bSSteven Rostedt *(__mcount_loc) \ 1048da3821bSSteven Rostedt VMLINUX_SYMBOL(__stop_mcount_loc) = .; 1058da3821bSSteven Rostedt #else 1068da3821bSSteven Rostedt #define MCOUNT_REC() 1078da3821bSSteven Rostedt #endif 108eb8f6890SSam Ravnborg 1092ed84eebSSteven Rostedt #ifdef CONFIG_TRACE_BRANCH_PROFILING 11045b79749SSteven Rostedt #define LIKELY_PROFILE() VMLINUX_SYMBOL(__start_annotated_branch_profile) = .; \ 11145b79749SSteven Rostedt *(_ftrace_annotated_branch) \ 11245b79749SSteven Rostedt VMLINUX_SYMBOL(__stop_annotated_branch_profile) = .; 1131f0d69a9SSteven Rostedt #else 1141f0d69a9SSteven Rostedt #define LIKELY_PROFILE() 1151f0d69a9SSteven Rostedt #endif 1161f0d69a9SSteven Rostedt 1172bcd521aSSteven Rostedt #ifdef CONFIG_PROFILE_ALL_BRANCHES 1182bcd521aSSteven Rostedt #define BRANCH_PROFILE() VMLINUX_SYMBOL(__start_branch_profile) = .; \ 1192bcd521aSSteven Rostedt *(_ftrace_branch) \ 1202bcd521aSSteven Rostedt VMLINUX_SYMBOL(__stop_branch_profile) = .; 1212bcd521aSSteven Rostedt #else 1222bcd521aSSteven Rostedt #define BRANCH_PROFILE() 1232bcd521aSSteven Rostedt #endif 1242bcd521aSSteven Rostedt 1255f77a88bSTom Zanussi #ifdef CONFIG_EVENT_TRACING 126b77e38aaSSteven Rostedt #define FTRACE_EVENTS() VMLINUX_SYMBOL(__start_ftrace_events) = .; \ 127b77e38aaSSteven Rostedt *(_ftrace_events) \ 128b77e38aaSSteven Rostedt VMLINUX_SYMBOL(__stop_ftrace_events) = .; 129b77e38aaSSteven Rostedt #else 130b77e38aaSSteven Rostedt #define FTRACE_EVENTS() 131b77e38aaSSteven Rostedt #endif 132b77e38aaSSteven Rostedt 1331ba28e02SLai Jiangshan #ifdef CONFIG_TRACING 1341ba28e02SLai Jiangshan #define TRACE_PRINTKS() VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .; \ 1351ba28e02SLai Jiangshan *(__trace_printk_fmt) /* Trace_printk fmt' pointer */ \ 1361ba28e02SLai Jiangshan VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .; 1371ba28e02SLai Jiangshan #else 1381ba28e02SLai Jiangshan #define TRACE_PRINTKS() 1391ba28e02SLai Jiangshan #endif 1401ba28e02SLai Jiangshan 141bed1ffcaSFrederic Weisbecker #ifdef CONFIG_FTRACE_SYSCALLS 142bed1ffcaSFrederic Weisbecker #define TRACE_SYSCALLS() VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \ 143bed1ffcaSFrederic Weisbecker *(__syscalls_metadata) \ 144bed1ffcaSFrederic Weisbecker VMLINUX_SYMBOL(__stop_syscalls_metadata) = .; 145bed1ffcaSFrederic Weisbecker #else 146bed1ffcaSFrederic Weisbecker #define TRACE_SYSCALLS() 147bed1ffcaSFrederic Weisbecker #endif 148bed1ffcaSFrederic Weisbecker 149ca967258SSam Ravnborg /* .data section */ 150ca967258SSam Ravnborg #define DATA_DATA \ 1510e0d314eSSam Ravnborg *(.data) \ 152312b1485SSam Ravnborg *(.ref.data) \ 153eb8f6890SSam Ravnborg DEV_KEEP(init.data) \ 154eb8f6890SSam Ravnborg DEV_KEEP(exit.data) \ 155eb8f6890SSam Ravnborg CPU_KEEP(init.data) \ 156eb8f6890SSam Ravnborg CPU_KEEP(exit.data) \ 157eb8f6890SSam Ravnborg MEM_KEEP(init.data) \ 158eb8f6890SSam Ravnborg MEM_KEEP(exit.data) \ 1597e066fb8SMathieu Desnoyers . = ALIGN(32); \ 16097e1c18eSMathieu Desnoyers VMLINUX_SYMBOL(__start___tracepoints) = .; \ 16197e1c18eSMathieu Desnoyers *(__tracepoints) \ 1621f0d69a9SSteven Rostedt VMLINUX_SYMBOL(__stop___tracepoints) = .; \ 163e9d376f0SJason Baron /* implement dynamic printk debug */ \ 164e9d376f0SJason Baron . = ALIGN(8); \ 165e9d376f0SJason Baron VMLINUX_SYMBOL(__start___verbose) = .; \ 166e9d376f0SJason Baron *(__verbose) \ 167e9d376f0SJason Baron VMLINUX_SYMBOL(__stop___verbose) = .; \ 1682bcd521aSSteven Rostedt LIKELY_PROFILE() \ 169b77e38aaSSteven Rostedt BRANCH_PROFILE() \ 1708a20d84dSIngo Molnar TRACE_PRINTKS() \ 17107fca0e5SSam Ravnborg \ 17207fca0e5SSam Ravnborg STRUCT_ALIGN(); \ 173bed1ffcaSFrederic Weisbecker FTRACE_EVENTS() \ 17407fca0e5SSam Ravnborg \ 17507fca0e5SSam Ravnborg STRUCT_ALIGN(); \ 176bed1ffcaSFrederic Weisbecker TRACE_SYSCALLS() 177ca967258SSam Ravnborg 178ef53dae8SSam Ravnborg /* 179ef53dae8SSam Ravnborg * Data section helpers 180ef53dae8SSam Ravnborg */ 181ef53dae8SSam Ravnborg #define NOSAVE_DATA \ 182ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 183ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__nosave_begin) = .; \ 18407b3bb1eSDenys Vlasenko *(.data..nosave) \ 185ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 186ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__nosave_end) = .; 187ef53dae8SSam Ravnborg 188ef53dae8SSam Ravnborg #define PAGE_ALIGNED_DATA(page_align) \ 189ef53dae8SSam Ravnborg . = ALIGN(page_align); \ 19075b13483STim Abbott *(.data..page_aligned) 191ef53dae8SSam Ravnborg 192ef53dae8SSam Ravnborg #define READ_MOSTLY_DATA(align) \ 193ef53dae8SSam Ravnborg . = ALIGN(align); \ 19454cb27a7SDenys Vlasenko *(.data..read_mostly) 195ef53dae8SSam Ravnborg 196ef53dae8SSam Ravnborg #define CACHELINE_ALIGNED_DATA(align) \ 197ef53dae8SSam Ravnborg . = ALIGN(align); \ 1984af57b78STim Abbott *(.data..cacheline_aligned) 199ef53dae8SSam Ravnborg 20039a449d9STim Abbott #define INIT_TASK_DATA(align) \ 201ef53dae8SSam Ravnborg . = ALIGN(align); \ 2022af7687fSTim Abbott *(.data..init_task) 203ef53dae8SSam Ravnborg 204ef53dae8SSam Ravnborg /* 205ef53dae8SSam Ravnborg * Read only Data 206ef53dae8SSam Ravnborg */ 207ef53dae8SSam Ravnborg #define RO_DATA_SECTION(align) \ 2084096b46fSSam Ravnborg . = ALIGN((align)); \ 2091da177e4SLinus Torvalds .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ 2106569580dSVivek Goyal VMLINUX_SYMBOL(__start_rodata) = .; \ 2111da177e4SLinus Torvalds *(.rodata) *(.rodata.*) \ 2121da177e4SLinus Torvalds *(__vermagic) /* Kernel version magic */ \ 2138256e47cSMathieu Desnoyers *(__markers_strings) /* Markers: strings */ \ 21497e1c18eSMathieu Desnoyers *(__tracepoints_strings)/* Tracepoints: strings */ \ 2151da177e4SLinus Torvalds } \ 2161da177e4SLinus Torvalds \ 2171da177e4SLinus Torvalds .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \ 2181da177e4SLinus Torvalds *(.rodata1) \ 2191da177e4SLinus Torvalds } \ 2201da177e4SLinus Torvalds \ 2216360b1fbSJan Beulich BUG_TABLE \ 2226360b1fbSJan Beulich \ 223bf5438fcSJason Baron JUMP_TABLE \ 224bf5438fcSJason Baron \ 2251da177e4SLinus Torvalds /* PCI quirks */ \ 2261da177e4SLinus Torvalds .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ 2271da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \ 2281da177e4SLinus Torvalds *(.pci_fixup_early) \ 2291da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_early) = .; \ 2301da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_header) = .; \ 2311da177e4SLinus Torvalds *(.pci_fixup_header) \ 2321da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_header) = .; \ 2331da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_final) = .; \ 2341da177e4SLinus Torvalds *(.pci_fixup_final) \ 2351da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_final) = .; \ 2361da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_enable) = .; \ 2371da177e4SLinus Torvalds *(.pci_fixup_enable) \ 2381da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_enable) = .; \ 2391597cacbSAlan Cox VMLINUX_SYMBOL(__start_pci_fixups_resume) = .; \ 2401597cacbSAlan Cox *(.pci_fixup_resume) \ 2411597cacbSAlan Cox VMLINUX_SYMBOL(__end_pci_fixups_resume) = .; \ 242e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .; \ 243e1a2a51eSRafael J. Wysocki *(.pci_fixup_resume_early) \ 244e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .; \ 245e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .; \ 246e1a2a51eSRafael J. Wysocki *(.pci_fixup_suspend) \ 247e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .; \ 2481da177e4SLinus Torvalds } \ 2491da177e4SLinus Torvalds \ 2505658c769SDavid Woodhouse /* Built-in firmware blobs */ \ 2515658c769SDavid Woodhouse .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \ 2525658c769SDavid Woodhouse VMLINUX_SYMBOL(__start_builtin_fw) = .; \ 2535658c769SDavid Woodhouse *(.builtin_fw) \ 2545658c769SDavid Woodhouse VMLINUX_SYMBOL(__end_builtin_fw) = .; \ 2555658c769SDavid Woodhouse } \ 2565658c769SDavid Woodhouse \ 257394b701cSMatt Porter /* RapidIO route ops */ \ 258e5cabeb3SAlexandre Bounine .rio_ops : AT(ADDR(.rio_ops) - LOAD_OFFSET) { \ 259058f88d6SAlexandre Bounine VMLINUX_SYMBOL(__start_rio_switch_ops) = .; \ 260058f88d6SAlexandre Bounine *(.rio_switch_ops) \ 261058f88d6SAlexandre Bounine VMLINUX_SYMBOL(__end_rio_switch_ops) = .; \ 262394b701cSMatt Porter } \ 263394b701cSMatt Porter \ 26463687a52SJan Beulich TRACEDATA \ 26563687a52SJan Beulich \ 2661da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 2671da177e4SLinus Torvalds __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ 2681da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___ksymtab) = .; \ 2691da177e4SLinus Torvalds *(__ksymtab) \ 2701da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___ksymtab) = .; \ 2711da177e4SLinus Torvalds } \ 2721da177e4SLinus Torvalds \ 2731da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 2741da177e4SLinus Torvalds __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ 2751da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \ 2761da177e4SLinus Torvalds *(__ksymtab_gpl) \ 2771da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \ 2781da177e4SLinus Torvalds } \ 2791da177e4SLinus Torvalds \ 280f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 281f71d20e9SArjan van de Ven __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ 282f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \ 283f71d20e9SArjan van de Ven *(__ksymtab_unused) \ 284f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \ 285f71d20e9SArjan van de Ven } \ 286f71d20e9SArjan van de Ven \ 287f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 288f71d20e9SArjan van de Ven __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ 289f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \ 290f71d20e9SArjan van de Ven *(__ksymtab_unused_gpl) \ 291f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \ 292f71d20e9SArjan van de Ven } \ 293f71d20e9SArjan van de Ven \ 2949f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 2959f28bb7eSGreg Kroah-Hartman __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ 2969f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \ 2979f28bb7eSGreg Kroah-Hartman *(__ksymtab_gpl_future) \ 2989f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \ 2999f28bb7eSGreg Kroah-Hartman } \ 3009f28bb7eSGreg Kroah-Hartman \ 3011da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 3021da177e4SLinus Torvalds __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ 3031da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___kcrctab) = .; \ 3041da177e4SLinus Torvalds *(__kcrctab) \ 3051da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___kcrctab) = .; \ 3061da177e4SLinus Torvalds } \ 3071da177e4SLinus Torvalds \ 3081da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 3091da177e4SLinus Torvalds __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ 3101da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___kcrctab_gpl) = .; \ 3111da177e4SLinus Torvalds *(__kcrctab_gpl) \ 3121da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \ 3131da177e4SLinus Torvalds } \ 3141da177e4SLinus Torvalds \ 315f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 316f71d20e9SArjan van de Ven __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \ 317f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___kcrctab_unused) = .; \ 318f71d20e9SArjan van de Ven *(__kcrctab_unused) \ 319f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___kcrctab_unused) = .; \ 320f71d20e9SArjan van de Ven } \ 321f71d20e9SArjan van de Ven \ 322f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 323f71d20e9SArjan van de Ven __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ 324f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \ 325f71d20e9SArjan van de Ven *(__kcrctab_unused_gpl) \ 326f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .; \ 327f71d20e9SArjan van de Ven } \ 328f71d20e9SArjan van de Ven \ 3299f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 3309f28bb7eSGreg Kroah-Hartman __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ 3319f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \ 3329f28bb7eSGreg Kroah-Hartman *(__kcrctab_gpl_future) \ 3339f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \ 3349f28bb7eSGreg Kroah-Hartman } \ 3359f28bb7eSGreg Kroah-Hartman \ 3361da177e4SLinus Torvalds /* Kernel symbol table: strings */ \ 3371da177e4SLinus Torvalds __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ 3381da177e4SLinus Torvalds *(__ksymtab_strings) \ 3391da177e4SLinus Torvalds } \ 3401da177e4SLinus Torvalds \ 341eb8f6890SSam Ravnborg /* __*init sections */ \ 342eb8f6890SSam Ravnborg __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) { \ 343312b1485SSam Ravnborg *(.ref.rodata) \ 344eb8f6890SSam Ravnborg DEV_KEEP(init.rodata) \ 345eb8f6890SSam Ravnborg DEV_KEEP(exit.rodata) \ 346eb8f6890SSam Ravnborg CPU_KEEP(init.rodata) \ 347eb8f6890SSam Ravnborg CPU_KEEP(exit.rodata) \ 348eb8f6890SSam Ravnborg MEM_KEEP(init.rodata) \ 349eb8f6890SSam Ravnborg MEM_KEEP(exit.rodata) \ 350eb8f6890SSam Ravnborg } \ 351eb8f6890SSam Ravnborg \ 3521da177e4SLinus Torvalds /* Built-in module parameters. */ \ 3531da177e4SLinus Torvalds __param : AT(ADDR(__param) - LOAD_OFFSET) { \ 3541da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___param) = .; \ 3551da177e4SLinus Torvalds *(__param) \ 3561da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___param) = .; \ 357edeed305SArjan van de Ven . = ALIGN((align)); \ 3586569580dSVivek Goyal VMLINUX_SYMBOL(__end_rodata) = .; \ 3597583ddfdSMarcelo Tosatti } \ 3604096b46fSSam Ravnborg . = ALIGN((align)); 3614096b46fSSam Ravnborg 362ef53dae8SSam Ravnborg /* RODATA & RO_DATA provided for backward compatibility. 3634096b46fSSam Ravnborg * All archs are supposed to use RO_DATA() */ 364ef53dae8SSam Ravnborg #define RODATA RO_DATA_SECTION(4096) 365ef53dae8SSam Ravnborg #define RO_DATA(align) RO_DATA_SECTION(align) 3661da177e4SLinus Torvalds 3671da177e4SLinus Torvalds #define SECURITY_INIT \ 36860bad7faSEric W. Biederman .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \ 3691da177e4SLinus Torvalds VMLINUX_SYMBOL(__security_initcall_start) = .; \ 3701da177e4SLinus Torvalds *(.security_initcall.init) \ 3711da177e4SLinus Torvalds VMLINUX_SYMBOL(__security_initcall_end) = .; \ 3721da177e4SLinus Torvalds } 3731da177e4SLinus Torvalds 3747664709bSSam Ravnborg /* .text section. Map to function alignment to avoid address changes 3757664709bSSam Ravnborg * during second ld run in second ld pass when generating System.map */ 3767664709bSSam Ravnborg #define TEXT_TEXT \ 3777664709bSSam Ravnborg ALIGN_FUNCTION(); \ 378fb5e2b37SJan Beulich *(.text.hot) \ 3790e0d314eSSam Ravnborg *(.text) \ 380312b1485SSam Ravnborg *(.ref.text) \ 381eb8f6890SSam Ravnborg DEV_KEEP(init.text) \ 382eb8f6890SSam Ravnborg DEV_KEEP(exit.text) \ 383eb8f6890SSam Ravnborg CPU_KEEP(init.text) \ 384eb8f6890SSam Ravnborg CPU_KEEP(exit.text) \ 385eb8f6890SSam Ravnborg MEM_KEEP(init.text) \ 386fb5e2b37SJan Beulich MEM_KEEP(exit.text) \ 387fb5e2b37SJan Beulich *(.text.unlikely) 388eb8f6890SSam Ravnborg 3897664709bSSam Ravnborg 3906d30e3a8SSam Ravnborg /* sched.text is aling to function alignment to secure we have same 3916d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 3921da177e4SLinus Torvalds #define SCHED_TEXT \ 3936d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 3941da177e4SLinus Torvalds VMLINUX_SYMBOL(__sched_text_start) = .; \ 3951da177e4SLinus Torvalds *(.sched.text) \ 3961da177e4SLinus Torvalds VMLINUX_SYMBOL(__sched_text_end) = .; 3971da177e4SLinus Torvalds 3986d30e3a8SSam Ravnborg /* spinlock.text is aling to function alignment to secure we have same 3996d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 4001da177e4SLinus Torvalds #define LOCK_TEXT \ 4016d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 4021da177e4SLinus Torvalds VMLINUX_SYMBOL(__lock_text_start) = .; \ 4031da177e4SLinus Torvalds *(.spinlock.text) \ 4041da177e4SLinus Torvalds VMLINUX_SYMBOL(__lock_text_end) = .; 405d0aaff97SPrasanna S Panchamukhi 406d0aaff97SPrasanna S Panchamukhi #define KPROBES_TEXT \ 407d0aaff97SPrasanna S Panchamukhi ALIGN_FUNCTION(); \ 408d0aaff97SPrasanna S Panchamukhi VMLINUX_SYMBOL(__kprobes_text_start) = .; \ 409d0aaff97SPrasanna S Panchamukhi *(.kprobes.text) \ 410d0aaff97SPrasanna S Panchamukhi VMLINUX_SYMBOL(__kprobes_text_end) = .; 411a7d0c210SPaolo 'Blaisorblade' Giarrusso 412a0343e82SFrederic Weisbecker #ifdef CONFIG_FUNCTION_GRAPH_TRACER 413a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT \ 414a0343e82SFrederic Weisbecker ALIGN_FUNCTION(); \ 415a0343e82SFrederic Weisbecker VMLINUX_SYMBOL(__irqentry_text_start) = .; \ 416a0343e82SFrederic Weisbecker *(.irqentry.text) \ 417a0343e82SFrederic Weisbecker VMLINUX_SYMBOL(__irqentry_text_end) = .; 418a0343e82SFrederic Weisbecker #else 419a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT 420a0343e82SFrederic Weisbecker #endif 421a0343e82SFrederic Weisbecker 42237c514e3SSam Ravnborg /* Section used for early init (in .S files) */ 4237923f90fSSam Ravnborg #define HEAD_TEXT *(.head.text) 42437c514e3SSam Ravnborg 4257923f90fSSam Ravnborg #define HEAD_TEXT_SECTION \ 426ef53dae8SSam Ravnborg .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) { \ 427ef53dae8SSam Ravnborg HEAD_TEXT \ 428ef53dae8SSam Ravnborg } 429ef53dae8SSam Ravnborg 430ef53dae8SSam Ravnborg /* 431ef53dae8SSam Ravnborg * Exception table 432ef53dae8SSam Ravnborg */ 433ef53dae8SSam Ravnborg #define EXCEPTION_TABLE(align) \ 434ef53dae8SSam Ravnborg . = ALIGN(align); \ 435ef53dae8SSam Ravnborg __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \ 436ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__start___ex_table) = .; \ 437ef53dae8SSam Ravnborg *(__ex_table) \ 438ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__stop___ex_table) = .; \ 439ef53dae8SSam Ravnborg } 440ef53dae8SSam Ravnborg 441ef53dae8SSam Ravnborg /* 442ef53dae8SSam Ravnborg * Init task 443ef53dae8SSam Ravnborg */ 44439a449d9STim Abbott #define INIT_TASK_DATA_SECTION(align) \ 445ef53dae8SSam Ravnborg . = ALIGN(align); \ 446da5e37efSSam Ravnborg .data..init_task : AT(ADDR(.data..init_task) - LOAD_OFFSET) { \ 44739a449d9STim Abbott INIT_TASK_DATA(align) \ 448ef53dae8SSam Ravnborg } 449eb8f6890SSam Ravnborg 450b99b87f7SPeter Oberparleiter #ifdef CONFIG_CONSTRUCTORS 4512a2325e6SHeiko Carstens #define KERNEL_CTORS() . = ALIGN(8); \ 4522a2325e6SHeiko Carstens VMLINUX_SYMBOL(__ctors_start) = .; \ 453b99b87f7SPeter Oberparleiter *(.ctors) \ 454b99b87f7SPeter Oberparleiter VMLINUX_SYMBOL(__ctors_end) = .; 455b99b87f7SPeter Oberparleiter #else 456b99b87f7SPeter Oberparleiter #define KERNEL_CTORS() 457b99b87f7SPeter Oberparleiter #endif 458b99b87f7SPeter Oberparleiter 45901ba2bdcSSam Ravnborg /* init and exit section handling */ 460eb8f6890SSam Ravnborg #define INIT_DATA \ 461eb8f6890SSam Ravnborg *(.init.data) \ 462eb8f6890SSam Ravnborg DEV_DISCARD(init.data) \ 463eb8f6890SSam Ravnborg CPU_DISCARD(init.data) \ 464eb8f6890SSam Ravnborg MEM_DISCARD(init.data) \ 465b99b87f7SPeter Oberparleiter KERNEL_CTORS() \ 466fd6c3a8dSJan Beulich *(.init.rodata) \ 4674b3b4c5eSJohn Reiser MCOUNT_REC() \ 468fd6c3a8dSJan Beulich DEV_DISCARD(init.rodata) \ 469fd6c3a8dSJan Beulich CPU_DISCARD(init.rodata) \ 470e9d376f0SJason Baron MEM_DISCARD(init.rodata) 47101ba2bdcSSam Ravnborg 472eb8f6890SSam Ravnborg #define INIT_TEXT \ 473eb8f6890SSam Ravnborg *(.init.text) \ 474eb8f6890SSam Ravnborg DEV_DISCARD(init.text) \ 475eb8f6890SSam Ravnborg CPU_DISCARD(init.text) \ 476eb8f6890SSam Ravnborg MEM_DISCARD(init.text) 477eb8f6890SSam Ravnborg 478eb8f6890SSam Ravnborg #define EXIT_DATA \ 479eb8f6890SSam Ravnborg *(.exit.data) \ 480eb8f6890SSam Ravnborg DEV_DISCARD(exit.data) \ 481eb8f6890SSam Ravnborg DEV_DISCARD(exit.rodata) \ 482eb8f6890SSam Ravnborg CPU_DISCARD(exit.data) \ 483eb8f6890SSam Ravnborg CPU_DISCARD(exit.rodata) \ 484eb8f6890SSam Ravnborg MEM_DISCARD(exit.data) \ 485eb8f6890SSam Ravnborg MEM_DISCARD(exit.rodata) 486eb8f6890SSam Ravnborg 487eb8f6890SSam Ravnborg #define EXIT_TEXT \ 488eb8f6890SSam Ravnborg *(.exit.text) \ 489eb8f6890SSam Ravnborg DEV_DISCARD(exit.text) \ 490eb8f6890SSam Ravnborg CPU_DISCARD(exit.text) \ 491eb8f6890SSam Ravnborg MEM_DISCARD(exit.text) 49201ba2bdcSSam Ravnborg 4937923f90fSSam Ravnborg #define EXIT_CALL \ 4947923f90fSSam Ravnborg *(.exitcall.exit) 4957923f90fSSam Ravnborg 496ef53dae8SSam Ravnborg /* 497ef53dae8SSam Ravnborg * bss (Block Started by Symbol) - uninitialized data 498ef53dae8SSam Ravnborg * zeroed during startup 499ef53dae8SSam Ravnborg */ 50004e448d9STim Abbott #define SBSS(sbss_align) \ 50104e448d9STim Abbott . = ALIGN(sbss_align); \ 502ef53dae8SSam Ravnborg .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \ 503ef53dae8SSam Ravnborg *(.sbss) \ 504ef53dae8SSam Ravnborg *(.scommon) \ 505ef53dae8SSam Ravnborg } 506ef53dae8SSam Ravnborg 507ef53dae8SSam Ravnborg #define BSS(bss_align) \ 508ef53dae8SSam Ravnborg . = ALIGN(bss_align); \ 509ef53dae8SSam Ravnborg .bss : AT(ADDR(.bss) - LOAD_OFFSET) { \ 5107c74df07STim Abbott *(.bss..page_aligned) \ 511ef53dae8SSam Ravnborg *(.dynbss) \ 512ef53dae8SSam Ravnborg *(.bss) \ 513ef53dae8SSam Ravnborg *(COMMON) \ 514ef53dae8SSam Ravnborg } 515ef53dae8SSam Ravnborg 516ef53dae8SSam Ravnborg /* 517ef53dae8SSam Ravnborg * DWARF debug sections. 518ef53dae8SSam Ravnborg * Symbols in the DWARF debugging sections are relative to 519ef53dae8SSam Ravnborg * the beginning of the section so we begin them at 0. 520ef53dae8SSam Ravnborg */ 521a7d0c210SPaolo 'Blaisorblade' Giarrusso #define DWARF_DEBUG \ 522a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1 */ \ 523a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug 0 : { *(.debug) } \ 524a7d0c210SPaolo 'Blaisorblade' Giarrusso .line 0 : { *(.line) } \ 525a7d0c210SPaolo 'Blaisorblade' Giarrusso /* GNU DWARF 1 extensions */ \ 526a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_srcinfo 0 : { *(.debug_srcinfo) } \ 527a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_sfnames 0 : { *(.debug_sfnames) } \ 528a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1.1 and DWARF 2 */ \ 529a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_aranges 0 : { *(.debug_aranges) } \ 530a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_pubnames 0 : { *(.debug_pubnames) } \ 531a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 2 */ \ 532a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_info 0 : { *(.debug_info \ 533a7d0c210SPaolo 'Blaisorblade' Giarrusso .gnu.linkonce.wi.*) } \ 534a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_abbrev 0 : { *(.debug_abbrev) } \ 535a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_line 0 : { *(.debug_line) } \ 536a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_frame 0 : { *(.debug_frame) } \ 537a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_str 0 : { *(.debug_str) } \ 538a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_loc 0 : { *(.debug_loc) } \ 539a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_macinfo 0 : { *(.debug_macinfo) } \ 540a7d0c210SPaolo 'Blaisorblade' Giarrusso /* SGI/MIPS DWARF 2 extensions */ \ 541a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_weaknames 0 : { *(.debug_weaknames) } \ 542a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_funcnames 0 : { *(.debug_funcnames) } \ 543a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_typenames 0 : { *(.debug_typenames) } \ 544a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_varnames 0 : { *(.debug_varnames) } \ 545a7d0c210SPaolo 'Blaisorblade' Giarrusso 546a7d0c210SPaolo 'Blaisorblade' Giarrusso /* Stabs debugging sections. */ 547a7d0c210SPaolo 'Blaisorblade' Giarrusso #define STABS_DEBUG \ 548a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab 0 : { *(.stab) } \ 549a7d0c210SPaolo 'Blaisorblade' Giarrusso .stabstr 0 : { *(.stabstr) } \ 550a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.excl 0 : { *(.stab.excl) } \ 551a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.exclstr 0 : { *(.stab.exclstr) } \ 552a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.index 0 : { *(.stab.index) } \ 553a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.indexstr 0 : { *(.stab.indexstr) } \ 554a7d0c210SPaolo 'Blaisorblade' Giarrusso .comment 0 : { *(.comment) } 5559c9b8b38SJeremy Fitzhardinge 5566360b1fbSJan Beulich #ifdef CONFIG_GENERIC_BUG 5577664c5a1SJeremy Fitzhardinge #define BUG_TABLE \ 5587664c5a1SJeremy Fitzhardinge . = ALIGN(8); \ 5597664c5a1SJeremy Fitzhardinge __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \ 560c6de0026SYoshinori Sato VMLINUX_SYMBOL(__start___bug_table) = .; \ 5617664c5a1SJeremy Fitzhardinge *(__bug_table) \ 562c6de0026SYoshinori Sato VMLINUX_SYMBOL(__stop___bug_table) = .; \ 5637664c5a1SJeremy Fitzhardinge } 5646360b1fbSJan Beulich #else 5656360b1fbSJan Beulich #define BUG_TABLE 5666360b1fbSJan Beulich #endif 5677664c5a1SJeremy Fitzhardinge 568bf5438fcSJason Baron #define JUMP_TABLE \ 569bf5438fcSJason Baron . = ALIGN(8); \ 570bf5438fcSJason Baron __jump_table : AT(ADDR(__jump_table) - LOAD_OFFSET) { \ 571bf5438fcSJason Baron VMLINUX_SYMBOL(__start___jump_table) = .; \ 572bf5438fcSJason Baron *(__jump_table) \ 573bf5438fcSJason Baron VMLINUX_SYMBOL(__stop___jump_table) = .; \ 574bf5438fcSJason Baron } 575bf5438fcSJason Baron 57663687a52SJan Beulich #ifdef CONFIG_PM_TRACE 57763687a52SJan Beulich #define TRACEDATA \ 57863687a52SJan Beulich . = ALIGN(4); \ 57963687a52SJan Beulich .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \ 580c6de0026SYoshinori Sato VMLINUX_SYMBOL(__tracedata_start) = .; \ 58163687a52SJan Beulich *(.tracedata) \ 582c6de0026SYoshinori Sato VMLINUX_SYMBOL(__tracedata_end) = .; \ 58363687a52SJan Beulich } 58463687a52SJan Beulich #else 58563687a52SJan Beulich #define TRACEDATA 58663687a52SJan Beulich #endif 58763687a52SJan Beulich 5889c9b8b38SJeremy Fitzhardinge #define NOTES \ 589cbe87121SRoland McGrath .notes : AT(ADDR(.notes) - LOAD_OFFSET) { \ 590cbe87121SRoland McGrath VMLINUX_SYMBOL(__start_notes) = .; \ 591cbe87121SRoland McGrath *(.note.*) \ 592cbe87121SRoland McGrath VMLINUX_SYMBOL(__stop_notes) = .; \ 593cbe87121SRoland McGrath } 59461ce1efeSAndrew Morton 595ef53dae8SSam Ravnborg #define INIT_SETUP(initsetup_align) \ 596ef53dae8SSam Ravnborg . = ALIGN(initsetup_align); \ 597ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__setup_start) = .; \ 598ef53dae8SSam Ravnborg *(.init.setup) \ 599ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__setup_end) = .; 600ef53dae8SSam Ravnborg 60161ce1efeSAndrew Morton #define INITCALLS \ 602c2147a50SEduard - Gabriel Munteanu *(.initcallearly.init) \ 603c6de0026SYoshinori Sato VMLINUX_SYMBOL(__early_initcall_end) = .; \ 604b3438f82SLinus Torvalds *(.initcall0.init) \ 605b3438f82SLinus Torvalds *(.initcall0s.init) \ 60661ce1efeSAndrew Morton *(.initcall1.init) \ 607735a7ffbSAndrew Morton *(.initcall1s.init) \ 60861ce1efeSAndrew Morton *(.initcall2.init) \ 609735a7ffbSAndrew Morton *(.initcall2s.init) \ 61061ce1efeSAndrew Morton *(.initcall3.init) \ 611735a7ffbSAndrew Morton *(.initcall3s.init) \ 61261ce1efeSAndrew Morton *(.initcall4.init) \ 613735a7ffbSAndrew Morton *(.initcall4s.init) \ 61461ce1efeSAndrew Morton *(.initcall5.init) \ 615735a7ffbSAndrew Morton *(.initcall5s.init) \ 6168d610dd5SLinus Torvalds *(.initcallrootfs.init) \ 61761ce1efeSAndrew Morton *(.initcall6.init) \ 618735a7ffbSAndrew Morton *(.initcall6s.init) \ 619735a7ffbSAndrew Morton *(.initcall7.init) \ 620735a7ffbSAndrew Morton *(.initcall7s.init) 62161ce1efeSAndrew Morton 622ef53dae8SSam Ravnborg #define INIT_CALLS \ 623ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initcall_start) = .; \ 624ef53dae8SSam Ravnborg INITCALLS \ 625ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initcall_end) = .; 626ef53dae8SSam Ravnborg 627ef53dae8SSam Ravnborg #define CON_INITCALL \ 628ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__con_initcall_start) = .; \ 629ef53dae8SSam Ravnborg *(.con_initcall.init) \ 630ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__con_initcall_end) = .; 631ef53dae8SSam Ravnborg 632ef53dae8SSam Ravnborg #define SECURITY_INITCALL \ 633ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__security_initcall_start) = .; \ 634ef53dae8SSam Ravnborg *(.security_initcall.init) \ 635ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__security_initcall_end) = .; 636ef53dae8SSam Ravnborg 637ef53dae8SSam Ravnborg #ifdef CONFIG_BLK_DEV_INITRD 638ef53dae8SSam Ravnborg #define INIT_RAM_FS \ 639ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 640ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initramfs_start) = .; \ 641ef53dae8SSam Ravnborg *(.init.ramfs) \ 642ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initramfs_end) = .; 643ef53dae8SSam Ravnborg #else 644eadfe219SDavid Howells #define INIT_RAM_FS 645ef53dae8SSam Ravnborg #endif 646ef53dae8SSam Ravnborg 647023bf6f1STejun Heo /* 648023bf6f1STejun Heo * Default discarded sections. 649023bf6f1STejun Heo * 650023bf6f1STejun Heo * Some archs want to discard exit text/data at runtime rather than 651023bf6f1STejun Heo * link time due to cross-section references such as alt instructions, 652023bf6f1STejun Heo * bug table, eh_frame, etc. DISCARDS must be the last of output 653023bf6f1STejun Heo * section definitions so that such archs put those in earlier section 654023bf6f1STejun Heo * definitions. 655023bf6f1STejun Heo */ 656405d967dSTejun Heo #define DISCARDS \ 657405d967dSTejun Heo /DISCARD/ : { \ 658405d967dSTejun Heo EXIT_TEXT \ 659405d967dSTejun Heo EXIT_DATA \ 660023bf6f1STejun Heo EXIT_CALL \ 661405d967dSTejun Heo *(.discard) \ 662c7f52cdcSJeremy Fitzhardinge *(.discard.*) \ 663405d967dSTejun Heo } 664405d967dSTejun Heo 6653e5d8f97STejun Heo /** 6666b7c38d5STejun Heo * PERCPU_VADDR - define output section for percpu area 6673e5d8f97STejun Heo * @vaddr: explicit base address (optional) 6683e5d8f97STejun Heo * @phdr: destination PHDR (optional) 6693e5d8f97STejun Heo * 6703e5d8f97STejun Heo * Macro which expands to output section for percpu area. If @vaddr 6713e5d8f97STejun Heo * is not blank, it specifies explicit base address and all percpu 6723e5d8f97STejun Heo * symbols will be offset from the given address. If blank, @vaddr 6733e5d8f97STejun Heo * always equals @laddr + LOAD_OFFSET. 6743e5d8f97STejun Heo * 6753e5d8f97STejun Heo * @phdr defines the output PHDR to use if not blank. Be warned that 6763e5d8f97STejun Heo * output PHDR is sticky. If @phdr is specified, the next output 6773e5d8f97STejun Heo * section in the linker script will go there too. @phdr should have 6783e5d8f97STejun Heo * a leading colon. 6793e5d8f97STejun Heo * 6803ac6cffeSTejun Heo * Note that this macros defines __per_cpu_load as an absolute symbol. 6813ac6cffeSTejun Heo * If there is no need to put the percpu section at a predetermined 6823ac6cffeSTejun Heo * address, use PERCPU(). 6833e5d8f97STejun Heo */ 6843e5d8f97STejun Heo #define PERCPU_VADDR(vaddr, phdr) \ 685dba3d36bSIngo Molnar VMLINUX_SYMBOL(__per_cpu_load) = .; \ 6863d9a854cSDenys Vlasenko .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ 6876b7c38d5STejun Heo - LOAD_OFFSET) { \ 688c6de0026SYoshinori Sato VMLINUX_SYMBOL(__per_cpu_start) = .; \ 6893d9a854cSDenys Vlasenko *(.data..percpu..first) \ 6903d9a854cSDenys Vlasenko *(.data..percpu..page_aligned) \ 6913d9a854cSDenys Vlasenko *(.data..percpu) \ 6923d9a854cSDenys Vlasenko *(.data..percpu..shared_aligned) \ 6936b7c38d5STejun Heo VMLINUX_SYMBOL(__per_cpu_end) = .; \ 6946b7c38d5STejun Heo } phdr \ 6953d9a854cSDenys Vlasenko . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data..percpu); 6963e5d8f97STejun Heo 6973e5d8f97STejun Heo /** 6983e5d8f97STejun Heo * PERCPU - define output section for percpu area, simple version 6993e5d8f97STejun Heo * @align: required alignment 7003e5d8f97STejun Heo * 7013e5d8f97STejun Heo * Align to @align and outputs output section for percpu area. This 7023e5d8f97STejun Heo * macro doesn't maniuplate @vaddr or @phdr and __per_cpu_load and 7033e5d8f97STejun Heo * __per_cpu_start will be identical. 7043ac6cffeSTejun Heo * 7053ac6cffeSTejun Heo * This macro is equivalent to ALIGN(align); PERCPU_VADDR( , ) except 7063ac6cffeSTejun Heo * that __per_cpu_load is defined as a relative symbol against 7073d9a854cSDenys Vlasenko * .data..percpu which is required for relocatable x86_32 7083ac6cffeSTejun Heo * configuration. 7093e5d8f97STejun Heo */ 7103e5d8f97STejun Heo #define PERCPU(align) \ 7113e5d8f97STejun Heo . = ALIGN(align); \ 7123d9a854cSDenys Vlasenko .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ 7133ac6cffeSTejun Heo VMLINUX_SYMBOL(__per_cpu_load) = .; \ 7143ac6cffeSTejun Heo VMLINUX_SYMBOL(__per_cpu_start) = .; \ 7153d9a854cSDenys Vlasenko *(.data..percpu..first) \ 7163d9a854cSDenys Vlasenko *(.data..percpu..page_aligned) \ 7173d9a854cSDenys Vlasenko *(.data..percpu) \ 7183d9a854cSDenys Vlasenko *(.data..percpu..shared_aligned) \ 7193ac6cffeSTejun Heo VMLINUX_SYMBOL(__per_cpu_end) = .; \ 7203ac6cffeSTejun Heo } 721ef53dae8SSam Ravnborg 722ef53dae8SSam Ravnborg 723ef53dae8SSam Ravnborg /* 724ef53dae8SSam Ravnborg * Definition of the high level *_SECTION macros 725ef53dae8SSam Ravnborg * They will fit only a subset of the architectures 726ef53dae8SSam Ravnborg */ 727ef53dae8SSam Ravnborg 728ef53dae8SSam Ravnborg 729ef53dae8SSam Ravnborg /* 730ef53dae8SSam Ravnborg * Writeable data. 731ef53dae8SSam Ravnborg * All sections are combined in a single .data section. 732ef53dae8SSam Ravnborg * The sections following CONSTRUCTORS are arranged so their 733ef53dae8SSam Ravnborg * typical alignment matches. 734ef53dae8SSam Ravnborg * A cacheline is typical/always less than a PAGE_SIZE so 735ef53dae8SSam Ravnborg * the sections that has this restriction (or similar) 736ef53dae8SSam Ravnborg * is located before the ones requiring PAGE_SIZE alignment. 737ef53dae8SSam Ravnborg * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which 738ef53dae8SSam Ravnborg * matches the requirment of PAGE_ALIGNED_DATA. 739ef53dae8SSam Ravnborg * 7407923f90fSSam Ravnborg * use 0 as page_align if page_aligned data is not used */ 74173f1d939SPaul Mundt #define RW_DATA_SECTION(cacheline, pagealigned, inittask) \ 742ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 743ef53dae8SSam Ravnborg .data : AT(ADDR(.data) - LOAD_OFFSET) { \ 74439a449d9STim Abbott INIT_TASK_DATA(inittask) \ 7451b208622STim Abbott NOSAVE_DATA \ 7461b208622STim Abbott PAGE_ALIGNED_DATA(pagealigned) \ 747ef53dae8SSam Ravnborg CACHELINE_ALIGNED_DATA(cacheline) \ 748ef53dae8SSam Ravnborg READ_MOSTLY_DATA(cacheline) \ 749ef53dae8SSam Ravnborg DATA_DATA \ 750ef53dae8SSam Ravnborg CONSTRUCTORS \ 751ef53dae8SSam Ravnborg } 752ef53dae8SSam Ravnborg 753ef53dae8SSam Ravnborg #define INIT_TEXT_SECTION(inittext_align) \ 754ef53dae8SSam Ravnborg . = ALIGN(inittext_align); \ 755ef53dae8SSam Ravnborg .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { \ 756ef53dae8SSam Ravnborg VMLINUX_SYMBOL(_sinittext) = .; \ 757ef53dae8SSam Ravnborg INIT_TEXT \ 758ef53dae8SSam Ravnborg VMLINUX_SYMBOL(_einittext) = .; \ 759ef53dae8SSam Ravnborg } 760ef53dae8SSam Ravnborg 761ef53dae8SSam Ravnborg #define INIT_DATA_SECTION(initsetup_align) \ 762ef53dae8SSam Ravnborg .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { \ 763ef53dae8SSam Ravnborg INIT_DATA \ 764ef53dae8SSam Ravnborg INIT_SETUP(initsetup_align) \ 765ef53dae8SSam Ravnborg INIT_CALLS \ 766ef53dae8SSam Ravnborg CON_INITCALL \ 767ef53dae8SSam Ravnborg SECURITY_INITCALL \ 768ef53dae8SSam Ravnborg INIT_RAM_FS \ 769ef53dae8SSam Ravnborg } 770ef53dae8SSam Ravnborg 77104e448d9STim Abbott #define BSS_SECTION(sbss_align, bss_align, stop_align) \ 77204e448d9STim Abbott . = ALIGN(sbss_align); \ 77304e448d9STim Abbott VMLINUX_SYMBOL(__bss_start) = .; \ 77404e448d9STim Abbott SBSS(sbss_align) \ 775ef53dae8SSam Ravnborg BSS(bss_align) \ 77604e448d9STim Abbott . = ALIGN(stop_align); \ 77704e448d9STim Abbott VMLINUX_SYMBOL(__bss_stop) = .; 778