xref: /linux/arch/arm/kernel/vmlinux.lds.S (revision 5bdef865eb358b6f3760e25e591ae115e9eeddef)
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#include <asm/page.h>
10
11OUTPUT_ARCH(arm)
12ENTRY(stext)
13
14#ifndef __ARMEB__
15jiffies = jiffies_64;
16#else
17jiffies = jiffies_64 + 4;
18#endif
19
20SECTIONS
21{
22#ifdef CONFIG_XIP_KERNEL
23	. = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);
24#else
25	. = PAGE_OFFSET + TEXT_OFFSET;
26#endif
27	.text.head : {
28		_stext = .;
29		_sinittext = .;
30		*(.text.head)
31	}
32
33	.init : {			/* Init code and data		*/
34			INIT_TEXT
35		_einittext = .;
36		__proc_info_begin = .;
37			*(.proc.info.init)
38		__proc_info_end = .;
39		__arch_info_begin = .;
40			*(.arch.info.init)
41		__arch_info_end = .;
42		__tagtable_begin = .;
43			*(.taglist.init)
44		__tagtable_end = .;
45		. = ALIGN(16);
46		__setup_start = .;
47			*(.init.setup)
48		__setup_end = .;
49		__early_begin = .;
50			*(.early_param.init)
51		__early_end = .;
52		__initcall_start = .;
53			INITCALLS
54		__initcall_end = .;
55		__con_initcall_start = .;
56			*(.con_initcall.init)
57		__con_initcall_end = .;
58		__security_initcall_start = .;
59			*(.security_initcall.init)
60		__security_initcall_end = .;
61#ifdef CONFIG_BLK_DEV_INITRD
62		. = ALIGN(32);
63		__initramfs_start = .;
64			usr/built-in.o(.init.ramfs)
65		__initramfs_end = .;
66#endif
67		. = ALIGN(PAGE_SIZE);
68		__per_cpu_load = .;
69		__per_cpu_start = .;
70			*(.data.percpu.page_aligned)
71			*(.data.percpu)
72			*(.data.percpu.shared_aligned)
73		__per_cpu_end = .;
74#ifndef CONFIG_XIP_KERNEL
75		__init_begin = _stext;
76		INIT_DATA
77		. = ALIGN(PAGE_SIZE);
78		__init_end = .;
79#endif
80	}
81
82	/DISCARD/ : {			/* Exit code and data		*/
83		EXIT_TEXT
84		EXIT_DATA
85		*(.exitcall.exit)
86		*(.ARM.exidx.exit.text)
87		*(.ARM.extab.exit.text)
88#ifndef CONFIG_HOTPLUG_CPU
89		*(.ARM.exidx.cpuexit.text)
90		*(.ARM.extab.cpuexit.text)
91#endif
92#ifndef CONFIG_HOTPLUG
93		*(.ARM.exidx.devexit.text)
94		*(.ARM.extab.devexit.text)
95#endif
96#ifndef CONFIG_MMU
97		*(.fixup)
98		*(__ex_table)
99#endif
100	}
101
102	.text : {			/* Real text segment		*/
103		_text = .;		/* Text and read-only data	*/
104			__exception_text_start = .;
105			*(.exception.text)
106			__exception_text_end = .;
107			TEXT_TEXT
108			SCHED_TEXT
109			LOCK_TEXT
110			KPROBES_TEXT
111#ifdef CONFIG_MMU
112			*(.fixup)
113#endif
114			*(.gnu.warning)
115			*(.rodata)
116			*(.rodata.*)
117			*(.glue_7)
118			*(.glue_7t)
119		*(.got)			/* Global offset table		*/
120	}
121
122	RO_DATA(PAGE_SIZE)
123
124	_etext = .;			/* End of text and rodata section */
125
126#ifdef CONFIG_ARM_UNWIND
127	/*
128	 * Stack unwinding tables
129	 */
130	. = ALIGN(8);
131	.ARM.unwind_idx : {
132		__start_unwind_idx = .;
133		*(.ARM.exidx*)
134		__stop_unwind_idx = .;
135	}
136	.ARM.unwind_tab : {
137		__start_unwind_tab = .;
138		*(.ARM.extab*)
139		__stop_unwind_tab = .;
140	}
141#endif
142
143#ifdef CONFIG_XIP_KERNEL
144	__data_loc = ALIGN(4);		/* location in binary */
145	. = PAGE_OFFSET + TEXT_OFFSET;
146#else
147	. = ALIGN(THREAD_SIZE);
148	__data_loc = .;
149#endif
150
151	.data : AT(__data_loc) {
152		_data = .;		/* address in memory */
153		_sdata = .;
154
155		/*
156		 * first, the init task union, aligned
157		 * to an 8192 byte boundary.
158		 */
159		*(.data.init_task)
160
161#ifdef CONFIG_XIP_KERNEL
162		. = ALIGN(PAGE_SIZE);
163		__init_begin = .;
164		INIT_DATA
165		. = ALIGN(PAGE_SIZE);
166		__init_end = .;
167#endif
168
169		. = ALIGN(PAGE_SIZE);
170		__nosave_begin = .;
171		*(.data.nosave)
172		. = ALIGN(PAGE_SIZE);
173		__nosave_end = .;
174
175		/*
176		 * then the cacheline aligned data
177		 */
178		. = ALIGN(32);
179		*(.data.cacheline_aligned)
180
181		/*
182		 * The exception fixup table (might need resorting at runtime)
183		 */
184		. = ALIGN(32);
185		__start___ex_table = .;
186#ifdef CONFIG_MMU
187		*(__ex_table)
188#endif
189		__stop___ex_table = .;
190
191		/*
192		 * and the usual data section
193		 */
194		DATA_DATA
195		CONSTRUCTORS
196
197		_edata = .;
198	}
199	_edata_loc = __data_loc + SIZEOF(.data);
200
201	.bss : {
202		__bss_start = .;	/* BSS				*/
203		*(.bss)
204		*(COMMON)
205		__bss_stop = .;
206		_end = .;
207	}
208					/* Stabs debugging sections.	*/
209	.stab 0 : { *(.stab) }
210	.stabstr 0 : { *(.stabstr) }
211	.stab.excl 0 : { *(.stab.excl) }
212	.stab.exclstr 0 : { *(.stab.exclstr) }
213	.stab.index 0 : { *(.stab.index) }
214	.stab.indexstr 0 : { *(.stab.indexstr) }
215	.comment 0 : { *(.comment) }
216}
217
218/*
219 * These must never be empty
220 * If you have to comment these two assert statements out, your
221 * binutils is too old (for other reasons as well)
222 */
223ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
224ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
225