diff options
-rw-r--r-- | arch/mips/kernel/vmlinux.lds.S | 339 |
1 files changed, 189 insertions, 150 deletions
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 087ab997487d..84f9a4cc6f2f 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S | |||
@@ -6,163 +6,202 @@ | |||
6 | OUTPUT_ARCH(mips) | 6 | OUTPUT_ARCH(mips) |
7 | ENTRY(kernel_entry) | 7 | ENTRY(kernel_entry) |
8 | jiffies = JIFFIES; | 8 | jiffies = JIFFIES; |
9 | |||
9 | SECTIONS | 10 | SECTIONS |
10 | { | 11 | { |
11 | #ifdef CONFIG_BOOT_ELF64 | 12 | #ifdef CONFIG_BOOT_ELF64 |
12 | /* Read-only sections, merged into text segment: */ | 13 | /* Read-only sections, merged into text segment: */ |
13 | /* . = 0xc000000000000000; */ | 14 | /* . = 0xc000000000000000; */ |
14 | 15 | ||
15 | /* This is the value for an Origin kernel, taken from an IRIX kernel. */ | 16 | /* This is the value for an Origin kernel, taken from an IRIX kernel. */ |
16 | /* . = 0xc00000000001c000; */ | 17 | /* . = 0xc00000000001c000; */ |
17 | 18 | ||
18 | /* Set the vaddr for the text segment to a value | 19 | /* Set the vaddr for the text segment to a value |
19 | >= 0xa800 0000 0001 9000 if no symmon is going to configured | 20 | * >= 0xa800 0000 0001 9000 if no symmon is going to configured |
20 | >= 0xa800 0000 0030 0000 otherwise */ | 21 | * >= 0xa800 0000 0030 0000 otherwise |
22 | */ | ||
21 | 23 | ||
22 | /* . = 0xa800000000300000; */ | 24 | /* . = 0xa800000000300000; */ |
23 | /* . = 0xa800000000300000; */ | 25 | /* . = 0xa800000000300000; */ |
24 | . = 0xffffffff80300000; | 26 | . = 0xffffffff80300000; |
25 | #endif | 27 | #endif |
26 | . = LOADADDR; | 28 | . = LOADADDR; |
27 | /* read-only */ | 29 | /* read-only */ |
28 | _text = .; /* Text and read-only data */ | 30 | _text = .; /* Text and read-only data */ |
29 | .text : { | 31 | .text : { |
30 | TEXT_TEXT | 32 | TEXT_TEXT |
31 | SCHED_TEXT | 33 | SCHED_TEXT |
32 | LOCK_TEXT | 34 | LOCK_TEXT |
33 | *(.fixup) | 35 | *(.fixup) |
34 | *(.gnu.warning) | 36 | *(.gnu.warning) |
35 | } =0 | 37 | } =0 |
36 | 38 | _etext = .; /* End of text section */ | |
37 | _etext = .; /* End of text section */ | 39 | |
38 | 40 | /* Exception table */ | |
39 | . = ALIGN(16); /* Exception table */ | 41 | . = ALIGN(16); |
40 | __start___ex_table = .; | 42 | __ex_table : { |
41 | __ex_table : { *(__ex_table) } | 43 | __start___ex_table = .; |
42 | __stop___ex_table = .; | 44 | *(__ex_table) |
43 | 45 | __stop___ex_table = .; | |
44 | __start___dbe_table = .; /* Exception table for data bus errors */ | 46 | } |
45 | __dbe_table : { *(__dbe_table) } | 47 | |
46 | __stop___dbe_table = .; | 48 | /* Exception table for data bus errors */ |
47 | 49 | __dbe_table : { | |
48 | NOTES | 50 | __start___dbe_table = .; |
49 | 51 | *(__dbe_table) | |
50 | RODATA | 52 | __stop___dbe_table = .; |
51 | 53 | } | |
52 | /* writeable */ | 54 | RODATA |
53 | .data : { /* Data */ | 55 | |
54 | . = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */ | 56 | /* writeable */ |
55 | /* | 57 | .data : { /* Data */ |
56 | * This ALIGN is needed as a workaround for a bug a gcc bug upto 4.1 which | 58 | . = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */ |
57 | * limits the maximum alignment to at most 32kB and results in the following | 59 | /* |
58 | * warning: | 60 | * This ALIGN is needed as a workaround for a bug a gcc bug upto 4.1 which |
59 | * | 61 | * limits the maximum alignment to at most 32kB and results in the following |
60 | * CC arch/mips/kernel/init_task.o | 62 | * warning: |
61 | * arch/mips/kernel/init_task.c:30: warning: alignment of ‘init_thread_union’ | 63 | * |
62 | * is greater than maximum object file alignment. Using 32768 | 64 | * CC arch/mips/kernel/init_task.o |
63 | */ | 65 | * arch/mips/kernel/init_task.c:30: warning: alignment of ‘init_thread_union’ |
64 | . = ALIGN(_PAGE_SIZE); | 66 | * is greater than maximum object file alignment. Using 32768 |
65 | *(.data.init_task) | 67 | */ |
66 | 68 | . = ALIGN(_PAGE_SIZE); | |
67 | DATA_DATA | 69 | *(.data.init_task) |
68 | 70 | ||
69 | CONSTRUCTORS | 71 | DATA_DATA |
70 | } | 72 | CONSTRUCTORS |
71 | _gp = . + 0x8000; | 73 | } |
72 | .lit8 : { *(.lit8) } | 74 | _gp = . + 0x8000; |
73 | .lit4 : { *(.lit4) } | 75 | .lit8 : { |
74 | /* We want the small data sections together, so single-instruction offsets | 76 | *(.lit8) |
75 | can access them all, and initialized data all before uninitialized, so | 77 | } |
76 | we can shorten the on-disk segment size. */ | 78 | .lit4 : { |
77 | .sdata : { *(.sdata) } | 79 | *(.lit4) |
78 | 80 | } | |
79 | . = ALIGN(_PAGE_SIZE); | 81 | /* We want the small data sections together, so single-instruction offsets |
80 | __nosave_begin = .; | 82 | can access them all, and initialized data all before uninitialized, so |
81 | .data_nosave : { *(.data.nosave) } | 83 | we can shorten the on-disk segment size. */ |
82 | . = ALIGN(_PAGE_SIZE); | 84 | .sdata : { |
83 | __nosave_end = .; | 85 | *(.sdata) |
84 | 86 | } | |
85 | . = ALIGN(32); | 87 | |
86 | .data.cacheline_aligned : { *(.data.cacheline_aligned) } | 88 | . = ALIGN(_PAGE_SIZE); |
87 | 89 | .data_nosave : { | |
88 | _edata = .; /* End of data section */ | 90 | __nosave_begin = .; |
89 | 91 | *(.data.nosave) | |
90 | /* will be freed after init */ | 92 | } |
91 | . = ALIGN(_PAGE_SIZE); /* Init code and data */ | 93 | . = ALIGN(_PAGE_SIZE); |
92 | __init_begin = .; | 94 | __nosave_end = .; |
93 | .init.text : { | 95 | |
94 | _sinittext = .; | 96 | . = ALIGN(32); |
95 | *(.init.text) | 97 | .data.cacheline_aligned : { |
96 | _einittext = .; | 98 | *(.data.cacheline_aligned) |
97 | } | 99 | } |
98 | .init.data : { *(.init.data) } | 100 | _edata = .; /* End of data section */ |
99 | . = ALIGN(16); | 101 | |
100 | __setup_start = .; | 102 | /* will be freed after init */ |
101 | .init.setup : { *(.init.setup) } | 103 | . = ALIGN(_PAGE_SIZE); /* Init code and data */ |
102 | __setup_end = .; | 104 | __init_begin = .; |
103 | 105 | .init.text : { | |
104 | __initcall_start = .; | 106 | _sinittext = .; |
105 | .initcall.init : { | 107 | *(.init.text) |
106 | INITCALLS | 108 | _einittext = .; |
107 | } | 109 | } |
108 | __initcall_end = .; | 110 | .init.data : { |
109 | 111 | *(.init.data) | |
110 | __con_initcall_start = .; | 112 | } |
111 | .con_initcall.init : { *(.con_initcall.init) } | 113 | . = ALIGN(16); |
112 | __con_initcall_end = .; | 114 | .init.setup : { |
113 | SECURITY_INIT | 115 | __setup_start = .; |
114 | /* .exit.text is discarded at runtime, not link time, to deal with | 116 | *(.init.setup) |
115 | references from .rodata */ | 117 | __setup_end = .; |
116 | .exit.text : { *(.exit.text) } | 118 | } |
117 | .exit.data : { *(.exit.data) } | 119 | |
120 | .initcall.init : { | ||
121 | __initcall_start = .; | ||
122 | INITCALLS | ||
123 | __initcall_end = .; | ||
124 | } | ||
125 | |||
126 | .con_initcall.init : { | ||
127 | __con_initcall_start = .; | ||
128 | *(.con_initcall.init) | ||
129 | __con_initcall_end = .; | ||
130 | } | ||
131 | SECURITY_INIT | ||
132 | |||
133 | /* .exit.text is discarded at runtime, not link time, to deal with | ||
134 | * references from .rodata | ||
135 | */ | ||
136 | .exit.text : { | ||
137 | *(.exit.text) | ||
138 | } | ||
139 | .exit.data : { | ||
140 | *(.exit.data) | ||
141 | } | ||
118 | #if defined(CONFIG_BLK_DEV_INITRD) | 142 | #if defined(CONFIG_BLK_DEV_INITRD) |
119 | . = ALIGN(_PAGE_SIZE); | 143 | . = ALIGN(_PAGE_SIZE); |
120 | __initramfs_start = .; | 144 | .init.ramfs : { |
121 | .init.ramfs : { *(.init.ramfs) } | 145 | __initramfs_start = .; |
122 | __initramfs_end = .; | 146 | *(.init.ramfs) |
147 | __initramfs_end = .; | ||
148 | } | ||
123 | #endif | 149 | #endif |
124 | PERCPU(_PAGE_SIZE) | 150 | PERCPU(_PAGE_SIZE) |
125 | . = ALIGN(_PAGE_SIZE); | 151 | . = ALIGN(_PAGE_SIZE); |
126 | __init_end = .; | 152 | __init_end = .; |
127 | /* freed after init ends here */ | 153 | /* freed after init ends here */ |
128 | 154 | ||
129 | __bss_start = .; /* BSS */ | 155 | __bss_start = .; /* BSS */ |
130 | .sbss : { | 156 | .sbss : { |
131 | *(.sbss) | 157 | *(.sbss) |
132 | *(.scommon) | 158 | *(.scommon) |
133 | } | 159 | } |
134 | .bss : { | 160 | .bss : { |
135 | *(.bss) | 161 | *(.bss) |
136 | *(COMMON) | 162 | *(COMMON) |
137 | } | 163 | } |
138 | __bss_stop = .; | 164 | __bss_stop = .; |
139 | 165 | ||
140 | _end = . ; | 166 | _end = . ; |
141 | 167 | ||
142 | /* Sections to be discarded */ | 168 | /* Sections to be discarded */ |
143 | /DISCARD/ : { | 169 | /DISCARD/ : { |
144 | *(.exitcall.exit) | 170 | *(.exitcall.exit) |
145 | 171 | ||
146 | /* ABI crap starts here */ | 172 | /* ABI crap starts here */ |
147 | *(.MIPS.options) | 173 | *(.MIPS.options) |
148 | *(.options) | 174 | *(.options) |
149 | *(.pdr) | 175 | *(.pdr) |
150 | *(.reginfo) | 176 | *(.reginfo) |
151 | } | 177 | } |
152 | 178 | ||
153 | /* These mark the ABI of the kernel for debuggers. */ | 179 | /* These mark the ABI of the kernel for debuggers. */ |
154 | .mdebug.abi32 : { KEEP(*(.mdebug.abi32)) } | 180 | .mdebug.abi32 : { |
155 | .mdebug.abi64 : { KEEP(*(.mdebug.abi64)) } | 181 | KEEP(*(.mdebug.abi32)) |
156 | 182 | } | |
157 | /* This is the MIPS specific mdebug section. */ | 183 | .mdebug.abi64 : { |
158 | .mdebug : { *(.mdebug) } | 184 | KEEP(*(.mdebug.abi64)) |
159 | 185 | } | |
160 | STABS_DEBUG | 186 | |
161 | 187 | /* This is the MIPS specific mdebug section. */ | |
162 | DWARF_DEBUG | 188 | .mdebug : { |
163 | 189 | *(.mdebug) | |
164 | /* These must appear regardless of . */ | 190 | } |
165 | .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } | 191 | |
166 | .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } | 192 | STABS_DEBUG |
167 | .note : { *(.note) } | 193 | DWARF_DEBUG |
194 | |||
195 | /* These must appear regardless of . */ | ||
196 | .gptab.sdata : { | ||
197 | *(.gptab.data) | ||
198 | *(.gptab.sdata) | ||
199 | } | ||
200 | .gptab.sbss : { | ||
201 | *(.gptab.bss) | ||
202 | *(.gptab.sbss) | ||
203 | } | ||
204 | .note : { | ||
205 | *(.note) | ||
206 | } | ||
168 | } | 207 | } |