xref: /linux/arch/powerpc/kernel/vmlinux.lds.S (revision 54cb27a71f51d304342c79e62fd7667f2171062b)
1c51e3a41SPaul Mackerras#ifdef CONFIG_PPC64
2e8222502SBenjamin Herrenschmidt#define PROVIDE32(x)	PROVIDE(__unused__##x)
3c51e3a41SPaul Mackerras#else
4e8222502SBenjamin Herrenschmidt#define PROVIDE32(x)	PROVIDE(x)
5c51e3a41SPaul Mackerras#endif
64846c5deSKumar Gala#include <asm/page.h>
714cf11afSPaul Mackerras#include <asm-generic/vmlinux.lds.h>
8bd67fcf9STony Breeds#include <asm/cache.h>
962bef288STim Abbott#include <asm/thread_info.h>
1014cf11afSPaul Mackerras
11e19e4ab4SMichael EllermanENTRY(_stext)
12e19e4ab4SMichael Ellerman
13c69cccc9SSegher BoessenkoolPHDRS {
14c69cccc9SSegher Boessenkool	kernel PT_LOAD FLAGS(7); /* RWX */
15c69cccc9SSegher Boessenkool	notes PT_NOTE FLAGS(0);
16c69cccc9SSegher Boessenkool	dummy PT_NOTE FLAGS(0);
17c69cccc9SSegher Boessenkool
18c69cccc9SSegher Boessenkool	/* binutils < 2.18 has a bug that makes it misbehave when taking an
19c69cccc9SSegher Boessenkool	   ELF file with all segments at load address 0 as input.  This
20c69cccc9SSegher Boessenkool	   happens when running "strip" on vmlinux, because of the AT() magic
21c69cccc9SSegher Boessenkool	   in this linker script.  People using GCC >= 4.2 won't run into
22c69cccc9SSegher Boessenkool	   this problem, because the "build-id" support will put some data
23c69cccc9SSegher Boessenkool	   into the "notes" segment (at a non-zero load address).
24c69cccc9SSegher Boessenkool
25c69cccc9SSegher Boessenkool	   To work around this, we force some data into both the "dummy"
26c69cccc9SSegher Boessenkool	   segment and the kernel segment, so the dummy segment will get a
27c69cccc9SSegher Boessenkool	   non-zero load address.  It's not enough to always create the
28c69cccc9SSegher Boessenkool	   "notes" segment, since if nothing gets assigned to it, its load
29c69cccc9SSegher Boessenkool	   address will be zero.  */
30c69cccc9SSegher Boessenkool}
31c69cccc9SSegher Boessenkool
32cabb5587SStephen Rothwell#ifdef CONFIG_PPC64
33cabb5587SStephen RothwellOUTPUT_ARCH(powerpc:common64)
34cabb5587SStephen Rothwelljiffies = jiffies_64;
35cabb5587SStephen Rothwell#else
3614cf11afSPaul MackerrasOUTPUT_ARCH(powerpc:common)
3714cf11afSPaul Mackerrasjiffies = jiffies_64 + 4;
38cabb5587SStephen Rothwell#endif
3914cf11afSPaul MackerrasSECTIONS
4014cf11afSPaul Mackerras{
41d4703aefSRusty Russell	. = 0;
42d4703aefSRusty Russell	reloc_start = .;
43d4703aefSRusty Russell
44e19e4ab4SMichael Ellerman	. = KERNELBASE;
45cabb5587SStephen Rothwell
46e8222502SBenjamin Herrenschmidt/*
47e8222502SBenjamin Herrenschmidt * Text, read only data and other permanent read-only sections
48e8222502SBenjamin Herrenschmidt */
49e8222502SBenjamin Herrenschmidt
50e8222502SBenjamin Herrenschmidt	/* Text and gots */
51366234f6SKumar Gala	.text : AT(ADDR(.text) - LOAD_OFFSET) {
52748a7683SKumar Gala		ALIGN_FUNCTION();
53e7039845STim Abbott		HEAD_TEXT
54fd593d12SEric W. Biederman		_text = .;
5513beadd9STim Abbott		/* careful! __ftr_alt_* sections need to be close to .text */
5613beadd9STim Abbott		*(.text .fixup __ftr_alt_* .ref.text)
5714cf11afSPaul Mackerras		SCHED_TEXT
5814cf11afSPaul Mackerras		LOCK_TEXT
59cabb5587SStephen Rothwell		KPROBES_TEXT
606794c782SSteven Rostedt		IRQENTRY_TEXT
61e8222502SBenjamin Herrenschmidt
62cabb5587SStephen Rothwell#ifdef CONFIG_PPC32
6314cf11afSPaul Mackerras		*(.got1)
6414cf11afSPaul Mackerras		__got2_start = .;
6514cf11afSPaul Mackerras		*(.got2)
6614cf11afSPaul Mackerras		__got2_end = .;
67e8222502SBenjamin Herrenschmidt#endif /* CONFIG_PPC32 */
68e8222502SBenjamin Herrenschmidt
69303996daSStephen Rothwell	} :kernel
70303996daSStephen Rothwell
71cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
72cabb5587SStephen Rothwell	_etext = .;
73e8222502SBenjamin Herrenschmidt	PROVIDE32 (etext = .);
7414cf11afSPaul Mackerras
75e8222502SBenjamin Herrenschmidt	/* Read-only data */
7614cf11afSPaul Mackerras	RODATA
7714cf11afSPaul Mackerras
7862bef288STim Abbott	EXCEPTION_TABLE(0)
7914cf11afSPaul Mackerras
80c69cccc9SSegher Boessenkool	NOTES :kernel :notes
81c69cccc9SSegher Boessenkool
82c69cccc9SSegher Boessenkool	/* The dummy segment contents for the bug workaround mentioned above
83c69cccc9SSegher Boessenkool	   near PHDRS.  */
8480c60bf9SSegher Boessenkool	.dummy : AT(ADDR(.dummy) - LOAD_OFFSET) {
85e16459c6SMilton Miller		LONG(0)
86e16459c6SMilton Miller		LONG(0)
87e16459c6SMilton Miller		LONG(0)
88c69cccc9SSegher Boessenkool	} :kernel :dummy
898fb775eeSRoland McGrath
90e8222502SBenjamin Herrenschmidt/*
91e8222502SBenjamin Herrenschmidt * Init sections discarded at runtime
92e8222502SBenjamin Herrenschmidt */
93cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
9414cf11afSPaul Mackerras	__init_begin = .;
9562bef288STim Abbott	INIT_TEXT_SECTION(PAGE_SIZE) :kernel
96e8222502SBenjamin Herrenschmidt
9714cf11afSPaul Mackerras	/* .exit.text is discarded at runtime, not link time,
98e8222502SBenjamin Herrenschmidt	 * to deal with references from __bug_table
99e8222502SBenjamin Herrenschmidt	 */
100366234f6SKumar Gala	.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
10101ba2bdcSSam Ravnborg		EXIT_TEXT
10201ba2bdcSSam Ravnborg	}
103e8222502SBenjamin Herrenschmidt
104366234f6SKumar Gala	.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
10501ba2bdcSSam Ravnborg		INIT_DATA
10614cf11afSPaul Mackerras		__vtop_table_begin = .;
10714cf11afSPaul Mackerras		*(.vtop_fixup);
10814cf11afSPaul Mackerras		__vtop_table_end = .;
10914cf11afSPaul Mackerras		__ptov_table_begin = .;
11014cf11afSPaul Mackerras		*(.ptov_fixup);
11114cf11afSPaul Mackerras		__ptov_table_end = .;
112c4e3ea25SStephen Rothwell#ifdef CONFIG_PPC_ISERIES
113c4e3ea25SStephen Rothwell		__dt_strings_start = .;
114c4e3ea25SStephen Rothwell		*(.dt_strings);
115c4e3ea25SStephen Rothwell		__dt_strings_end = .;
116c4e3ea25SStephen Rothwell#endif
11714cf11afSPaul Mackerras	}
118cabb5587SStephen Rothwell
119366234f6SKumar Gala	.init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
12062bef288STim Abbott		INIT_SETUP(16)
121cabb5587SStephen Rothwell	}
122cabb5587SStephen Rothwell
123366234f6SKumar Gala	.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
12462bef288STim Abbott		INIT_CALLS
12514cf11afSPaul Mackerras	}
12614cf11afSPaul Mackerras
127366234f6SKumar Gala	.con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
12862bef288STim Abbott		CON_INITCALL
129cabb5587SStephen Rothwell	}
13014cf11afSPaul Mackerras
13114cf11afSPaul Mackerras	SECURITY_INIT
13214cf11afSPaul Mackerras
133e8222502SBenjamin Herrenschmidt	. = ALIGN(8);
134366234f6SKumar Gala	__ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
13514cf11afSPaul Mackerras		__start___ftr_fixup = .;
136e8222502SBenjamin Herrenschmidt		*(__ftr_fixup)
13714cf11afSPaul Mackerras		__stop___ftr_fixup = .;
138e8222502SBenjamin Herrenschmidt	}
1392d1b2027SKumar Gala	. = ALIGN(8);
1407c03d653SBenjamin Herrenschmidt	__mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) {
1417c03d653SBenjamin Herrenschmidt		__start___mmu_ftr_fixup = .;
1427c03d653SBenjamin Herrenschmidt		*(__mmu_ftr_fixup)
1437c03d653SBenjamin Herrenschmidt		__stop___mmu_ftr_fixup = .;
1447c03d653SBenjamin Herrenschmidt	}
1457c03d653SBenjamin Herrenschmidt	. = ALIGN(8);
1462d1b2027SKumar Gala	__lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) {
1472d1b2027SKumar Gala		__start___lwsync_fixup = .;
1482d1b2027SKumar Gala		*(__lwsync_fixup)
1492d1b2027SKumar Gala		__stop___lwsync_fixup = .;
1502d1b2027SKumar Gala	}
1513f639ee8SStephen Rothwell#ifdef CONFIG_PPC64
1523f639ee8SStephen Rothwell	. = ALIGN(8);
153366234f6SKumar Gala	__fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
1543f639ee8SStephen Rothwell		__start___fw_ftr_fixup = .;
1553f639ee8SStephen Rothwell		*(__fw_ftr_fixup)
1563f639ee8SStephen Rothwell		__stop___fw_ftr_fixup = .;
1573f639ee8SStephen Rothwell	}
1583f639ee8SStephen Rothwell#endif
159366234f6SKumar Gala	.init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
16062bef288STim Abbott		INIT_RAM_FS
161cabb5587SStephen Rothwell	}
16262bef288STim Abbott
16319390c4dSTejun Heo	PERCPU(PAGE_SIZE)
16414cf11afSPaul Mackerras
165e8222502SBenjamin Herrenschmidt	. = ALIGN(8);
166366234f6SKumar Gala	.machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
167e8222502SBenjamin Herrenschmidt		__machine_desc_start = . ;
168e8222502SBenjamin Herrenschmidt		*(.machine.desc)
169e8222502SBenjamin Herrenschmidt		__machine_desc_end = . ;
170e8222502SBenjamin Herrenschmidt	}
1712a4b9c5aSPaul Mackerras#ifdef CONFIG_RELOCATABLE
172549e8152SPaul Mackerras	. = ALIGN(8);
173549e8152SPaul Mackerras	.dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET) { *(.dynsym) }
174549e8152SPaul Mackerras	.dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) }
175549e8152SPaul Mackerras	.dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET)
176549e8152SPaul Mackerras	{
177549e8152SPaul Mackerras		__dynamic_start = .;
178549e8152SPaul Mackerras		*(.dynamic)
179549e8152SPaul Mackerras	}
180549e8152SPaul Mackerras	.hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) }
181549e8152SPaul Mackerras	.interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) }
182549e8152SPaul Mackerras	.rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET)
183549e8152SPaul Mackerras	{
184549e8152SPaul Mackerras		__rela_dyn_start = .;
185549e8152SPaul Mackerras		*(.rela*)
186549e8152SPaul Mackerras	}
1872a4b9c5aSPaul Mackerras#endif
188e8222502SBenjamin Herrenschmidt
189cabb5587SStephen Rothwell	/* freed after init ends here */
190cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
191e8222502SBenjamin Herrenschmidt	__init_end = .;
192e8222502SBenjamin Herrenschmidt
193e8222502SBenjamin Herrenschmidt/*
194e8222502SBenjamin Herrenschmidt * And now the various read/write data
195e8222502SBenjamin Herrenschmidt */
196e8222502SBenjamin Herrenschmidt
197e8222502SBenjamin Herrenschmidt	. = ALIGN(PAGE_SIZE);
1984a288563SPaul Mackerras	_sdata = .;
199cabb5587SStephen Rothwell
200e8222502SBenjamin Herrenschmidt#ifdef CONFIG_PPC32
201366234f6SKumar Gala	.data : AT(ADDR(.data) - LOAD_OFFSET) {
202ca967258SSam Ravnborg		DATA_DATA
203e8222502SBenjamin Herrenschmidt		*(.sdata)
204e8222502SBenjamin Herrenschmidt		*(.got.plt) *(.got)
205cabb5587SStephen Rothwell	}
206e8222502SBenjamin Herrenschmidt#else
207366234f6SKumar Gala	.data : AT(ADDR(.data) - LOAD_OFFSET) {
2083ae0aa9fSMathieu Desnoyers		DATA_DATA
2093ae0aa9fSMathieu Desnoyers		*(.data.rel*)
2103ae0aa9fSMathieu Desnoyers		*(.toc1)
211cabb5587SStephen Rothwell		*(.branch_lt)
212cabb5587SStephen Rothwell	}
213cabb5587SStephen Rothwell
214366234f6SKumar Gala	.opd : AT(ADDR(.opd) - LOAD_OFFSET) {
215cabb5587SStephen Rothwell		*(.opd)
216cabb5587SStephen Rothwell	}
217cabb5587SStephen Rothwell
218366234f6SKumar Gala	.got : AT(ADDR(.got) - LOAD_OFFSET) {
219cabb5587SStephen Rothwell		__toc_start = .;
220cabb5587SStephen Rothwell		*(.got)
221cabb5587SStephen Rothwell		*(.toc)
222e8222502SBenjamin Herrenschmidt	}
223e8222502SBenjamin Herrenschmidt#endif
224e8222502SBenjamin Herrenschmidt
225e8222502SBenjamin Herrenschmidt	/* The initial task and kernel stack */
2262af7687fSTim Abbott	INIT_TASK_DATA_SECTION(THREAD_SIZE)
227cabb5587SStephen Rothwell
22875b13483STim Abbott	.data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) {
22962bef288STim Abbott		PAGE_ALIGNED_DATA(PAGE_SIZE)
230cabb5587SStephen Rothwell	}
23114cf11afSPaul Mackerras
2324af57b78STim Abbott	.data..cacheline_aligned : AT(ADDR(.data..cacheline_aligned) - LOAD_OFFSET) {
23362bef288STim Abbott		CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
234e8222502SBenjamin Herrenschmidt	}
23514cf11afSPaul Mackerras
236*54cb27a7SDenys Vlasenko	.data..read_mostly : AT(ADDR(.data..read_mostly) - LOAD_OFFSET) {
23762bef288STim Abbott		READ_MOSTLY_DATA(L1_CACHE_BYTES)
238bd67fcf9STony Breeds	}
239bd67fcf9STony Breeds
2405be2a213SSean MacLennan	. = ALIGN(PAGE_SIZE);
241366234f6SKumar Gala	.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
24262bef288STim Abbott		NOSAVE_DATA
243e8222502SBenjamin Herrenschmidt	}
24414cf11afSPaul Mackerras
245903444e4SMichael Ellerman	. = ALIGN(PAGE_SIZE);
246903444e4SMichael Ellerman	_edata  =  .;
247903444e4SMichael Ellerman	PROVIDE32 (edata = .);
248903444e4SMichael Ellerman
249e8222502SBenjamin Herrenschmidt/*
250e8222502SBenjamin Herrenschmidt * And finally the bss
251e8222502SBenjamin Herrenschmidt */
2524a288563SPaul Mackerras
25362bef288STim Abbott	BSS_SECTION(0, 0, 0)
254cabb5587SStephen Rothwell
255cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
256cabb5587SStephen Rothwell	_end = . ;
257e8222502SBenjamin Herrenschmidt	PROVIDE32 (end = .);
258023bf6f1STejun Heo
259023bf6f1STejun Heo	/* Sections to be discarded. */
260023bf6f1STejun Heo	DISCARDS
26114cf11afSPaul Mackerras}
262