xref: /openbmc/linux/arch/arm64/kernel/vmlinux.lds.S (revision 8c2c3df31e3b87cb5348e48776c366ebd1dc5a7a)
1*8c2c3df3SCatalin Marinas/*
2*8c2c3df3SCatalin Marinas * ld script to make ARM Linux kernel
3*8c2c3df3SCatalin Marinas * taken from the i386 version by Russell King
4*8c2c3df3SCatalin Marinas * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
5*8c2c3df3SCatalin Marinas */
6*8c2c3df3SCatalin Marinas
7*8c2c3df3SCatalin Marinas#include <asm-generic/vmlinux.lds.h>
8*8c2c3df3SCatalin Marinas#include <asm/thread_info.h>
9*8c2c3df3SCatalin Marinas#include <asm/memory.h>
10*8c2c3df3SCatalin Marinas#include <asm/page.h>
11*8c2c3df3SCatalin Marinas
12*8c2c3df3SCatalin Marinas#define ARM_EXIT_KEEP(x)
13*8c2c3df3SCatalin Marinas#define ARM_EXIT_DISCARD(x)	x
14*8c2c3df3SCatalin Marinas
15*8c2c3df3SCatalin MarinasOUTPUT_ARCH(aarch64)
16*8c2c3df3SCatalin MarinasENTRY(stext)
17*8c2c3df3SCatalin Marinas
18*8c2c3df3SCatalin Marinasjiffies = jiffies_64;
19*8c2c3df3SCatalin Marinas
20*8c2c3df3SCatalin MarinasSECTIONS
21*8c2c3df3SCatalin Marinas{
22*8c2c3df3SCatalin Marinas	/*
23*8c2c3df3SCatalin Marinas	 * XXX: The linker does not define how output sections are
24*8c2c3df3SCatalin Marinas	 * assigned to input sections when there are multiple statements
25*8c2c3df3SCatalin Marinas	 * matching the same input section name.  There is no documented
26*8c2c3df3SCatalin Marinas	 * order of matching.
27*8c2c3df3SCatalin Marinas	 */
28*8c2c3df3SCatalin Marinas	/DISCARD/ : {
29*8c2c3df3SCatalin Marinas		ARM_EXIT_DISCARD(EXIT_TEXT)
30*8c2c3df3SCatalin Marinas		ARM_EXIT_DISCARD(EXIT_DATA)
31*8c2c3df3SCatalin Marinas		EXIT_CALL
32*8c2c3df3SCatalin Marinas		*(.discard)
33*8c2c3df3SCatalin Marinas		*(.discard.*)
34*8c2c3df3SCatalin Marinas	}
35*8c2c3df3SCatalin Marinas
36*8c2c3df3SCatalin Marinas	. = PAGE_OFFSET + TEXT_OFFSET;
37*8c2c3df3SCatalin Marinas
38*8c2c3df3SCatalin Marinas	.head.text : {
39*8c2c3df3SCatalin Marinas		_text = .;
40*8c2c3df3SCatalin Marinas		HEAD_TEXT
41*8c2c3df3SCatalin Marinas	}
42*8c2c3df3SCatalin Marinas	.text : {			/* Real text segment		*/
43*8c2c3df3SCatalin Marinas		_stext = .;		/* Text and read-only data	*/
44*8c2c3df3SCatalin Marinas			*(.smp.pen.text)
45*8c2c3df3SCatalin Marinas			__exception_text_start = .;
46*8c2c3df3SCatalin Marinas			*(.exception.text)
47*8c2c3df3SCatalin Marinas			__exception_text_end = .;
48*8c2c3df3SCatalin Marinas			IRQENTRY_TEXT
49*8c2c3df3SCatalin Marinas			TEXT_TEXT
50*8c2c3df3SCatalin Marinas			SCHED_TEXT
51*8c2c3df3SCatalin Marinas			LOCK_TEXT
52*8c2c3df3SCatalin Marinas			*(.fixup)
53*8c2c3df3SCatalin Marinas			*(.gnu.warning)
54*8c2c3df3SCatalin Marinas		. = ALIGN(16);
55*8c2c3df3SCatalin Marinas		*(.got)			/* Global offset table		*/
56*8c2c3df3SCatalin Marinas	}
57*8c2c3df3SCatalin Marinas
58*8c2c3df3SCatalin Marinas	RO_DATA(PAGE_SIZE)
59*8c2c3df3SCatalin Marinas
60*8c2c3df3SCatalin Marinas	_etext = .;			/* End of text and rodata section */
61*8c2c3df3SCatalin Marinas
62*8c2c3df3SCatalin Marinas	. = ALIGN(PAGE_SIZE);
63*8c2c3df3SCatalin Marinas	__init_begin = .;
64*8c2c3df3SCatalin Marinas
65*8c2c3df3SCatalin Marinas	INIT_TEXT_SECTION(8)
66*8c2c3df3SCatalin Marinas	.exit.text : {
67*8c2c3df3SCatalin Marinas		ARM_EXIT_KEEP(EXIT_TEXT)
68*8c2c3df3SCatalin Marinas	}
69*8c2c3df3SCatalin Marinas	. = ALIGN(16);
70*8c2c3df3SCatalin Marinas	.init.data : {
71*8c2c3df3SCatalin Marinas		INIT_DATA
72*8c2c3df3SCatalin Marinas		INIT_SETUP(16)
73*8c2c3df3SCatalin Marinas		INIT_CALLS
74*8c2c3df3SCatalin Marinas		CON_INITCALL
75*8c2c3df3SCatalin Marinas		SECURITY_INITCALL
76*8c2c3df3SCatalin Marinas		INIT_RAM_FS
77*8c2c3df3SCatalin Marinas	}
78*8c2c3df3SCatalin Marinas	.exit.data : {
79*8c2c3df3SCatalin Marinas		ARM_EXIT_KEEP(EXIT_DATA)
80*8c2c3df3SCatalin Marinas	}
81*8c2c3df3SCatalin Marinas
82*8c2c3df3SCatalin Marinas	PERCPU_SECTION(64)
83*8c2c3df3SCatalin Marinas
84*8c2c3df3SCatalin Marinas	__init_end = .;
85*8c2c3df3SCatalin Marinas	. = ALIGN(THREAD_SIZE);
86*8c2c3df3SCatalin Marinas	__data_loc = .;
87*8c2c3df3SCatalin Marinas
88*8c2c3df3SCatalin Marinas	.data : AT(__data_loc) {
89*8c2c3df3SCatalin Marinas		_data = .;		/* address in memory */
90*8c2c3df3SCatalin Marinas		_sdata = .;
91*8c2c3df3SCatalin Marinas
92*8c2c3df3SCatalin Marinas		/*
93*8c2c3df3SCatalin Marinas		 * first, the init task union, aligned
94*8c2c3df3SCatalin Marinas		 * to an 8192 byte boundary.
95*8c2c3df3SCatalin Marinas		 */
96*8c2c3df3SCatalin Marinas		INIT_TASK_DATA(THREAD_SIZE)
97*8c2c3df3SCatalin Marinas		NOSAVE_DATA
98*8c2c3df3SCatalin Marinas		CACHELINE_ALIGNED_DATA(64)
99*8c2c3df3SCatalin Marinas		READ_MOSTLY_DATA(64)
100*8c2c3df3SCatalin Marinas
101*8c2c3df3SCatalin Marinas		/*
102*8c2c3df3SCatalin Marinas		 * The exception fixup table (might need resorting at runtime)
103*8c2c3df3SCatalin Marinas		 */
104*8c2c3df3SCatalin Marinas		. = ALIGN(32);
105*8c2c3df3SCatalin Marinas		__start___ex_table = .;
106*8c2c3df3SCatalin Marinas		*(__ex_table)
107*8c2c3df3SCatalin Marinas		__stop___ex_table = .;
108*8c2c3df3SCatalin Marinas
109*8c2c3df3SCatalin Marinas		/*
110*8c2c3df3SCatalin Marinas		 * and the usual data section
111*8c2c3df3SCatalin Marinas		 */
112*8c2c3df3SCatalin Marinas		DATA_DATA
113*8c2c3df3SCatalin Marinas		CONSTRUCTORS
114*8c2c3df3SCatalin Marinas
115*8c2c3df3SCatalin Marinas		_edata = .;
116*8c2c3df3SCatalin Marinas	}
117*8c2c3df3SCatalin Marinas	_edata_loc = __data_loc + SIZEOF(.data);
118*8c2c3df3SCatalin Marinas
119*8c2c3df3SCatalin Marinas	NOTES
120*8c2c3df3SCatalin Marinas
121*8c2c3df3SCatalin Marinas	BSS_SECTION(0, 0, 0)
122*8c2c3df3SCatalin Marinas	_end = .;
123*8c2c3df3SCatalin Marinas
124*8c2c3df3SCatalin Marinas	STABS_DEBUG
125*8c2c3df3SCatalin Marinas	.comment 0 : { *(.comment) }
126*8c2c3df3SCatalin Marinas}
127