vmlinux.lds.S 5.79 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1
2
3
4
/* ld script to make x86-64 Linux kernel
 * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>;
 */

5
6
#define LOAD_OFFSET __START_KERNEL_map

Linus Torvalds's avatar
Linus Torvalds committed
7
#include <asm-generic/vmlinux.lds.h>
8
#include <asm/page.h>
Linus Torvalds's avatar
Linus Torvalds committed
9
10
11
12
13
14
15
16
#include <linux/config.h>

OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
ENTRY(phys_startup_64)
jiffies_64 = jiffies;
SECTIONS
{
17
  . = __START_KERNEL;
Linus Torvalds's avatar
Linus Torvalds committed
18
19
  phys_startup_64 = startup_64 - LOAD_OFFSET;
  _text = .;			/* Text and read-only data */
20
  .text :  AT(ADDR(.text) - LOAD_OFFSET) {
Linus Torvalds's avatar
Linus Torvalds committed
21
22
23
	*(.text)
	SCHED_TEXT
	LOCK_TEXT
24
	KPROBES_TEXT
Linus Torvalds's avatar
Linus Torvalds committed
25
26
27
	*(.fixup)
	*(.gnu.warning)
	} = 0x9090
28
29
  				/* out-of-line lock text */
  .text.lock : AT(ADDR(.text.lock) - LOAD_OFFSET) { *(.text.lock) }
Linus Torvalds's avatar
Linus Torvalds committed
30
31
32
33
34

  _etext = .;			/* End of text section */

  . = ALIGN(16);		/* Exception table */
  __start___ex_table = .;
35
  __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { *(__ex_table) }
Linus Torvalds's avatar
Linus Torvalds committed
36
37
38
39
  __stop___ex_table = .;

  RODATA

40
41
				/* Data */
  .data : AT(ADDR(.data) - LOAD_OFFSET) {
Linus Torvalds's avatar
Linus Torvalds committed
42
43
44
45
46
47
48
	*(.data)
	CONSTRUCTORS
	}

  _edata = .;			/* End of data section */

  __bss_start = .;		/* BSS */
49
  .bss : AT(ADDR(.bss) - LOAD_OFFSET) {
Linus Torvalds's avatar
Linus Torvalds committed
50
51
52
53
54
	*(.bss.page_aligned)	
	*(.bss)
	}
  __bss_end = .;

55
  . = ALIGN(PAGE_SIZE);
Linus Torvalds's avatar
Linus Torvalds committed
56
  . = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
57
58
59
  .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
	*(.data.cacheline_aligned)
  }
60
61
62
63
  . = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
  .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
  	*(.data.read_mostly)
  }
64
65

#define VSYSCALL_ADDR (-10*1024*1024)
66
67
#define VSYSCALL_PHYS_ADDR ((LOADADDR(.data.read_mostly) + SIZEOF(.data.read_mostly) + 4095) & ~(4095))
#define VSYSCALL_VIRT_ADDR ((ADDR(.data.read_mostly) + SIZEOF(.data.read_mostly) + 4095) & ~(4095))
68
69
70
71
72
73

#define VLOAD_OFFSET (VSYSCALL_ADDR - VSYSCALL_PHYS_ADDR)
#define VLOAD(x) (ADDR(x) - VLOAD_OFFSET)

#define VVIRT_OFFSET (VSYSCALL_ADDR - VSYSCALL_VIRT_ADDR)
#define VVIRT(x) (ADDR(x) - VVIRT_OFFSET)
Linus Torvalds's avatar
Linus Torvalds committed
74

75
76
77
  . = VSYSCALL_ADDR;
  .vsyscall_0 :	 AT(VSYSCALL_PHYS_ADDR) { *(.vsyscall_0) }
  __vsyscall_0 = VSYSCALL_VIRT_ADDR;
Linus Torvalds's avatar
Linus Torvalds committed
78
79

  . = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
  .xtime_lock : AT(VLOAD(.xtime_lock)) { *(.xtime_lock) }
  xtime_lock = VVIRT(.xtime_lock);

  .vxtime : AT(VLOAD(.vxtime)) { *(.vxtime) }
  vxtime = VVIRT(.vxtime);

  .wall_jiffies : AT(VLOAD(.wall_jiffies)) { *(.wall_jiffies) }
  wall_jiffies = VVIRT(.wall_jiffies);

  .sys_tz : AT(VLOAD(.sys_tz)) { *(.sys_tz) }
  sys_tz = VVIRT(.sys_tz);

  .sysctl_vsyscall : AT(VLOAD(.sysctl_vsyscall)) { *(.sysctl_vsyscall) }
  sysctl_vsyscall = VVIRT(.sysctl_vsyscall);

  .xtime : AT(VLOAD(.xtime)) { *(.xtime) }
  xtime = VVIRT(.xtime);

