1/* ld script to make ARM Linux kernel 2 * taken from the i386 version by Russell King 3 * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz> 4 */ 5 6#include <asm-generic/vmlinux.lds.h> 7#include <asm/thread_info.h> 8#include <asm/memory.h> 9 10OUTPUT_ARCH(arm) 11ENTRY(stext) 12 13#ifndef __ARMEB__ 14jiffies = jiffies_64; 15#else 16jiffies = jiffies_64 + 4; 17#endif 18 19SECTIONS 20{ 21#ifdef CONFIG_XIP_KERNEL 22 . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR); 23#else 24 . = PAGE_OFFSET + TEXT_OFFSET; 25#endif 26 .init : { /* Init code and data */ 27 _stext = .; 28 _sinittext = .; 29 *(.init.text) 30 _einittext = .; 31 __proc_info_begin = .; 32 *(.proc.info.init) 33 __proc_info_end = .; 34 __arch_info_begin = .; 35 *(.arch.info.init) 36 __arch_info_end = .; 37 __tagtable_begin = .; 38 *(.taglist.init) 39 __tagtable_end = .; 40 . = ALIGN(16); 41 __setup_start = .; 42 *(.init.setup) 43 __setup_end = .; 44 __early_begin = .; 45 *(.early_param.init) 46 __early_end = .; 47 __initcall_start = .; 48 INITCALLS 49 __initcall_end = .; 50 __con_initcall_start = .; 51 *(.con_initcall.init) 52 __con_initcall_end = .; 53 __security_initcall_start = .; 54 *(.security_initcall.init) 55 __security_initcall_end = .; 56 . = ALIGN(32); 57 __initramfs_start = .; 58 usr/built-in.o(.init.ramfs) 59 __initramfs_end = .; 60 . = ALIGN(64); 61 __per_cpu_start = .; 62 *(.data.percpu) 63 __per_cpu_end = .; 64#ifndef CONFIG_XIP_KERNEL 65 __init_begin = _stext; 66 *(.init.data) 67 . = ALIGN(4096); 68 __init_end = .; 69#endif 70 } 71 72 /DISCARD/ : { /* Exit code and data */ 73 *(.exit.text) 74 *(.exit.data) 75 *(.exitcall.exit) 76#ifndef CONFIG_MMU 77 *(.fixup) 78 *(__ex_table) 79#endif 80 } 81 82 .text : { /* Real text segment */ 83 _text = .; /* Text and read-only data */ 84 *(.text) 85 SCHED_TEXT 86 LOCK_TEXT 87#ifdef CONFIG_MMU 88 *(.fixup) 89#endif 90 *(.gnu.warning) 91 *(.rodata) 92 *(.rodata.*) 93 *(.glue_7) 94 *(.glue_7t) 95 *(.got) /* Global offset table */ 96 } 97 98 RODATA 99 100 _etext = .; /* End of text and rodata section */ 101 102#ifdef CONFIG_XIP_KERNEL 103 __data_loc = ALIGN(4); /* location in binary */ 104 . = PAGE_OFFSET + TEXT_OFFSET; 105#else 106 . = ALIGN(THREAD_SIZE); 107 __data_loc = .; 108#endif 109 110 .data : AT(__data_loc) { 111 __data_start = .; /* address in memory */ 112 113 /* 114 * first, the init task union, aligned 115 * to an 8192 byte boundary. 116 */ 117 *(.init.task) 118 119#ifdef CONFIG_XIP_KERNEL 120 . = ALIGN(4096); 121 __init_begin = .; 122 *(.init.data) 123 . = ALIGN(4096); 124 __init_end = .; 125#endif 126 127 . = ALIGN(4096); 128 __nosave_begin = .; 129 *(.data.nosave) 130 . = ALIGN(4096); 131 __nosave_end = .; 132 133 /* 134 * then the cacheline aligned data 135 */ 136 . = ALIGN(32); 137 *(.data.cacheline_aligned) 138 139 /* 140 * The exception fixup table (might need resorting at runtime) 141 */ 142 . = ALIGN(32); 143 __start___ex_table = .; 144#ifdef CONFIG_MMU 145 *(__ex_table) 146#endif 147 __stop___ex_table = .; 148 149 /* 150 * and the usual data section 151 */ 152 *(.data) 153 CONSTRUCTORS 154 155 _edata = .; 156 } 157 158 .bss : { 159 __bss_start = .; /* BSS */ 160 *(.bss) 161 *(COMMON) 162 _end = .; 163 } 164 /* Stabs debugging sections. */ 165 .stab 0 : { *(.stab) } 166 .stabstr 0 : { *(.stabstr) } 167 .stab.excl 0 : { *(.stab.excl) } 168 .stab.exclstr 0 : { *(.stab.exclstr) } 169 .stab.index 0 : { *(.stab.index) } 170 .stab.indexstr 0 : { *(.stab.indexstr) } 171 .comment 0 : { *(.comment) } 172} 173 174/* 175 * These must never be empty 176 * If you have to comment these two assert statements out, your 177 * binutils is too old (for other reasons as well) 178 */ 179ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support") 180ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined") 181