Merge ../linux-2.6-watchdog-mm
[linux-2.6] / arch / arm / kernel / vmlinux.lds.S
1 /* ld script to make ARM Linux kernel
2  * taken from the i386 version by Russell King
3  * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
4  */
5
6 #include <asm-generic/vmlinux.lds.h>
7 #include <asm/thread_info.h>
8 #include <asm/memory.h>
9         
10 OUTPUT_ARCH(arm)
11 ENTRY(stext)
12
13 #ifndef __ARMEB__
14 jiffies = jiffies_64;
15 #else
16 jiffies = jiffies_64 + 4;
17 #endif
18
19 SECTIONS
20 {
21 #ifdef CONFIG_XIP_KERNEL
22         . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);
23 #else
24         . = PAGE_OFFSET + TEXT_OFFSET;
25 #endif
26         .init : {                       /* Init code and data           */
27                 _stext = .;
28                         _sinittext = .;
29                         *(.init.text)
30                         _einittext = .;
31                 __proc_info_begin = .;
32                         *(.proc.info.init)
33                 __proc_info_end = .;
34                 __arch_info_begin = .;
35                         *(.arch.info.init)
36                 __arch_info_end = .;
37                 __tagtable_begin = .;
38                         *(.taglist.init)
39                 __tagtable_end = .;
40                 . = ALIGN(16);
41                 __setup_start = .;
42                         *(.init.setup)
43                 __setup_end = .;
44                 __early_begin = .;
45                         *(.early_param.init)
46                 __early_end = .;
47                 __initcall_start = .;
48                         INITCALLS
49                 __initcall_end = .;
50                 __con_initcall_start = .;
51                         *(.con_initcall.init)
52                 __con_initcall_end = .;
53                 __security_initcall_start = .;
54                         *(.security_initcall.init)
55                 __security_initcall_end = .;
56                 . = ALIGN(32);
57                 __initramfs_start = .;
58                         usr/built-in.o(.init.ramfs)
59                 __initramfs_end = .;
60                 . = ALIGN(64);
61                 __per_cpu_start = .;
62                         *(.data.percpu)
63                 __per_cpu_end = .;
64 #ifndef CONFIG_XIP_KERNEL
65                 __init_begin = _stext;
66                 *(.init.data)
67                 . = ALIGN(4096);
68                 __init_end = .;
69 #endif
70         }
71
72         /DISCARD/ : {                   /* Exit code and data           */
73                 *(.exit.text)
74                 *(.exit.data)
75                 *(.exitcall.exit)
76 #ifndef CONFIG_MMU
77                 *(.fixup)
78                 *(__ex_table)
79 #endif
80         }
81
82         .text : {                       /* Real text segment            */
83                 _text = .;              /* Text and read-only data      */
84                         *(.text)
85                         SCHED_TEXT
86                         LOCK_TEXT
87 #ifdef CONFIG_MMU
88                         *(.fixup)
89 #endif
90                         *(.gnu.warning)
91                         *(.rodata)
92                         *(.rodata.*)
93                         *(.glue_7)
94                         *(.glue_7t)
95                 *(.got)                 /* Global offset table          */
96         }
97
98         RODATA
99
100         _etext = .;                     /* End of text and rodata section */
101
102 #ifdef CONFIG_XIP_KERNEL
103         __data_loc = ALIGN(4);          /* location in binary */
104         . = PAGE_OFFSET + TEXT_OFFSET;
105 #else
106         . = ALIGN(THREAD_SIZE);
107         __data_loc = .;
108 #endif
109
110         .data : AT(__data_loc) {
111                 __data_start = .;       /* address in memory */
112
113                 /*
114                  * first, the init task union, aligned
115                  * to an 8192 byte boundary.
116                  */
117                 *(.init.task)
118
119 #ifdef CONFIG_XIP_KERNEL
120                 . = ALIGN(4096);
121                 __init_begin = .;
122                 *(.init.data)
123                 . = ALIGN(4096);
124                 __init_end = .;
125 #endif
126
127                 . = ALIGN(4096);
128                 __nosave_begin = .;
129                 *(.data.nosave)
130                 . = ALIGN(4096);
131                 __nosave_end = .;
132
133                 /*
134                  * then the cacheline aligned data
135                  */
136                 . = ALIGN(32);
137                 *(.data.cacheline_aligned)
138
139                 /*
140                  * The exception fixup table (might need resorting at runtime)
141                  */
142                 . = ALIGN(32);
143                 __start___ex_table = .;
144 #ifdef CONFIG_MMU
145                 *(__ex_table)
146 #endif
147                 __stop___ex_table = .;
148
149                 /*
150                  * and the usual data section
151                  */
152                 *(.data)
153                 CONSTRUCTORS
154
155                 _edata = .;
156         }
157
158         .bss : {
159                 __bss_start = .;        /* BSS                          */
160                 *(.bss)
161                 *(COMMON)
162                 _end = .;
163         }
164                                         /* Stabs debugging sections.    */
165         .stab 0 : { *(.stab) }
166         .stabstr 0 : { *(.stabstr) }
167         .stab.excl 0 : { *(.stab.excl) }
168         .stab.exclstr 0 : { *(.stab.exclstr) }
169         .stab.index 0 : { *(.stab.index) }
170         .stab.indexstr 0 : { *(.stab.indexstr) }
171         .comment 0 : { *(.comment) }
172 }
173
174 /*
175  * These must never be empty
176  * If you have to comment these two assert statements out, your
177  * binutils is too old (for other reasons as well)
178  */
179 ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
180 ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")