xref: /linux/arch/s390/kernel/vmlinux.lds.S (revision a17627ef8833ac30622a7b39b7be390e1b174405)
1/* ld script to make s390 Linux kernel
2 * Written by Martin Schwidefsky (schwidefsky@de.ibm.com)
3 */
4
5#include <asm-generic/vmlinux.lds.h>
6
7#ifndef CONFIG_64BIT
8OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390")
9OUTPUT_ARCH(s390)
10ENTRY(_start)
11jiffies = jiffies_64 + 4;
12#else
13OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
14OUTPUT_ARCH(s390:64-bit)
15ENTRY(_start)
16jiffies = jiffies_64;
17#endif
18
19SECTIONS
20{
21  . = 0x00000000;
22  _text = .;			/* Text and read-only data */
23  .text : {
24	TEXT_TEXT
25	SCHED_TEXT
26	LOCK_TEXT
27	KPROBES_TEXT
28	*(.fixup)
29	*(.gnu.warning)
30	} = 0x0700
31
32  _etext = .;			/* End of text section */
33
34  RODATA
35
36#ifdef CONFIG_SHARED_KERNEL
37  . = ALIGN(1048576);		/* VM shared segments are 1MB aligned */
38#endif
39
40  . = ALIGN(4096);
41  _eshared = .;			/* End of shareable data */
42
43  . = ALIGN(16);		/* Exception table */
44  __start___ex_table = .;
45  __ex_table : { *(__ex_table) }
46  __stop___ex_table = .;
47
48  BUG_TABLE
49
50  .data : {			/* Data */
51	DATA_DATA
52	CONSTRUCTORS
53	}
54
55  . = ALIGN(4096);
56  __nosave_begin = .;
57  .data_nosave : { *(.data.nosave) }
58  . = ALIGN(4096);
59  __nosave_end = .;
60
61  . = ALIGN(4096);
62  .data.page_aligned : { *(.data.idt) }
63
64  . = ALIGN(256);
65  .data.cacheline_aligned : { *(.data.cacheline_aligned) }
66
67  . = ALIGN(256);
68  .data.read_mostly : { *(.data.read_mostly) }
69  _edata = .;			/* End of data section */
70
71  . = ALIGN(8192);		/* init_task */
72  .data.init_task : { *(.data.init_task) }
73
74  /* will be freed after init */
75  . = ALIGN(4096);		/* Init code and data */
76  __init_begin = .;
77  .init.text : {
78	_sinittext = .;
79	*(.init.text)
80	_einittext = .;
81  }
82  /*
83   * .exit.text is discarded at runtime, not link time,
84   * to deal with references from __bug_table
85   */
86  .exit.text :	 { *(.exit.text) }
87
88  .init.data : { *(.init.data) }
89  . = ALIGN(256);
90  __setup_start = .;
91  .init.setup : { *(.init.setup) }
92  __setup_end = .;
93  __initcall_start = .;
94  .initcall.init : {
95	INITCALLS
96  }
97  __initcall_end = .;
98  __con_initcall_start = .;
99  .con_initcall.init : { *(.con_initcall.init) }
100  __con_initcall_end = .;
101  SECURITY_INIT
102
103#ifdef CONFIG_BLK_DEV_INITRD
104  . = ALIGN(256);
105  __initramfs_start = .;
106  .init.ramfs : { *(.init.initramfs) }
107  . = ALIGN(2);
108  __initramfs_end = .;
109#endif
110  . = ALIGN(4096);
111  __per_cpu_start = .;
112  .data.percpu  : { *(.data.percpu) }
113  __per_cpu_end = .;
114  . = ALIGN(4096);
115  __init_end = .;
116  /* freed after init ends here */
117
118  __bss_start = .;		/* BSS */
119  .bss : { *(.bss) }
120  . = ALIGN(2);
121  __bss_stop = .;
122
123  _end = . ;
124
125  /* Sections to be discarded */
126  /DISCARD/ : {
127	*(.exit.data) *(.exitcall.exit)
128	}
129
130  /* Stabs debugging sections.  */
131  .stab 0 : { *(.stab) }
132  .stabstr 0 : { *(.stabstr) }
133  .stab.excl 0 : { *(.stab.excl) }
134  .stab.exclstr 0 : { *(.stab.exclstr) }
135  .stab.index 0 : { *(.stab.index) }
136  .stab.indexstr 0 : { *(.stab.indexstr) }
137  .comment 0 : { *(.comment) }
138}
139