Linus Torvalds's avatar
Linus Torvalds committed
98
  . = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  .jiffies : AT(VLOAD(.jiffies)) { *(.jiffies) }
  jiffies = VVIRT(.jiffies);

  .vsyscall_1 ADDR(.vsyscall_0) + 1024: AT(VLOAD(.vsyscall_1)) { *(.vsyscall_1) }
  .vsyscall_2 ADDR(.vsyscall_0) + 2048: AT(VLOAD(.vsyscall_2)) { *(.vsyscall_2) }
  .vsyscall_3 ADDR(.vsyscall_0) + 3072: AT(VLOAD(.vsyscall_3)) { *(.vsyscall_3) }

  . = VSYSCALL_VIRT_ADDR + 4096;

#undef VSYSCALL_ADDR
#undef VSYSCALL_PHYS_ADDR
#undef VSYSCALL_VIRT_ADDR
#undef VLOAD_OFFSET
#undef VLOAD
#undef VVIRT_OFFSET
#undef VVIRT
Linus Torvalds's avatar
Linus Torvalds committed
115
116

  . = ALIGN(8192);		/* init_task */
117
118
119
  .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
	*(.data.init_task)
  }
Linus Torvalds's avatar
Linus Torvalds committed
120
121

  . = ALIGN(4096);
122
123
124
  .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
	*(.data.page_aligned)
  }
Linus Torvalds's avatar
Linus Torvalds committed
125
126
127

  . = ALIGN(4096);		/* Init code and data */
  __init_begin = .;
128
  .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
Linus Torvalds's avatar
Linus Torvalds committed
129
130
131
132
133
	_sinittext = .;
	*(.init.text)
	_einittext = .;
  }
  __initdata_begin = .;
134
  .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) }
Linus Torvalds's avatar
Linus Torvalds committed
135
136
137
  __initdata_end = .;
  . = ALIGN(16);
  __setup_start = .;
138
  .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { *(.init.setup) }
Linus Torvalds's avatar
Linus Torvalds committed
139
140
  __setup_end = .;
  __initcall_start = .;
141
  .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
Linus Torvalds's avatar
Linus Torvalds committed
142
143
144
145
146
147
148
149
150
151
	*(.initcall1.init) 
	*(.initcall2.init) 
	*(.initcall3.init) 
	*(.initcall4.init) 
	*(.initcall5.init) 
	*(.initcall6.init) 
	*(.initcall7.init)
  }
  __initcall_end = .;
  __con_initcall_start = .;
152
153
154
  .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
	*(.con_initcall.init)
  }
Linus Torvalds's avatar
Linus Torvalds committed
155
156
157
158
  __con_initcall_end = .;
  SECURITY_INIT
  . = ALIGN(8);
  __alt_instructions = .;
159
160
161
  .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) {
	*(.altinstructions)
  }
Linus Torvalds's avatar
Linus Torvalds committed
162
  __alt_instructions_end = .; 
163
164
165
  .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) {
	*(.altinstr_replacement)
  }
Linus Torvalds's avatar
Linus Torvalds committed
166
167
  /* .exit.text is discard at runtime, not link time, to deal with references
     from .altinstructions and .eh_frame */
168
169
  .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { *(.exit.text) }
  .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { *(.exit.data) }
Linus Torvalds's avatar
Linus Torvalds committed
170
171
  . = ALIGN(4096);
  __initramfs_start = .;
172
  .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { *(.init.ramfs) }
Linus Torvalds's avatar
Linus Torvalds committed
173
174
175
  __initramfs_end = .;	
  . = ALIGN(32);
  __per_cpu_start = .;
176
  .data.percpu  : AT(ADDR(.data.percpu) - LOAD_OFFSET) { *(.data.percpu) }
Linus Torvalds's avatar
Linus Torvalds committed
177
178
179
180
181
182
  __per_cpu_end = .;
  . = ALIGN(4096);
  __init_end = .;

  . = ALIGN(4096);
  __nosave_begin = .;
183
  .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { *(.data.nosave) }
Linus Torvalds's avatar
Linus Torvalds committed
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
  . = ALIGN(4096);
  __nosave_end = .;

  _end = . ;

  /* Sections to be discarded */
  /DISCARD/ : {
	*(.exitcall.exit)
#ifndef CONFIG_DEBUG_INFO
	*(.eh_frame)
#endif
	}

  /* DWARF 2 */
  .debug_info     0 : { *(.debug_info) }
  .debug_abbrev   0 : { *(.debug_abbrev) }
  .debug_line     0 : { *(.debug_line) }
  .debug_frame    0 : { *(.debug_frame) }
  .debug_str      0 : { *(.debug_str) }
  .debug_loc      0 : { *(.debug_loc) }
  .debug_macinfo  0 : { *(.debug_macinfo) }
  /* SGI/MIPS DWARF 2 extensions */
  .debug_weaknames 0 : { *(.debug_weaknames) }
  .debug_funcnames 0 : { *(.debug_funcnames) }
  .debug_typenames 0 : { *(.debug_typenames) }
  .debug_varnames  0 : { *(.debug_varnames) }


  .comment 0 : { *(.comment) }
}