fix for STBEE
[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     .textalign : ONLY_IF_RO { . = ALIGN(8); } > flash
118
119     _etext = .;
120     _textdata = _etext;
121
122     .stacks :
123     {
124         . = ALIGN(8);
125         __main_stack_base__ = .;
126         . += __main_stack_size__;
127         . = ALIGN(8);
128         __main_stack_end__ = .;
129         __process_stack_base__ = .;
130         __main_thread_stack_base__ = .;
131         . += __process_stack_size__;
132         . = ALIGN(8);
133         __process_stack_end__ = .;
134         __main_thread_stack_end__ = .;
135     } > ram
136
137     .data :
138     {
139         . = ALIGN(4);
140         PROVIDE(_data = .);
141         *(.data)
142         . = ALIGN(4);
143         *(.data.*)
144         . = ALIGN(4);
145         *(.ramtext)
146         . = ALIGN(4);
147         PROVIDE(_edata = .);
148     } > ram AT > flash
149
150     .bss :
151     {
152         . = ALIGN(4);
153         PROVIDE(_bss_start = .);
154         *(.bss)
155         . = ALIGN(4);
156         *(.bss.*)
157         . = ALIGN(4);
158         *(COMMON)
159         . = ALIGN(4);
160         PROVIDE(_bss_end = .);
161     } > ram
162
163     PROVIDE(end = .);
164     _end            = .;
165     . = ALIGN(512);
166     /* it is at offset 0x1400 from ram start */
167     _regnual_start = __ram_start__ + 0x1400;
168
169     .fill_ffff :
170     {
171         . = ALIGN (@FLASH_PAGE_SIZE@);
172     } > flash =0xffffffff
173 }
174
175 __heap_base__   = _end;
176 __heap_end__    = __ram_end__;