xref: /openbmc/linux/arch/arm/kernel/vmlinux.lds.S (revision fd589a8f)
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		*(.discard)
87		*(.ARM.exidx.exit.text)
88		*(.ARM.extab.exit.text)
89#ifndef CONFIG_HOTPLUG_CPU
90		*(.ARM.exidx.cpuexit.text)
91		*(.ARM.extab.cpuexit.text)
92#endif
93#ifndef CONFIG_HOTPLUG
94		*(.ARM.exidx.devexit.text)
95		*(.ARM.extab.devexit.text)
96#endif
97#ifndef CONFIG_MMU
98		*(.fixup)
99		*(__ex_table)
100#endif
101	}
102
103	.text : {			/* Real text segment		*/
104		_text = .;		/* Text and read-only data	*/
105			__exception_text_start = .;
106			*(.exception.text)
107			__exception_text_end = .;
108			TEXT_TEXT
109			SCHED_TEXT
110			LOCK_TEXT
111			KPROBES_TEXT
112#ifdef CONFIG_MMU
113			*(.fixup)
114#endif
115			*(.gnu.warning)
116			*(.rodata)
117			*(.rodata.*)
118			*(.glue_7)
119			*(.glue_7t)
120		*(.got)			/* Global offset table		*/
121	}
122
123	RO_DATA(PAGE_SIZE)
124
125	_etext = .;			/* End of text and rodata section */
126
127#ifdef CONFIG_ARM_UNWIND
128	/*
129	 * Stack unwinding tables
130	 */
131	. = ALIGN(8);
132	.ARM.unwind_idx : {
133		__start_unwind_idx = .;
134		*(.ARM.exidx*)
135		__stop_unwind_idx = .;
136	}
137	.ARM.unwind_tab : {
138		__start_unwind_tab = .;
139		*(.ARM.extab*)
140		__stop_unwind_tab = .;
141	}
142#endif
143
144#ifdef CONFIG_XIP_KERNEL
145	__data_loc = ALIGN(4);		/* location in binary */
146	. = PAGE_OFFSET + TEXT_OFFSET;
147#else
148	. = ALIGN(THREAD_SIZE);
149	__data_loc = .;
150#endif
151
152	.data : AT(__data_loc) {
153		_data = .;		/* address in memory */
154		_sdata = .;
155
156		/*
157		 * first, the init task union, aligned
158		 * to an 8192 byte boundary.
159		 */
160		*(.data.init_task)
161
162#ifdef CONFIG_XIP_KERNEL
163		. = ALIGN(PAGE_SIZE);
164		__init_begin = .;
165		INIT_DATA
166		. = ALIGN(PAGE_SIZE);
167		__init_end = .;
168#endif
169
170		. = ALIGN(PAGE_SIZE);
171		__nosave_begin = .;
172		*(.data.nosave)
173		. = ALIGN(PAGE_SIZE);
174		__nosave_end = .;
175
176		/*
177		 * then the cacheline aligned data
178		 */
179		. = ALIGN(32);
180		*(.data.cacheline_aligned)
181
182		/*
183		 * The exception fixup table (might need resorting at runtime)
184		 */
185		. = ALIGN(32);
186		__start___ex_table = .;
187#ifdef CONFIG_MMU
188		*(__ex_table)
189#endif
190		__stop___ex_table = .;
191
192		/*
193		 * and the usual data section
194		 */
195		DATA_DATA
196		CONSTRUCTORS
197
198		_edata = .;
199	}
200	_edata_loc = __data_loc + SIZEOF(.data);
201
202	.bss : {
203		__bss_start = .;	/* BSS				*/
204		*(.bss)
205		*(COMMON)
206		__bss_stop = .;
207		_end = .;
208	}
209					/* Stabs debugging sections.	*/
210	.stab 0 : { *(.stab) }
211	.stabstr 0 : { *(.stabstr) }
212	.stab.excl 0 : { *(.stab.excl) }
213	.stab.exclstr 0 : { *(.stab.exclstr) }
214	.stab.index 0 : { *(.stab.index) }
215	.stab.indexstr 0 : { *(.stab.indexstr) }
216	.comment 0 : { *(.comment) }
217}
218
219/*
220 * These must never be empty
221 * If you have to comment these two assert statements out, your
222 * binutils is too old (for other reasons as well)
223 */
224ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
225ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
226