aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/i386/kernel/vmlinux.lds.S113
-rw-r--r--include/asm-generic/vmlinux.lds.h10
2 files changed, 68 insertions, 55 deletions
diff --git a/arch/i386/kernel/vmlinux.lds.S b/arch/i386/kernel/vmlinux.lds.S
index c6f84a0322ba..cbd24860fbb7 100644
--- a/arch/i386/kernel/vmlinux.lds.S
+++ b/arch/i386/kernel/vmlinux.lds.S
@@ -1,5 +1,11 @@
1/* ld script to make i386 Linux kernel 1/* ld script to make i386 Linux kernel
2 * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>; 2 * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>;
3 *
4 * Don't define absolute symbols until and unless you know that symbol
5 * value is should remain constant even if kernel image is relocated
6 * at run time. Absolute symbols are not relocated. If symbol value should
7 * change if kernel is relocated, make the symbol section relative and
8 * put it inside the section definition.
3 */ 9 */
4 10
5#define LOAD_OFFSET __PAGE_OFFSET 11#define LOAD_OFFSET __PAGE_OFFSET
@@ -24,31 +30,32 @@ SECTIONS
24 . = __KERNEL_START; 30 . = __KERNEL_START;
25 phys_startup_32 = startup_32 - LOAD_OFFSET; 31 phys_startup_32 = startup_32 - LOAD_OFFSET;
26 /* read-only */ 32 /* read-only */
27 _text = .; /* Text and read-only data */
28 .text : AT(ADDR(.text) - LOAD_OFFSET) { 33 .text : AT(ADDR(.text) - LOAD_OFFSET) {
34 _text = .; /* Text and read-only data */
29 *(.text) 35 *(.text)
30 SCHED_TEXT 36 SCHED_TEXT
31 LOCK_TEXT 37 LOCK_TEXT
32 KPROBES_TEXT 38 KPROBES_TEXT
33 *(.fixup) 39 *(.fixup)
34 *(.gnu.warning) 40 *(.gnu.warning)
35 } :text = 0x9090 41 _etext = .; /* End of text section */
36 42 } :text = 0x9090
37 _etext = .; /* End of text section */
38 43
39 . = ALIGN(16); /* Exception table */ 44 . = ALIGN(16); /* Exception table */
40 __start___ex_table = .; 45 __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
41 __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { *(__ex_table) } 46 __start___ex_table = .;
42 __stop___ex_table = .; 47 *(__ex_table)
48 __stop___ex_table = .;
49 }
43 50
44 RODATA 51 RODATA
45 52
46 . = ALIGN(4); 53 . = ALIGN(4);
47 __tracedata_start = .;
48 .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { 54 .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {
55 __tracedata_start = .;
49 *(.tracedata) 56 *(.tracedata)
57 __tracedata_end = .;
50 } 58 }
51 __tracedata_end = .;
52 59
53 /* writeable */ 60 /* writeable */
54 . = ALIGN(4096); 61 . = ALIGN(4096);
@@ -58,10 +65,12 @@ SECTIONS
58 } :data 65 } :data
59 66
60 . = ALIGN(4096); 67 . = ALIGN(4096);
61 __nosave_begin = .; 68 .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
62 .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { *(.data.nosave) } 69 __nosave_begin = .;
63 . = ALIGN(4096); 70 *(.data.nosave)
64 __nosave_end = .; 71 . = ALIGN(4096);
72 __nosave_end = .;
73 }
65 74
66 . = ALIGN(4096); 75 . = ALIGN(4096);
67 .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) { 76 .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
@@ -75,8 +84,10 @@ SECTIONS
75 84
76 /* rarely changed data like cpu maps */ 85 /* rarely changed data like cpu maps */
77 . = ALIGN(32); 86 . = ALIGN(32);
78 .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { *(.data.read_mostly) } 87 .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
79 _edata = .; /* End of data section */ 88 *(.data.read_mostly)
89 _edata = .; /* End of data section */
90 }
80 91
81#ifdef CONFIG_STACK_UNWIND 92#ifdef CONFIG_STACK_UNWIND
82 . = ALIGN(4); 93 . = ALIGN(4);
@@ -94,54 +105,56 @@ SECTIONS
94 105
95 /* might get freed after init */ 106 /* might get freed after init */
96 . = ALIGN(4096); 107 . = ALIGN(4096);
97 __smp_alt_begin = .;
98 __smp_alt_instructions = .;
99 .smp_altinstructions : AT(ADDR(.smp_altinstructions) - LOAD_OFFSET) { 108 .smp_altinstructions : AT(ADDR(.smp_altinstructions) - LOAD_OFFSET) {
109 __smp_alt_begin = .;
110 __smp_alt_instructions = .;
100 *(.smp_altinstructions) 111 *(.smp_altinstructions)
112 __smp_alt_instructions_end = .;
101 } 113 }
102 __smp_alt_instructions_end = .;
103 . = ALIGN(4); 114 . = ALIGN(4);
104 __smp_locks = .;
105 .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { 115 .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
116 __smp_locks = .;
106 *(.smp_locks) 117 *(.smp_locks)
118 __smp_locks_end = .;
107 } 119 }
108 __smp_locks_end = .;
109 .smp_altinstr_replacement : AT(ADDR(.smp_altinstr_replacement) - LOAD_OFFSET) { 120 .smp_altinstr_replacement : AT(ADDR(.smp_altinstr_replacement) - LOAD_OFFSET) {
110 *(.smp_altinstr_replacement) 121 *(.smp_altinstr_replacement)
122 __smp_alt_end = .;
111 } 123 }
112 . = ALIGN(4096); 124 . = ALIGN(4096);
113 __smp_alt_end = .;
114 125
115 /* will be freed after init */ 126 /* will be freed after init */
116 . = ALIGN(4096); /* Init code and data */ 127 . = ALIGN(4096); /* Init code and data */
117 __init_begin = .;
118 .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { 128 .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
129 __init_begin = .;
119 _sinittext = .; 130 _sinittext = .;
120 *(.init.text) 131 *(.init.text)
121 _einittext = .; 132 _einittext = .;
122 } 133 }
123 .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) } 134 .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) }
124 . = ALIGN(16); 135 . = ALIGN(16);
125 __setup_start = .; 136 .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
126 .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { *(.init.setup) } 137 __setup_start = .;
127 __setup_end = .; 138 *(.init.setup)
128 __initcall_start = .; 139 __setup_end = .;
140 }
129 .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { 141 .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
142 __initcall_start = .;
130 INITCALLS 143 INITCALLS
144 __initcall_end = .;
131 } 145 }
132 __initcall_end = .;
133 __con_initcall_start = .;
134 .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) { 146 .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
147 __con_initcall_start = .;
135 *(.con_initcall.init) 148 *(.con_initcall.init)
149 __con_initcall_end = .;
136 } 150 }
137 __con_initcall_end = .;
138 SECURITY_INIT 151 SECURITY_INIT
139 . = ALIGN(4); 152 . = ALIGN(4);
140 __alt_instructions = .;
141 .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) { 153 .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) {
154 __alt_instructions = .;
142 *(.altinstructions) 155 *(.altinstructions)
156 __alt_instructions_end = .;
143 } 157 }
144 __alt_instructions_end = .;
145 .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) { 158 .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) {
146 *(.altinstr_replacement) 159 *(.altinstr_replacement)
147 } 160 }
@@ -150,32 +163,32 @@ SECTIONS
150 .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { *(.exit.text) } 163 .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { *(.exit.text) }
151 .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { *(.exit.data) } 164 .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { *(.exit.data) }
152 . = ALIGN(4096); 165 . = ALIGN(4096);
153 __initramfs_start = .; 166 .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
154 .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { *(.init.ramfs) } 167 __initramfs_start = .;
155 __initramfs_end = .; 168 *(.init.ramfs)
169 __initramfs_end = .;
170 }
156 . = ALIGN(L1_CACHE_BYTES); 171 . = ALIGN(L1_CACHE_BYTES);
157 __per_cpu_start = .; 172 .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) {
158 .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { *(.data.percpu) } 173 __per_cpu_start = .;
159 __per_cpu_end = .; 174 *(.data.percpu)
175 __per_cpu_end = .;
176 }
160 . = ALIGN(4096); 177 . = ALIGN(4096);
161 __init_end = .;
162 /* freed after init ends here */ 178 /* freed after init ends here */
163 179
164 __bss_start = .; /* BSS */
165 .bss.page_aligned : AT(ADDR(.bss.page_aligned) - LOAD_OFFSET) {
166 *(.bss.page_aligned)
167 }
168 .bss : AT(ADDR(.bss) - LOAD_OFFSET) { 180 .bss : AT(ADDR(.bss) - LOAD_OFFSET) {
181 __init_end = .;
182 __bss_start = .; /* BSS */
183 *(.bss.page_aligned)
169 *(.bss) 184 *(.bss)
185 . = ALIGN(4);
186 __bss_stop = .;
187 _end = . ;
188 /* This is where the kernel creates the early boot page tables */
189 . = ALIGN(4096);
190 pg0 = . ;
170 } 191 }
171 . = ALIGN(4);
172 __bss_stop = .;
173
174 _end = . ;
175
176 /* This is where the kernel creates the early boot page tables */
177 . = ALIGN(4096);
178 pg0 = .;
179 192
180 /* Sections to be discarded */ 193 /* Sections to be discarded */
181 /DISCARD/ : { 194 /DISCARD/ : {
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index e60d6f21fa62..9f4747780dac 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -11,8 +11,8 @@
11 11
12#define RODATA \ 12#define RODATA \
13 . = ALIGN(4096); \ 13 . = ALIGN(4096); \
14 __start_rodata = .; \
15 .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ 14 .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \
15 VMLINUX_SYMBOL(__start_rodata) = .; \
16 *(.rodata) *(.rodata.*) \ 16 *(.rodata) *(.rodata.*) \
17 *(__vermagic) /* Kernel version magic */ \ 17 *(__vermagic) /* Kernel version magic */ \
18 } \ 18 } \
@@ -119,17 +119,17 @@
119 *(__ksymtab_strings) \ 119 *(__ksymtab_strings) \
120 } \ 120 } \
121 \ 121 \
122 /* Unwind data binary search table */ \
123 EH_FRAME_HDR \
124 \
122 /* Built-in module parameters. */ \ 125 /* Built-in module parameters. */ \
123 __param : AT(ADDR(__param) - LOAD_OFFSET) { \ 126 __param : AT(ADDR(__param) - LOAD_OFFSET) { \
124 VMLINUX_SYMBOL(__start___param) = .; \ 127 VMLINUX_SYMBOL(__start___param) = .; \
125 *(__param) \ 128 *(__param) \
126 VMLINUX_SYMBOL(__stop___param) = .; \ 129 VMLINUX_SYMBOL(__stop___param) = .; \
130 VMLINUX_SYMBOL(__end_rodata) = .; \
127 } \ 131 } \
128 \ 132 \
129 /* Unwind data binary search table */ \
130 EH_FRAME_HDR \
131 \
132 __end_rodata = .; \
133 . = ALIGN(4096); 133 . = ALIGN(4096);
134 134
135#define SECURITY_INIT \ 135#define SECURITY_INIT \