e34464d0888d1465928dda4b28da8df5b89cad32
[gnuk/neug.git] / src / neug.ld.in
1 /*
2     ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
3                  2011 Giovanni Di Sirio.
4
5     This file is part of ChibiOS/RT.
6
7     ChibiOS/RT is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 3 of the License, or
10     (at your option) any later version.
11
12     ChibiOS/RT is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16
17     You should have received a copy of the GNU General Public License
18     along with this program. If not, see <http://www.gnu.org/licenses/>.
19
20                                       ---
21
22     A special exception to the GPL can be applied should you wish to distribute
23     a combined work that includes ChibiOS/RT, without being obliged to provide
24     the source code for any proprietary components. See the file exception.txt
25     for full details of how and when the exception can be applied.
26 */
27
28 /*
29  * ST32F103 memory setup.
30  */
31 __main_stack_size__     = 0x0400;
32 __process_stack_size__  = 0x0400;
33
34 MEMORY
35 {
36     flash0 : org = @ORIGIN@, len = 4k
37     flash : org = @ORIGIN@+0x1000, len = @FLASH_SIZE@k - 4k
38     ram : org = 0x20000000, len = @MEMORY_SIZE@k
39 }
40
41 /* __flash_start__: flash ROM start address regardless of DFU_SUPPORT */
42 __flash_start__         = 0x08001000;
43 __flash_end__           = ORIGIN(flash) + LENGTH(flash);
44
45 __ram_start__           = ORIGIN(ram);
46 __ram_size__            = LENGTH(ram);
47 __ram_end__             = __ram_start__ + __ram_size__;
48
49 SECTIONS
50 {
51     . = 0;
52
53     .sys : ALIGN(16) SUBALIGN(16)
54     {
55         _sys = .;
56         KEEP(*(.vectors))
57         . = ALIGN(16);
58         *(.sys.version)
59         sys.o(.text)
60         sys.o(.text.*)
61         sys.o(.rodata)
62         sys.o(.rodata.*)
63         . = ALIGN(1024);
64         *(.sys.0)
65         *(.sys.1)
66         *(.sys.2)
67     } > flash0
68
69     _text = .;
70
71     startup : ALIGN(16) SUBALIGN(16)
72     {
73         KEEP(*(vectors))
74         . = ALIGN (16);
75     } > flash =0xffffffff
76
77     constructors : ALIGN(4) SUBALIGN(4)
78     {
79         PROVIDE(__init_array_start = .);
80         KEEP(*(SORT(.init_array.*)))
81         KEEP(*(.init_array))
82         PROVIDE(__init_array_end = .);
83     } > flash
84
85     destructors : ALIGN(4) SUBALIGN(4)
86     {
87         PROVIDE(__fini_array_start = .);
88         KEEP(*(.fini_array))
89         KEEP(*(SORT(.fini_array.*)))
90         PROVIDE(__fini_array_end = .);
91     } > flash
92
93     .text : ALIGN(16) SUBALIGN(16)
94     {
95         *(.text.startup.*)
96         *(.text)
97         *(.text.*)
98         *(.rodata)
99         *(.rodata.*)
100         *(.glue_7t)
101         *(.glue_7)
102         *(.gcc*)
103     } > flash
104
105     .ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)} > flash
106
107     .ARM.exidx : {
108         PROVIDE(__exidx_start = .);
109         *(.ARM.exidx* .gnu.linkonce.armexidx.*)
110         PROVIDE(__exidx_end = .);
111      } > flash
112
113     .eh_frame_hdr : {*(.eh_frame_hdr)} > flash
114
115     .eh_frame : ONLY_IF_RO {*(.eh_frame)} > flash
116
117     . = ALIGN(4);
118     _etext = .;
119     _textdata = _etext;
120
121     .stacks :
122     {
123         . = ALIGN(8);
124         __main_stack_base__ = .;
125         . += __main_stack_size__;
126         . = ALIGN(8);
127         __main_stack_end__ = .;
128         __process_stack_base__ = .;
129         __main_thread_stack_base__ = .;
130         . += __process_stack_size__;
131         . = ALIGN(8);
132         __process_stack_end__ = .;
133         __main_thread_stack_end__ = .;
134     } > ram
135
136     .data :
137     {
138         PROVIDE(_data = .);
139         *(.data)
140         . = ALIGN(4);
141         *(.data.*)
142         . = ALIGN(4);
143         *(.ramtext)
144         . = ALIGN(4);
145         PROVIDE(_edata = .);
146     } > ram AT > flash
147
148     .bss :
149     {
150         PROVIDE(_bss_start = .);
151         *(.bss)
152         . = ALIGN(4);
153         *(.bss.*)
154         . = ALIGN(4);
155         *(COMMON)
156         . = ALIGN(4);
157         PROVIDE(_bss_end = .);
158     } > ram
159
160     .fill_ffff :
161     {
162         . = ALIGN (@FLASH_PAGE_SIZE@);
163     } > flash =0xffffffff
164 }
165
166 PROVIDE(end = .);
167 _end            = .;
168
169 __heap_base__   = _end;
170 __heap_end__    = __ram_end__;