xref: /linux/arch/powerpc/kernel/vmlinux.lds.S (revision 4c8123181d692c5b78650ee559f3d970440c9399)
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{
41e19e4ab4SMichael Ellerman	. = KERNELBASE;
42cabb5587SStephen Rothwell
43e8222502SBenjamin Herrenschmidt/*
44e8222502SBenjamin Herrenschmidt * Text, read only data and other permanent read-only sections
45e8222502SBenjamin Herrenschmidt */
46e8222502SBenjamin Herrenschmidt
47e8222502SBenjamin Herrenschmidt	/* Text and gots */
48366234f6SKumar Gala	.text : AT(ADDR(.text) - LOAD_OFFSET) {
49748a7683SKumar Gala		ALIGN_FUNCTION();
50e7039845STim Abbott		HEAD_TEXT
51fd593d12SEric W. Biederman		_text = .;
5213beadd9STim Abbott		/* careful! __ftr_alt_* sections need to be close to .text */
5313beadd9STim Abbott		*(.text .fixup __ftr_alt_* .ref.text)
5414cf11afSPaul Mackerras		SCHED_TEXT
5514cf11afSPaul Mackerras		LOCK_TEXT
56cabb5587SStephen Rothwell		KPROBES_TEXT
576794c782SSteven Rostedt		IRQENTRY_TEXT
58e8222502SBenjamin Herrenschmidt
59cabb5587SStephen Rothwell#ifdef CONFIG_PPC32
6014cf11afSPaul Mackerras		*(.got1)
6114cf11afSPaul Mackerras		__got2_start = .;
6214cf11afSPaul Mackerras		*(.got2)
6314cf11afSPaul Mackerras		__got2_end = .;
64e8222502SBenjamin Herrenschmidt#endif /* CONFIG_PPC32 */
65e8222502SBenjamin Herrenschmidt
66303996daSStephen Rothwell	} :kernel
67303996daSStephen Rothwell
68cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
69cabb5587SStephen Rothwell	_etext = .;
70e8222502SBenjamin Herrenschmidt	PROVIDE32 (etext = .);
7114cf11afSPaul Mackerras
72e8222502SBenjamin Herrenschmidt	/* Read-only data */
7314cf11afSPaul Mackerras	RODATA
7414cf11afSPaul Mackerras
7562bef288STim Abbott	EXCEPTION_TABLE(0)
7614cf11afSPaul Mackerras
77c69cccc9SSegher Boessenkool	NOTES :kernel :notes
78c69cccc9SSegher Boessenkool
79c69cccc9SSegher Boessenkool	/* The dummy segment contents for the bug workaround mentioned above
80c69cccc9SSegher Boessenkool	   near PHDRS.  */
8180c60bf9SSegher Boessenkool	.dummy : AT(ADDR(.dummy) - LOAD_OFFSET) {
82e16459c6SMilton Miller		LONG(0)
83e16459c6SMilton Miller		LONG(0)
84e16459c6SMilton Miller		LONG(0)
85c69cccc9SSegher Boessenkool	} :kernel :dummy
868fb775eeSRoland McGrath
87e8222502SBenjamin Herrenschmidt/*
88e8222502SBenjamin Herrenschmidt * Init sections discarded at runtime
89e8222502SBenjamin Herrenschmidt */
90cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
9114cf11afSPaul Mackerras	__init_begin = .;
9262bef288STim Abbott	INIT_TEXT_SECTION(PAGE_SIZE) :kernel
93e8222502SBenjamin Herrenschmidt
9414cf11afSPaul Mackerras	/* .exit.text is discarded at runtime, not link time,
95e8222502SBenjamin Herrenschmidt	 * to deal with references from __bug_table
96e8222502SBenjamin Herrenschmidt	 */
97366234f6SKumar Gala	.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
9801ba2bdcSSam Ravnborg		EXIT_TEXT
9901ba2bdcSSam Ravnborg	}
100e8222502SBenjamin Herrenschmidt
101366234f6SKumar Gala	.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
10201ba2bdcSSam Ravnborg		INIT_DATA
10314cf11afSPaul Mackerras		__vtop_table_begin = .;
10414cf11afSPaul Mackerras		*(.vtop_fixup);
10514cf11afSPaul Mackerras		__vtop_table_end = .;
10614cf11afSPaul Mackerras		__ptov_table_begin = .;
10714cf11afSPaul Mackerras		*(.ptov_fixup);
10814cf11afSPaul Mackerras		__ptov_table_end = .;
10914cf11afSPaul Mackerras	}
110cabb5587SStephen Rothwell
111366234f6SKumar Gala	.init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
11262bef288STim Abbott		INIT_SETUP(16)
113cabb5587SStephen Rothwell	}
114cabb5587SStephen Rothwell
115366234f6SKumar Gala	.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
11662bef288STim Abbott		INIT_CALLS
11714cf11afSPaul Mackerras	}
11814cf11afSPaul Mackerras
119366234f6SKumar Gala	.con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
12062bef288STim Abbott		CON_INITCALL
121cabb5587SStephen Rothwell	}
12214cf11afSPaul Mackerras
12314cf11afSPaul Mackerras	SECURITY_INIT
12414cf11afSPaul Mackerras
125e8222502SBenjamin Herrenschmidt	. = ALIGN(8);
126366234f6SKumar Gala	__ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
12714cf11afSPaul Mackerras		__start___ftr_fixup = .;
128e8222502SBenjamin Herrenschmidt		*(__ftr_fixup)
12914cf11afSPaul Mackerras		__stop___ftr_fixup = .;
130e8222502SBenjamin Herrenschmidt	}
1312d1b2027SKumar Gala	. = ALIGN(8);
1327c03d653SBenjamin Herrenschmidt	__mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) {
1337c03d653SBenjamin Herrenschmidt		__start___mmu_ftr_fixup = .;
1347c03d653SBenjamin Herrenschmidt		*(__mmu_ftr_fixup)
1357c03d653SBenjamin Herrenschmidt		__stop___mmu_ftr_fixup = .;
1367c03d653SBenjamin Herrenschmidt	}
1377c03d653SBenjamin Herrenschmidt	. = ALIGN(8);
1382d1b2027SKumar Gala	__lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) {
1392d1b2027SKumar Gala		__start___lwsync_fixup = .;
1402d1b2027SKumar Gala		*(__lwsync_fixup)
1412d1b2027SKumar Gala		__stop___lwsync_fixup = .;
1422d1b2027SKumar Gala	}
1433f639ee8SStephen Rothwell#ifdef CONFIG_PPC64
1443f639ee8SStephen Rothwell	. = ALIGN(8);
145366234f6SKumar Gala	__fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
1463f639ee8SStephen Rothwell		__start___fw_ftr_fixup = .;
1473f639ee8SStephen Rothwell		*(__fw_ftr_fixup)
1483f639ee8SStephen Rothwell		__stop___fw_ftr_fixup = .;
1493f639ee8SStephen Rothwell	}
1503f639ee8SStephen Rothwell#endif
151366234f6SKumar Gala	.init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
15262bef288STim Abbott		INIT_RAM_FS
153cabb5587SStephen Rothwell	}
15462bef288STim Abbott
1550415b00dSTejun Heo	PERCPU_SECTION(L1_CACHE_BYTES)
15614cf11afSPaul Mackerras
157e8222502SBenjamin Herrenschmidt	. = ALIGN(8);
158366234f6SKumar Gala	.machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
159e8222502SBenjamin Herrenschmidt		__machine_desc_start = . ;
160e8222502SBenjamin Herrenschmidt		*(.machine.desc)
161e8222502SBenjamin Herrenschmidt		__machine_desc_end = . ;
162e8222502SBenjamin Herrenschmidt	}
1632a4b9c5aSPaul Mackerras#ifdef CONFIG_RELOCATABLE
164549e8152SPaul Mackerras	. = ALIGN(8);
1659c5f7d39SSuzuki Poulose	.dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET)
1669c5f7d39SSuzuki Poulose	{
1679c5f7d39SSuzuki Poulose#ifdef CONFIG_RELOCATABLE_PPC32
1689c5f7d39SSuzuki Poulose		__dynamic_symtab = .;
1699c5f7d39SSuzuki Poulose#endif
1709c5f7d39SSuzuki Poulose		*(.dynsym)
1719c5f7d39SSuzuki Poulose	}
172549e8152SPaul Mackerras	.dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) }
173549e8152SPaul Mackerras	.dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET)
174549e8152SPaul Mackerras	{
175549e8152SPaul Mackerras		__dynamic_start = .;
176549e8152SPaul Mackerras		*(.dynamic)
177549e8152SPaul Mackerras	}
178549e8152SPaul Mackerras	.hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) }
179549e8152SPaul Mackerras	.interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) }
180549e8152SPaul Mackerras	.rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET)
181549e8152SPaul Mackerras	{
182549e8152SPaul Mackerras		__rela_dyn_start = .;
183549e8152SPaul Mackerras		*(.rela*)
184549e8152SPaul Mackerras	}
1852a4b9c5aSPaul Mackerras#endif
186*4c812318SStephen Rothwell	/* .exit.data is discarded at runtime, not link time,
187*4c812318SStephen Rothwell	 * to deal with references from .exit.text
188*4c812318SStephen Rothwell	 */
189*4c812318SStephen Rothwell	.exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) {
190*4c812318SStephen Rothwell		EXIT_DATA
191*4c812318SStephen Rothwell	}
192e8222502SBenjamin Herrenschmidt
193cabb5587SStephen Rothwell	/* freed after init ends here */
194cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
195e8222502SBenjamin Herrenschmidt	__init_end = .;
196e8222502SBenjamin Herrenschmidt
197e8222502SBenjamin Herrenschmidt/*
198e8222502SBenjamin Herrenschmidt * And now the various read/write data
199e8222502SBenjamin Herrenschmidt */
200e8222502SBenjamin Herrenschmidt
201e8222502SBenjamin Herrenschmidt	. = ALIGN(PAGE_SIZE);
2024a288563SPaul Mackerras	_sdata = .;
203cabb5587SStephen Rothwell
204e8222502SBenjamin Herrenschmidt#ifdef CONFIG_PPC32
205366234f6SKumar Gala	.data : AT(ADDR(.data) - LOAD_OFFSET) {
206ca967258SSam Ravnborg		DATA_DATA
207e8222502SBenjamin Herrenschmidt		*(.sdata)
208e8222502SBenjamin Herrenschmidt		*(.got.plt) *(.got)
209cabb5587SStephen Rothwell	}
210e8222502SBenjamin Herrenschmidt#else
211366234f6SKumar Gala	.data : AT(ADDR(.data) - LOAD_OFFSET) {
2123ae0aa9fSMathieu Desnoyers		DATA_DATA
2133ae0aa9fSMathieu Desnoyers		*(.data.rel*)
2143ae0aa9fSMathieu Desnoyers		*(.toc1)
215cabb5587SStephen Rothwell		*(.branch_lt)
216cabb5587SStephen Rothwell	}
217cabb5587SStephen Rothwell
218366234f6SKumar Gala	.opd : AT(ADDR(.opd) - LOAD_OFFSET) {
219cabb5587SStephen Rothwell		*(.opd)
220cabb5587SStephen Rothwell	}
221cabb5587SStephen Rothwell
2225e95235cSAnton Blanchard	. = ALIGN(256);
223366234f6SKumar Gala	.got : AT(ADDR(.got) - LOAD_OFFSET) {
224cabb5587SStephen Rothwell		__toc_start = .;
2255ac47f7aSAnton Blanchard#ifndef CONFIG_RELOCATABLE
2265ac47f7aSAnton Blanchard		__prom_init_toc_start = .;
2275ac47f7aSAnton Blanchard		arch/powerpc/kernel/prom_init.o*(.toc .got)
2285ac47f7aSAnton Blanchard		__prom_init_toc_end = .;
2295ac47f7aSAnton Blanchard#endif
230cabb5587SStephen Rothwell		*(.got)
231cabb5587SStephen Rothwell		*(.toc)
232e8222502SBenjamin Herrenschmidt	}
233e8222502SBenjamin Herrenschmidt#endif
234e8222502SBenjamin Herrenschmidt
235e8222502SBenjamin Herrenschmidt	/* The initial task and kernel stack */
2362af7687fSTim Abbott	INIT_TASK_DATA_SECTION(THREAD_SIZE)
237cabb5587SStephen Rothwell
23875b13483STim Abbott	.data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) {
23962bef288STim Abbott		PAGE_ALIGNED_DATA(PAGE_SIZE)
240cabb5587SStephen Rothwell	}
24114cf11afSPaul Mackerras
2424af57b78STim Abbott	.data..cacheline_aligned : AT(ADDR(.data..cacheline_aligned) - LOAD_OFFSET) {
24362bef288STim Abbott		CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
244e8222502SBenjamin Herrenschmidt	}
24514cf11afSPaul Mackerras
24654cb27a7SDenys Vlasenko	.data..read_mostly : AT(ADDR(.data..read_mostly) - LOAD_OFFSET) {
24762bef288STim Abbott		READ_MOSTLY_DATA(L1_CACHE_BYTES)
248bd67fcf9STony Breeds	}
249bd67fcf9STony Breeds
2505be2a213SSean MacLennan	. = ALIGN(PAGE_SIZE);
251366234f6SKumar Gala	.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
25262bef288STim Abbott		NOSAVE_DATA
253e8222502SBenjamin Herrenschmidt	}
25414cf11afSPaul Mackerras
255903444e4SMichael Ellerman	. = ALIGN(PAGE_SIZE);
256903444e4SMichael Ellerman	_edata  =  .;
257903444e4SMichael Ellerman	PROVIDE32 (edata = .);
258903444e4SMichael Ellerman
259e8222502SBenjamin Herrenschmidt/*
260e8222502SBenjamin Herrenschmidt * And finally the bss
261e8222502SBenjamin Herrenschmidt */
2624a288563SPaul Mackerras
26362bef288STim Abbott	BSS_SECTION(0, 0, 0)
264cabb5587SStephen Rothwell
265cabb5587SStephen Rothwell	. = ALIGN(PAGE_SIZE);
266cabb5587SStephen Rothwell	_end = . ;
267e8222502SBenjamin Herrenschmidt	PROVIDE32 (end = .);
268023bf6f1STejun Heo
269023bf6f1STejun Heo	/* Sections to be discarded. */
270023bf6f1STejun Heo	DISCARDS
27114cf11afSPaul Mackerras}
272