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(...) 1819df0c2fSTejun Heo * PERCPU(CACHELINE_SIZE, 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 */ 70aab94339SDirk Brandewie #define STRUCT_ALIGNMENT 32 71aab94339SDirk Brandewie #define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT) 7207fca0e5SSam Ravnborg 73eb8f6890SSam Ravnborg /* The actual configuration determine if the init/exit sections 74eb8f6890SSam Ravnborg * are handled as text/data or they can be discarded (which 75eb8f6890SSam Ravnborg * often happens at runtime) 76eb8f6890SSam Ravnborg */ 77eb8f6890SSam Ravnborg #ifdef CONFIG_HOTPLUG 78eb8f6890SSam Ravnborg #define DEV_KEEP(sec) *(.dev##sec) 79eb8f6890SSam Ravnborg #define DEV_DISCARD(sec) 80eb8f6890SSam Ravnborg #else 81eb8f6890SSam Ravnborg #define DEV_KEEP(sec) 82eb8f6890SSam Ravnborg #define DEV_DISCARD(sec) *(.dev##sec) 83eb8f6890SSam Ravnborg #endif 84eb8f6890SSam Ravnborg 85eb8f6890SSam Ravnborg #ifdef CONFIG_HOTPLUG_CPU 86eb8f6890SSam Ravnborg #define CPU_KEEP(sec) *(.cpu##sec) 87eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) 88eb8f6890SSam Ravnborg #else 89eb8f6890SSam Ravnborg #define CPU_KEEP(sec) 90eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) *(.cpu##sec) 91eb8f6890SSam Ravnborg #endif 92eb8f6890SSam Ravnborg 931a3fb6d4SAdrian Bunk #if defined(CONFIG_MEMORY_HOTPLUG) 94eb8f6890SSam Ravnborg #define MEM_KEEP(sec) *(.mem##sec) 95eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) 96eb8f6890SSam Ravnborg #else 97eb8f6890SSam Ravnborg #define MEM_KEEP(sec) 98eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) *(.mem##sec) 99eb8f6890SSam Ravnborg #endif 100eb8f6890SSam Ravnborg 1018da3821bSSteven Rostedt #ifdef CONFIG_FTRACE_MCOUNT_RECORD 1024b3b4c5eSJohn Reiser #define MCOUNT_REC() . = ALIGN(8); \ 1034b3b4c5eSJohn Reiser VMLINUX_SYMBOL(__start_mcount_loc) = .; \ 1048da3821bSSteven Rostedt *(__mcount_loc) \ 1058da3821bSSteven Rostedt VMLINUX_SYMBOL(__stop_mcount_loc) = .; 1068da3821bSSteven Rostedt #else 1078da3821bSSteven Rostedt #define MCOUNT_REC() 1088da3821bSSteven Rostedt #endif 109eb8f6890SSam Ravnborg 1102ed84eebSSteven Rostedt #ifdef CONFIG_TRACE_BRANCH_PROFILING 11145b79749SSteven Rostedt #define LIKELY_PROFILE() VMLINUX_SYMBOL(__start_annotated_branch_profile) = .; \ 11245b79749SSteven Rostedt *(_ftrace_annotated_branch) \ 11345b79749SSteven Rostedt VMLINUX_SYMBOL(__stop_annotated_branch_profile) = .; 1141f0d69a9SSteven Rostedt #else 1151f0d69a9SSteven Rostedt #define LIKELY_PROFILE() 1161f0d69a9SSteven Rostedt #endif 1171f0d69a9SSteven Rostedt 1182bcd521aSSteven Rostedt #ifdef CONFIG_PROFILE_ALL_BRANCHES 1192bcd521aSSteven Rostedt #define BRANCH_PROFILE() VMLINUX_SYMBOL(__start_branch_profile) = .; \ 1202bcd521aSSteven Rostedt *(_ftrace_branch) \ 1212bcd521aSSteven Rostedt VMLINUX_SYMBOL(__stop_branch_profile) = .; 1222bcd521aSSteven Rostedt #else 1232bcd521aSSteven Rostedt #define BRANCH_PROFILE() 1242bcd521aSSteven Rostedt #endif 1252bcd521aSSteven Rostedt 1265f77a88bSTom Zanussi #ifdef CONFIG_EVENT_TRACING 127e4a9ea5eSSteven Rostedt #define FTRACE_EVENTS() . = ALIGN(8); \ 128e4a9ea5eSSteven Rostedt VMLINUX_SYMBOL(__start_ftrace_events) = .; \ 129b77e38aaSSteven Rostedt *(_ftrace_events) \ 130b77e38aaSSteven Rostedt VMLINUX_SYMBOL(__stop_ftrace_events) = .; 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) = .; \ 1371ba28e02SLai Jiangshan *(__trace_printk_fmt) /* Trace_printk fmt' pointer */ \ 1381ba28e02SLai Jiangshan VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .; 1391ba28e02SLai Jiangshan #else 1401ba28e02SLai Jiangshan #define TRACE_PRINTKS() 1411ba28e02SLai Jiangshan #endif 1421ba28e02SLai Jiangshan 143bed1ffcaSFrederic Weisbecker #ifdef CONFIG_FTRACE_SYSCALLS 1443d56e331SSteven Rostedt #define TRACE_SYSCALLS() . = ALIGN(8); \ 1453d56e331SSteven Rostedt VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \ 146bed1ffcaSFrederic Weisbecker *(__syscalls_metadata) \ 147bed1ffcaSFrederic Weisbecker VMLINUX_SYMBOL(__stop_syscalls_metadata) = .; 148bed1ffcaSFrederic Weisbecker #else 149bed1ffcaSFrederic Weisbecker #define TRACE_SYSCALLS() 150bed1ffcaSFrederic Weisbecker #endif 151bed1ffcaSFrederic Weisbecker 152aab94339SDirk Brandewie 153aab94339SDirk Brandewie #define KERNEL_DTB() \ 154aab94339SDirk Brandewie STRUCT_ALIGN(); \ 155aab94339SDirk Brandewie VMLINUX_SYMBOL(__dtb_start) = .; \ 156aab94339SDirk Brandewie *(.dtb.init.rodata) \ 157aab94339SDirk Brandewie VMLINUX_SYMBOL(__dtb_end) = .; 158aab94339SDirk Brandewie 159ca967258SSam Ravnborg /* .data section */ 160ca967258SSam Ravnborg #define DATA_DATA \ 1610e0d314eSSam Ravnborg *(.data) \ 162312b1485SSam Ravnborg *(.ref.data) \ 163d356c0b6SMike Frysinger *(.data..shared_aligned) /* percpu related */ \ 164eb8f6890SSam Ravnborg DEV_KEEP(init.data) \ 165eb8f6890SSam Ravnborg DEV_KEEP(exit.data) \ 166eb8f6890SSam Ravnborg CPU_KEEP(init.data) \ 167eb8f6890SSam Ravnborg CPU_KEEP(exit.data) \ 168eb8f6890SSam Ravnborg MEM_KEEP(init.data) \ 169eb8f6890SSam Ravnborg MEM_KEEP(exit.data) \ 17065498646SMathieu Desnoyers STRUCT_ALIGN(); \ 17197e1c18eSMathieu Desnoyers *(__tracepoints) \ 172e9d376f0SJason Baron /* implement dynamic printk debug */ \ 173e9d376f0SJason Baron . = ALIGN(8); \ 174e9d376f0SJason Baron VMLINUX_SYMBOL(__start___verbose) = .; \ 175e9d376f0SJason Baron *(__verbose) \ 176e9d376f0SJason Baron VMLINUX_SYMBOL(__stop___verbose) = .; \ 1772bcd521aSSteven Rostedt LIKELY_PROFILE() \ 178b77e38aaSSteven Rostedt BRANCH_PROFILE() \ 1793d56e331SSteven Rostedt TRACE_PRINTKS() 180ca967258SSam Ravnborg 181ef53dae8SSam Ravnborg /* 182ef53dae8SSam Ravnborg * Data section helpers 183ef53dae8SSam Ravnborg */ 184ef53dae8SSam Ravnborg #define NOSAVE_DATA \ 185ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 186ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__nosave_begin) = .; \ 18707b3bb1eSDenys Vlasenko *(.data..nosave) \ 188ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 189ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__nosave_end) = .; 190ef53dae8SSam Ravnborg 191ef53dae8SSam Ravnborg #define PAGE_ALIGNED_DATA(page_align) \ 192ef53dae8SSam Ravnborg . = ALIGN(page_align); \ 19375b13483STim Abbott *(.data..page_aligned) 194ef53dae8SSam Ravnborg 195ef53dae8SSam Ravnborg #define READ_MOSTLY_DATA(align) \ 196ef53dae8SSam Ravnborg . = ALIGN(align); \ 1978369744fSShaohua Li *(.data..read_mostly) \ 1988369744fSShaohua Li . = ALIGN(align); 199ef53dae8SSam Ravnborg 200ef53dae8SSam Ravnborg #define CACHELINE_ALIGNED_DATA(align) \ 201ef53dae8SSam Ravnborg . = ALIGN(align); \ 2024af57b78STim Abbott *(.data..cacheline_aligned) 203ef53dae8SSam Ravnborg 20439a449d9STim Abbott #define INIT_TASK_DATA(align) \ 205ef53dae8SSam Ravnborg . = ALIGN(align); \ 2062af7687fSTim Abbott *(.data..init_task) 207ef53dae8SSam Ravnborg 208ef53dae8SSam Ravnborg /* 209ef53dae8SSam Ravnborg * Read only Data 210ef53dae8SSam Ravnborg */ 211ef53dae8SSam Ravnborg #define RO_DATA_SECTION(align) \ 2124096b46fSSam Ravnborg . = ALIGN((align)); \ 2131da177e4SLinus Torvalds .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ 2146569580dSVivek Goyal VMLINUX_SYMBOL(__start_rodata) = .; \ 2151da177e4SLinus Torvalds *(.rodata) *(.rodata.*) \ 2161da177e4SLinus Torvalds *(__vermagic) /* Kernel version magic */ \ 21765498646SMathieu Desnoyers . = ALIGN(8); \ 21865498646SMathieu Desnoyers VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .; \ 21965498646SMathieu Desnoyers *(__tracepoints_ptrs) /* Tracepoints: pointer array */\ 22065498646SMathieu Desnoyers VMLINUX_SYMBOL(__stop___tracepoints_ptrs) = .; \ 2218256e47cSMathieu Desnoyers *(__markers_strings) /* Markers: strings */ \ 22297e1c18eSMathieu Desnoyers *(__tracepoints_strings)/* Tracepoints: strings */ \ 2231da177e4SLinus Torvalds } \ 2241da177e4SLinus Torvalds \ 2251da177e4SLinus Torvalds .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \ 2261da177e4SLinus Torvalds *(.rodata1) \ 2271da177e4SLinus Torvalds } \ 2281da177e4SLinus Torvalds \ 2296360b1fbSJan Beulich BUG_TABLE \ 2306360b1fbSJan Beulich \ 231bf5438fcSJason Baron JUMP_TABLE \ 232bf5438fcSJason Baron \ 2331da177e4SLinus Torvalds /* PCI quirks */ \ 2341da177e4SLinus Torvalds .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ 2351da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \ 2361da177e4SLinus Torvalds *(.pci_fixup_early) \ 2371da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_early) = .; \ 2381da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_header) = .; \ 2391da177e4SLinus Torvalds *(.pci_fixup_header) \ 2401da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_header) = .; \ 2411da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_final) = .; \ 2421da177e4SLinus Torvalds *(.pci_fixup_final) \ 2431da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_final) = .; \ 2441da177e4SLinus Torvalds VMLINUX_SYMBOL(__start_pci_fixups_enable) = .; \ 2451da177e4SLinus Torvalds *(.pci_fixup_enable) \ 2461da177e4SLinus Torvalds VMLINUX_SYMBOL(__end_pci_fixups_enable) = .; \ 2471597cacbSAlan Cox VMLINUX_SYMBOL(__start_pci_fixups_resume) = .; \ 2481597cacbSAlan Cox *(.pci_fixup_resume) \ 2491597cacbSAlan Cox VMLINUX_SYMBOL(__end_pci_fixups_resume) = .; \ 250e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .; \ 251e1a2a51eSRafael J. Wysocki *(.pci_fixup_resume_early) \ 252e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .; \ 253e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .; \ 254e1a2a51eSRafael J. Wysocki *(.pci_fixup_suspend) \ 255e1a2a51eSRafael J. Wysocki VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .; \ 2561da177e4SLinus Torvalds } \ 2571da177e4SLinus Torvalds \ 2585658c769SDavid Woodhouse /* Built-in firmware blobs */ \ 2595658c769SDavid Woodhouse .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \ 2605658c769SDavid Woodhouse VMLINUX_SYMBOL(__start_builtin_fw) = .; \ 2615658c769SDavid Woodhouse *(.builtin_fw) \ 2625658c769SDavid Woodhouse VMLINUX_SYMBOL(__end_builtin_fw) = .; \ 2635658c769SDavid Woodhouse } \ 2645658c769SDavid Woodhouse \ 265394b701cSMatt Porter /* RapidIO route ops */ \ 266e5cabeb3SAlexandre Bounine .rio_ops : AT(ADDR(.rio_ops) - LOAD_OFFSET) { \ 267058f88d6SAlexandre Bounine VMLINUX_SYMBOL(__start_rio_switch_ops) = .; \ 268058f88d6SAlexandre Bounine *(.rio_switch_ops) \ 269058f88d6SAlexandre Bounine VMLINUX_SYMBOL(__end_rio_switch_ops) = .; \ 270394b701cSMatt Porter } \ 271394b701cSMatt Porter \ 27263687a52SJan Beulich TRACEDATA \ 27363687a52SJan Beulich \ 2741da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 2751da177e4SLinus Torvalds __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ 2761da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___ksymtab) = .; \ 277f02e8a65SAlessio Igor Bogani *(SORT(___ksymtab+*)) \ 2781da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___ksymtab) = .; \ 2791da177e4SLinus Torvalds } \ 2801da177e4SLinus Torvalds \ 2811da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 2821da177e4SLinus Torvalds __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ 2831da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \ 284f02e8a65SAlessio Igor Bogani *(SORT(___ksymtab_gpl+*)) \ 2851da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \ 2861da177e4SLinus Torvalds } \ 2871da177e4SLinus Torvalds \ 288f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 289f71d20e9SArjan van de Ven __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ 290f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \ 291f02e8a65SAlessio Igor Bogani *(SORT(___ksymtab_unused+*)) \ 292f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \ 293f71d20e9SArjan van de Ven } \ 294f71d20e9SArjan van de Ven \ 295f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 296f71d20e9SArjan van de Ven __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ 297f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \ 298f02e8a65SAlessio Igor Bogani *(SORT(___ksymtab_unused_gpl+*)) \ 299f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \ 300f71d20e9SArjan van de Ven } \ 301f71d20e9SArjan van de Ven \ 3029f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 3039f28bb7eSGreg Kroah-Hartman __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ 3049f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \ 305f02e8a65SAlessio Igor Bogani *(SORT(___ksymtab_gpl_future+*)) \ 3069f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \ 3079f28bb7eSGreg Kroah-Hartman } \ 3089f28bb7eSGreg Kroah-Hartman \ 3091da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 3101da177e4SLinus Torvalds __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ 3111da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___kcrctab) = .; \ 312f02e8a65SAlessio Igor Bogani *(SORT(___kcrctab+*)) \ 3131da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___kcrctab) = .; \ 3141da177e4SLinus Torvalds } \ 3151da177e4SLinus Torvalds \ 3161da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 3171da177e4SLinus Torvalds __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ 3181da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___kcrctab_gpl) = .; \ 319f02e8a65SAlessio Igor Bogani *(SORT(___kcrctab_gpl+*)) \ 3201da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \ 3211da177e4SLinus Torvalds } \ 3221da177e4SLinus Torvalds \ 323f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 324f71d20e9SArjan van de Ven __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \ 325f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___kcrctab_unused) = .; \ 326f02e8a65SAlessio Igor Bogani *(SORT(___kcrctab_unused+*)) \ 327f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___kcrctab_unused) = .; \ 328f71d20e9SArjan van de Ven } \ 329f71d20e9SArjan van de Ven \ 330f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 331f71d20e9SArjan van de Ven __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ 332f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \ 333f02e8a65SAlessio Igor Bogani *(SORT(___kcrctab_unused_gpl+*)) \ 334f71d20e9SArjan van de Ven VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .; \ 335f71d20e9SArjan van de Ven } \ 336f71d20e9SArjan van de Ven \ 3379f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 3389f28bb7eSGreg Kroah-Hartman __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ 3399f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \ 340f02e8a65SAlessio Igor Bogani *(SORT(___kcrctab_gpl_future+*)) \ 3419f28bb7eSGreg Kroah-Hartman VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \ 3429f28bb7eSGreg Kroah-Hartman } \ 3439f28bb7eSGreg Kroah-Hartman \ 3441da177e4SLinus Torvalds /* Kernel symbol table: strings */ \ 3451da177e4SLinus Torvalds __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ 3461da177e4SLinus Torvalds *(__ksymtab_strings) \ 3471da177e4SLinus Torvalds } \ 3481da177e4SLinus Torvalds \ 349eb8f6890SSam Ravnborg /* __*init sections */ \ 350eb8f6890SSam Ravnborg __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) { \ 351312b1485SSam Ravnborg *(.ref.rodata) \ 352eb8f6890SSam Ravnborg DEV_KEEP(init.rodata) \ 353eb8f6890SSam Ravnborg DEV_KEEP(exit.rodata) \ 354eb8f6890SSam Ravnborg CPU_KEEP(init.rodata) \ 355eb8f6890SSam Ravnborg CPU_KEEP(exit.rodata) \ 356eb8f6890SSam Ravnborg MEM_KEEP(init.rodata) \ 357eb8f6890SSam Ravnborg MEM_KEEP(exit.rodata) \ 358eb8f6890SSam Ravnborg } \ 359eb8f6890SSam Ravnborg \ 3601da177e4SLinus Torvalds /* Built-in module parameters. */ \ 3611da177e4SLinus Torvalds __param : AT(ADDR(__param) - LOAD_OFFSET) { \ 3621da177e4SLinus Torvalds VMLINUX_SYMBOL(__start___param) = .; \ 3631da177e4SLinus Torvalds *(__param) \ 3641da177e4SLinus Torvalds VMLINUX_SYMBOL(__stop___param) = .; \ 365e94965edSDmitry Torokhov } \ 366e94965edSDmitry Torokhov \ 367e94965edSDmitry Torokhov /* Built-in module versions. */ \ 368e94965edSDmitry Torokhov __modver : AT(ADDR(__modver) - LOAD_OFFSET) { \ 369e94965edSDmitry Torokhov VMLINUX_SYMBOL(__start___modver) = .; \ 370e94965edSDmitry Torokhov *(__modver) \ 371e94965edSDmitry Torokhov VMLINUX_SYMBOL(__stop___modver) = .; \ 372edeed305SArjan van de Ven . = ALIGN((align)); \ 3736569580dSVivek Goyal VMLINUX_SYMBOL(__end_rodata) = .; \ 3747583ddfdSMarcelo Tosatti } \ 3754096b46fSSam Ravnborg . = ALIGN((align)); 3764096b46fSSam Ravnborg 377ef53dae8SSam Ravnborg /* RODATA & RO_DATA provided for backward compatibility. 3784096b46fSSam Ravnborg * All archs are supposed to use RO_DATA() */ 379ef53dae8SSam Ravnborg #define RODATA RO_DATA_SECTION(4096) 380ef53dae8SSam Ravnborg #define RO_DATA(align) RO_DATA_SECTION(align) 3811da177e4SLinus Torvalds 3821da177e4SLinus Torvalds #define SECURITY_INIT \ 38360bad7faSEric W. Biederman .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \ 3841da177e4SLinus Torvalds VMLINUX_SYMBOL(__security_initcall_start) = .; \ 3851da177e4SLinus Torvalds *(.security_initcall.init) \ 3861da177e4SLinus Torvalds VMLINUX_SYMBOL(__security_initcall_end) = .; \ 3871da177e4SLinus Torvalds } 3881da177e4SLinus Torvalds 3897664709bSSam Ravnborg /* .text section. Map to function alignment to avoid address changes 3907664709bSSam Ravnborg * during second ld run in second ld pass when generating System.map */ 3917664709bSSam Ravnborg #define TEXT_TEXT \ 3927664709bSSam Ravnborg ALIGN_FUNCTION(); \ 393fb5e2b37SJan Beulich *(.text.hot) \ 3940e0d314eSSam Ravnborg *(.text) \ 395312b1485SSam Ravnborg *(.ref.text) \ 396eb8f6890SSam Ravnborg DEV_KEEP(init.text) \ 397eb8f6890SSam Ravnborg DEV_KEEP(exit.text) \ 398eb8f6890SSam Ravnborg CPU_KEEP(init.text) \ 399eb8f6890SSam Ravnborg CPU_KEEP(exit.text) \ 400eb8f6890SSam Ravnborg MEM_KEEP(init.text) \ 401fb5e2b37SJan Beulich MEM_KEEP(exit.text) \ 402fb5e2b37SJan Beulich *(.text.unlikely) 403eb8f6890SSam Ravnborg 4047664709bSSam Ravnborg 4056d30e3a8SSam Ravnborg /* sched.text is aling to function alignment to secure we have same 4066d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 4071da177e4SLinus Torvalds #define SCHED_TEXT \ 4086d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 4091da177e4SLinus Torvalds VMLINUX_SYMBOL(__sched_text_start) = .; \ 4101da177e4SLinus Torvalds *(.sched.text) \ 4111da177e4SLinus Torvalds VMLINUX_SYMBOL(__sched_text_end) = .; 4121da177e4SLinus Torvalds 4136d30e3a8SSam Ravnborg /* spinlock.text is aling to function alignment to secure we have same 4146d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 4151da177e4SLinus Torvalds #define LOCK_TEXT \ 4166d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 4171da177e4SLinus Torvalds VMLINUX_SYMBOL(__lock_text_start) = .; \ 4181da177e4SLinus Torvalds *(.spinlock.text) \ 4191da177e4SLinus Torvalds VMLINUX_SYMBOL(__lock_text_end) = .; 420d0aaff97SPrasanna S Panchamukhi 421d0aaff97SPrasanna S Panchamukhi #define KPROBES_TEXT \ 422d0aaff97SPrasanna S Panchamukhi ALIGN_FUNCTION(); \ 423d0aaff97SPrasanna S Panchamukhi VMLINUX_SYMBOL(__kprobes_text_start) = .; \ 424d0aaff97SPrasanna S Panchamukhi *(.kprobes.text) \ 425d0aaff97SPrasanna S Panchamukhi VMLINUX_SYMBOL(__kprobes_text_end) = .; 426a7d0c210SPaolo 'Blaisorblade' Giarrusso 427ea714547SJiri Olsa #define ENTRY_TEXT \ 428ea714547SJiri Olsa ALIGN_FUNCTION(); \ 429ea714547SJiri Olsa VMLINUX_SYMBOL(__entry_text_start) = .; \ 430ea714547SJiri Olsa *(.entry.text) \ 431ea714547SJiri Olsa VMLINUX_SYMBOL(__entry_text_end) = .; 432ea714547SJiri Olsa 433a0343e82SFrederic Weisbecker #ifdef CONFIG_FUNCTION_GRAPH_TRACER 434a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT \ 435a0343e82SFrederic Weisbecker ALIGN_FUNCTION(); \ 436a0343e82SFrederic Weisbecker VMLINUX_SYMBOL(__irqentry_text_start) = .; \ 437a0343e82SFrederic Weisbecker *(.irqentry.text) \ 438a0343e82SFrederic Weisbecker VMLINUX_SYMBOL(__irqentry_text_end) = .; 439a0343e82SFrederic Weisbecker #else 440a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT 441a0343e82SFrederic Weisbecker #endif 442a0343e82SFrederic Weisbecker 44337c514e3SSam Ravnborg /* Section used for early init (in .S files) */ 4447923f90fSSam Ravnborg #define HEAD_TEXT *(.head.text) 44537c514e3SSam Ravnborg 4467923f90fSSam Ravnborg #define HEAD_TEXT_SECTION \ 447ef53dae8SSam Ravnborg .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) { \ 448ef53dae8SSam Ravnborg HEAD_TEXT \ 449ef53dae8SSam Ravnborg } 450ef53dae8SSam Ravnborg 451ef53dae8SSam Ravnborg /* 452ef53dae8SSam Ravnborg * Exception table 453ef53dae8SSam Ravnborg */ 454ef53dae8SSam Ravnborg #define EXCEPTION_TABLE(align) \ 455ef53dae8SSam Ravnborg . = ALIGN(align); \ 456ef53dae8SSam Ravnborg __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \ 457ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__start___ex_table) = .; \ 458ef53dae8SSam Ravnborg *(__ex_table) \ 459ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__stop___ex_table) = .; \ 460ef53dae8SSam Ravnborg } 461ef53dae8SSam Ravnborg 462ef53dae8SSam Ravnborg /* 463ef53dae8SSam Ravnborg * Init task 464ef53dae8SSam Ravnborg */ 46539a449d9STim Abbott #define INIT_TASK_DATA_SECTION(align) \ 466ef53dae8SSam Ravnborg . = ALIGN(align); \ 467da5e37efSSam Ravnborg .data..init_task : AT(ADDR(.data..init_task) - LOAD_OFFSET) { \ 46839a449d9STim Abbott INIT_TASK_DATA(align) \ 469ef53dae8SSam Ravnborg } 470eb8f6890SSam Ravnborg 471b99b87f7SPeter Oberparleiter #ifdef CONFIG_CONSTRUCTORS 4722a2325e6SHeiko Carstens #define KERNEL_CTORS() . = ALIGN(8); \ 4732a2325e6SHeiko Carstens VMLINUX_SYMBOL(__ctors_start) = .; \ 474b99b87f7SPeter Oberparleiter *(.ctors) \ 475b99b87f7SPeter Oberparleiter VMLINUX_SYMBOL(__ctors_end) = .; 476b99b87f7SPeter Oberparleiter #else 477b99b87f7SPeter Oberparleiter #define KERNEL_CTORS() 478b99b87f7SPeter Oberparleiter #endif 479b99b87f7SPeter Oberparleiter 48001ba2bdcSSam Ravnborg /* init and exit section handling */ 481eb8f6890SSam Ravnborg #define INIT_DATA \ 482eb8f6890SSam Ravnborg *(.init.data) \ 483eb8f6890SSam Ravnborg DEV_DISCARD(init.data) \ 484eb8f6890SSam Ravnborg CPU_DISCARD(init.data) \ 485eb8f6890SSam Ravnborg MEM_DISCARD(init.data) \ 486b99b87f7SPeter Oberparleiter KERNEL_CTORS() \ 487fd6c3a8dSJan Beulich *(.init.rodata) \ 4884b3b4c5eSJohn Reiser MCOUNT_REC() \ 489e4a9ea5eSSteven Rostedt FTRACE_EVENTS() \ 4903d56e331SSteven Rostedt TRACE_SYSCALLS() \ 491fd6c3a8dSJan Beulich DEV_DISCARD(init.rodata) \ 492fd6c3a8dSJan Beulich CPU_DISCARD(init.rodata) \ 493aab94339SDirk Brandewie MEM_DISCARD(init.rodata) \ 494aab94339SDirk Brandewie KERNEL_DTB() 49501ba2bdcSSam Ravnborg 496eb8f6890SSam Ravnborg #define INIT_TEXT \ 497eb8f6890SSam Ravnborg *(.init.text) \ 498eb8f6890SSam Ravnborg DEV_DISCARD(init.text) \ 499eb8f6890SSam Ravnborg CPU_DISCARD(init.text) \ 500eb8f6890SSam Ravnborg MEM_DISCARD(init.text) 501eb8f6890SSam Ravnborg 502eb8f6890SSam Ravnborg #define EXIT_DATA \ 503eb8f6890SSam Ravnborg *(.exit.data) \ 504eb8f6890SSam Ravnborg DEV_DISCARD(exit.data) \ 505eb8f6890SSam Ravnborg DEV_DISCARD(exit.rodata) \ 506eb8f6890SSam Ravnborg CPU_DISCARD(exit.data) \ 507eb8f6890SSam Ravnborg CPU_DISCARD(exit.rodata) \ 508eb8f6890SSam Ravnborg MEM_DISCARD(exit.data) \ 509eb8f6890SSam Ravnborg MEM_DISCARD(exit.rodata) 510eb8f6890SSam Ravnborg 511eb8f6890SSam Ravnborg #define EXIT_TEXT \ 512eb8f6890SSam Ravnborg *(.exit.text) \ 513eb8f6890SSam Ravnborg DEV_DISCARD(exit.text) \ 514eb8f6890SSam Ravnborg CPU_DISCARD(exit.text) \ 515eb8f6890SSam Ravnborg MEM_DISCARD(exit.text) 51601ba2bdcSSam Ravnborg 5177923f90fSSam Ravnborg #define EXIT_CALL \ 5187923f90fSSam Ravnborg *(.exitcall.exit) 5197923f90fSSam Ravnborg 520ef53dae8SSam Ravnborg /* 521ef53dae8SSam Ravnborg * bss (Block Started by Symbol) - uninitialized data 522ef53dae8SSam Ravnborg * zeroed during startup 523ef53dae8SSam Ravnborg */ 52404e448d9STim Abbott #define SBSS(sbss_align) \ 52504e448d9STim Abbott . = ALIGN(sbss_align); \ 526ef53dae8SSam Ravnborg .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \ 527ef53dae8SSam Ravnborg *(.sbss) \ 528ef53dae8SSam Ravnborg *(.scommon) \ 529ef53dae8SSam Ravnborg } 530ef53dae8SSam Ravnborg 531ef53dae8SSam Ravnborg #define BSS(bss_align) \ 532ef53dae8SSam Ravnborg . = ALIGN(bss_align); \ 533ef53dae8SSam Ravnborg .bss : AT(ADDR(.bss) - LOAD_OFFSET) { \ 5347c74df07STim Abbott *(.bss..page_aligned) \ 535ef53dae8SSam Ravnborg *(.dynbss) \ 536ef53dae8SSam Ravnborg *(.bss) \ 537ef53dae8SSam Ravnborg *(COMMON) \ 538ef53dae8SSam Ravnborg } 539ef53dae8SSam Ravnborg 540ef53dae8SSam Ravnborg /* 541ef53dae8SSam Ravnborg * DWARF debug sections. 542ef53dae8SSam Ravnborg * Symbols in the DWARF debugging sections are relative to 543ef53dae8SSam Ravnborg * the beginning of the section so we begin them at 0. 544ef53dae8SSam Ravnborg */ 545a7d0c210SPaolo 'Blaisorblade' Giarrusso #define DWARF_DEBUG \ 546a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1 */ \ 547a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug 0 : { *(.debug) } \ 548a7d0c210SPaolo 'Blaisorblade' Giarrusso .line 0 : { *(.line) } \ 549a7d0c210SPaolo 'Blaisorblade' Giarrusso /* GNU DWARF 1 extensions */ \ 550a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_srcinfo 0 : { *(.debug_srcinfo) } \ 551a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_sfnames 0 : { *(.debug_sfnames) } \ 552a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1.1 and DWARF 2 */ \ 553a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_aranges 0 : { *(.debug_aranges) } \ 554a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_pubnames 0 : { *(.debug_pubnames) } \ 555a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 2 */ \ 556a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_info 0 : { *(.debug_info \ 557a7d0c210SPaolo 'Blaisorblade' Giarrusso .gnu.linkonce.wi.*) } \ 558a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_abbrev 0 : { *(.debug_abbrev) } \ 559a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_line 0 : { *(.debug_line) } \ 560a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_frame 0 : { *(.debug_frame) } \ 561a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_str 0 : { *(.debug_str) } \ 562a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_loc 0 : { *(.debug_loc) } \ 563a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_macinfo 0 : { *(.debug_macinfo) } \ 564a7d0c210SPaolo 'Blaisorblade' Giarrusso /* SGI/MIPS DWARF 2 extensions */ \ 565a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_weaknames 0 : { *(.debug_weaknames) } \ 566a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_funcnames 0 : { *(.debug_funcnames) } \ 567a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_typenames 0 : { *(.debug_typenames) } \ 568a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_varnames 0 : { *(.debug_varnames) } \ 569a7d0c210SPaolo 'Blaisorblade' Giarrusso 570a7d0c210SPaolo 'Blaisorblade' Giarrusso /* Stabs debugging sections. */ 571a7d0c210SPaolo 'Blaisorblade' Giarrusso #define STABS_DEBUG \ 572a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab 0 : { *(.stab) } \ 573a7d0c210SPaolo 'Blaisorblade' Giarrusso .stabstr 0 : { *(.stabstr) } \ 574a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.excl 0 : { *(.stab.excl) } \ 575a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.exclstr 0 : { *(.stab.exclstr) } \ 576a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.index 0 : { *(.stab.index) } \ 577a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.indexstr 0 : { *(.stab.indexstr) } \ 578a7d0c210SPaolo 'Blaisorblade' Giarrusso .comment 0 : { *(.comment) } 5799c9b8b38SJeremy Fitzhardinge 5806360b1fbSJan Beulich #ifdef CONFIG_GENERIC_BUG 5817664c5a1SJeremy Fitzhardinge #define BUG_TABLE \ 5827664c5a1SJeremy Fitzhardinge . = ALIGN(8); \ 5837664c5a1SJeremy Fitzhardinge __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \ 584c6de0026SYoshinori Sato VMLINUX_SYMBOL(__start___bug_table) = .; \ 5857664c5a1SJeremy Fitzhardinge *(__bug_table) \ 586c6de0026SYoshinori Sato VMLINUX_SYMBOL(__stop___bug_table) = .; \ 5877664c5a1SJeremy Fitzhardinge } 5886360b1fbSJan Beulich #else 5896360b1fbSJan Beulich #define BUG_TABLE 5906360b1fbSJan Beulich #endif 5917664c5a1SJeremy Fitzhardinge 592bf5438fcSJason Baron #define JUMP_TABLE \ 593bf5438fcSJason Baron . = ALIGN(8); \ 594bf5438fcSJason Baron __jump_table : AT(ADDR(__jump_table) - LOAD_OFFSET) { \ 595bf5438fcSJason Baron VMLINUX_SYMBOL(__start___jump_table) = .; \ 596bf5438fcSJason Baron *(__jump_table) \ 597bf5438fcSJason Baron VMLINUX_SYMBOL(__stop___jump_table) = .; \ 598bf5438fcSJason Baron } 599bf5438fcSJason Baron 60063687a52SJan Beulich #ifdef CONFIG_PM_TRACE 60163687a52SJan Beulich #define TRACEDATA \ 60263687a52SJan Beulich . = ALIGN(4); \ 60363687a52SJan Beulich .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \ 604c6de0026SYoshinori Sato VMLINUX_SYMBOL(__tracedata_start) = .; \ 60563687a52SJan Beulich *(.tracedata) \ 606c6de0026SYoshinori Sato VMLINUX_SYMBOL(__tracedata_end) = .; \ 60763687a52SJan Beulich } 60863687a52SJan Beulich #else 60963687a52SJan Beulich #define TRACEDATA 61063687a52SJan Beulich #endif 61163687a52SJan Beulich 6129c9b8b38SJeremy Fitzhardinge #define NOTES \ 613cbe87121SRoland McGrath .notes : AT(ADDR(.notes) - LOAD_OFFSET) { \ 614cbe87121SRoland McGrath VMLINUX_SYMBOL(__start_notes) = .; \ 615cbe87121SRoland McGrath *(.note.*) \ 616cbe87121SRoland McGrath VMLINUX_SYMBOL(__stop_notes) = .; \ 617cbe87121SRoland McGrath } 61861ce1efeSAndrew Morton 619ef53dae8SSam Ravnborg #define INIT_SETUP(initsetup_align) \ 620ef53dae8SSam Ravnborg . = ALIGN(initsetup_align); \ 621ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__setup_start) = .; \ 622ef53dae8SSam Ravnborg *(.init.setup) \ 623ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__setup_end) = .; 624ef53dae8SSam Ravnborg 62561ce1efeSAndrew Morton #define INITCALLS \ 626c2147a50SEduard - Gabriel Munteanu *(.initcallearly.init) \ 627c6de0026SYoshinori Sato VMLINUX_SYMBOL(__early_initcall_end) = .; \ 628b3438f82SLinus Torvalds *(.initcall0.init) \ 629b3438f82SLinus Torvalds *(.initcall0s.init) \ 63061ce1efeSAndrew Morton *(.initcall1.init) \ 631735a7ffbSAndrew Morton *(.initcall1s.init) \ 63261ce1efeSAndrew Morton *(.initcall2.init) \ 633735a7ffbSAndrew Morton *(.initcall2s.init) \ 63461ce1efeSAndrew Morton *(.initcall3.init) \ 635735a7ffbSAndrew Morton *(.initcall3s.init) \ 63661ce1efeSAndrew Morton *(.initcall4.init) \ 637735a7ffbSAndrew Morton *(.initcall4s.init) \ 63861ce1efeSAndrew Morton *(.initcall5.init) \ 639735a7ffbSAndrew Morton *(.initcall5s.init) \ 6408d610dd5SLinus Torvalds *(.initcallrootfs.init) \ 64161ce1efeSAndrew Morton *(.initcall6.init) \ 642735a7ffbSAndrew Morton *(.initcall6s.init) \ 643735a7ffbSAndrew Morton *(.initcall7.init) \ 644735a7ffbSAndrew Morton *(.initcall7s.init) 64561ce1efeSAndrew Morton 646ef53dae8SSam Ravnborg #define INIT_CALLS \ 647ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initcall_start) = .; \ 648ef53dae8SSam Ravnborg INITCALLS \ 649ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initcall_end) = .; 650ef53dae8SSam Ravnborg 651ef53dae8SSam Ravnborg #define CON_INITCALL \ 652ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__con_initcall_start) = .; \ 653ef53dae8SSam Ravnborg *(.con_initcall.init) \ 654ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__con_initcall_end) = .; 655ef53dae8SSam Ravnborg 656ef53dae8SSam Ravnborg #define SECURITY_INITCALL \ 657ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__security_initcall_start) = .; \ 658ef53dae8SSam Ravnborg *(.security_initcall.init) \ 659ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__security_initcall_end) = .; 660ef53dae8SSam Ravnborg 661ef53dae8SSam Ravnborg #ifdef CONFIG_BLK_DEV_INITRD 662ef53dae8SSam Ravnborg #define INIT_RAM_FS \ 663d8826262SMike Frysinger . = ALIGN(4); \ 664ef53dae8SSam Ravnborg VMLINUX_SYMBOL(__initramfs_start) = .; \ 665ef53dae8SSam Ravnborg *(.init.ramfs) \ 666ffe8018cSHendrik Brueckner . = ALIGN(8); \ 667ffe8018cSHendrik Brueckner *(.init.ramfs.info) 668ef53dae8SSam Ravnborg #else 669eadfe219SDavid Howells #define INIT_RAM_FS 670ef53dae8SSam Ravnborg #endif 671ef53dae8SSam Ravnborg 672023bf6f1STejun Heo /* 673023bf6f1STejun Heo * Default discarded sections. 674023bf6f1STejun Heo * 675023bf6f1STejun Heo * Some archs want to discard exit text/data at runtime rather than 676023bf6f1STejun Heo * link time due to cross-section references such as alt instructions, 677023bf6f1STejun Heo * bug table, eh_frame, etc. DISCARDS must be the last of output 678023bf6f1STejun Heo * section definitions so that such archs put those in earlier section 679023bf6f1STejun Heo * definitions. 680023bf6f1STejun Heo */ 681405d967dSTejun Heo #define DISCARDS \ 682405d967dSTejun Heo /DISCARD/ : { \ 683405d967dSTejun Heo EXIT_TEXT \ 684405d967dSTejun Heo EXIT_DATA \ 685023bf6f1STejun Heo EXIT_CALL \ 686405d967dSTejun Heo *(.discard) \ 687c7f52cdcSJeremy Fitzhardinge *(.discard.*) \ 688405d967dSTejun Heo } 689405d967dSTejun Heo 6903e5d8f97STejun Heo /** 6916b7c38d5STejun Heo * PERCPU_VADDR - define output section for percpu area 69219df0c2fSTejun Heo * @cacheline: cacheline size 6933e5d8f97STejun Heo * @vaddr: explicit base address (optional) 6943e5d8f97STejun Heo * @phdr: destination PHDR (optional) 6953e5d8f97STejun Heo * 69619df0c2fSTejun Heo * Macro which expands to output section for percpu area. 69719df0c2fSTejun Heo * 69819df0c2fSTejun Heo * @cacheline is used to align subsections to avoid false cacheline 69919df0c2fSTejun Heo * sharing between subsections for different purposes. 70019df0c2fSTejun Heo * 70119df0c2fSTejun Heo * If @vaddr is not blank, it specifies explicit base address and all 70219df0c2fSTejun Heo * percpu symbols will be offset from the given address. If blank, 70319df0c2fSTejun Heo * @vaddr always equals @laddr + LOAD_OFFSET. 7043e5d8f97STejun Heo * 7053e5d8f97STejun Heo * @phdr defines the output PHDR to use if not blank. Be warned that 7063e5d8f97STejun Heo * output PHDR is sticky. If @phdr is specified, the next output 7073e5d8f97STejun Heo * section in the linker script will go there too. @phdr should have 7083e5d8f97STejun Heo * a leading colon. 7093e5d8f97STejun Heo * 7103ac6cffeSTejun Heo * Note that this macros defines __per_cpu_load as an absolute symbol. 7113ac6cffeSTejun Heo * If there is no need to put the percpu section at a predetermined 7123ac6cffeSTejun Heo * address, use PERCPU(). 7133e5d8f97STejun Heo */ 71419df0c2fSTejun Heo #define PERCPU_VADDR(cacheline, vaddr, phdr) \ 715dba3d36bSIngo Molnar VMLINUX_SYMBOL(__per_cpu_load) = .; \ 7163d9a854cSDenys Vlasenko .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ 7176b7c38d5STejun Heo - LOAD_OFFSET) { \ 718c6de0026SYoshinori Sato VMLINUX_SYMBOL(__per_cpu_start) = .; \ 7193d9a854cSDenys Vlasenko *(.data..percpu..first) \ 720c957ef2cSShaohua Li . = ALIGN(PAGE_SIZE); \ 7213d9a854cSDenys Vlasenko *(.data..percpu..page_aligned) \ 72219df0c2fSTejun Heo . = ALIGN(cacheline); \ 723c957ef2cSShaohua Li *(.data..percpu..readmostly) \ 72419df0c2fSTejun Heo . = ALIGN(cacheline); \ 7253d9a854cSDenys Vlasenko *(.data..percpu) \ 7263d9a854cSDenys Vlasenko *(.data..percpu..shared_aligned) \ 7276b7c38d5STejun Heo VMLINUX_SYMBOL(__per_cpu_end) = .; \ 7286b7c38d5STejun Heo } phdr \ 7293d9a854cSDenys Vlasenko . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data..percpu); 7303e5d8f97STejun Heo 7313e5d8f97STejun Heo /** 7323e5d8f97STejun Heo * PERCPU - define output section for percpu area, simple version 73319df0c2fSTejun Heo * @cacheline: cacheline size 7343e5d8f97STejun Heo * @align: required alignment 7353e5d8f97STejun Heo * 73619df0c2fSTejun Heo * Align to @align and outputs output section for percpu area. This macro 73719df0c2fSTejun Heo * doesn't manipulate @vaddr or @phdr and __per_cpu_load and 7383e5d8f97STejun Heo * __per_cpu_start will be identical. 7393ac6cffeSTejun Heo * 74019df0c2fSTejun Heo * This macro is equivalent to ALIGN(@align); PERCPU_VADDR(@cacheline,,) 74119df0c2fSTejun Heo * except that __per_cpu_load is defined as a relative symbol against 74219df0c2fSTejun Heo * .data..percpu which is required for relocatable x86_32 configuration. 7433e5d8f97STejun Heo */ 74419df0c2fSTejun Heo #define PERCPU(cacheline, align) \ 7453e5d8f97STejun Heo . = ALIGN(align); \ 7463d9a854cSDenys Vlasenko .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ 7473ac6cffeSTejun Heo VMLINUX_SYMBOL(__per_cpu_load) = .; \ 7483ac6cffeSTejun Heo VMLINUX_SYMBOL(__per_cpu_start) = .; \ 7493d9a854cSDenys Vlasenko *(.data..percpu..first) \ 750c957ef2cSShaohua Li . = ALIGN(PAGE_SIZE); \ 7513d9a854cSDenys Vlasenko *(.data..percpu..page_aligned) \ 75219df0c2fSTejun Heo . = ALIGN(cacheline); \ 7532aeb66d3SH. Peter Anvin *(.data..percpu..readmostly) \ 75419df0c2fSTejun Heo . = ALIGN(cacheline); \ 7553d9a854cSDenys Vlasenko *(.data..percpu) \ 7563d9a854cSDenys Vlasenko *(.data..percpu..shared_aligned) \ 7573ac6cffeSTejun Heo VMLINUX_SYMBOL(__per_cpu_end) = .; \ 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