4 * Linker script for i386 images
8 OUTPUT_FORMAT ( "elf32-i386", "elf32-i386", "elf32-i386" )
14 /* All sections in the resulting file have consecutive load
15 * addresses, but may have individual link addresses depending on
16 * the memory model being used.
18 * The linker symbols {prefix,text}_link_addr, load_addr, and
19 * _max_align may be specified explicitly. If not specified, they
22 * _prefix_link_addr = 0
23 * _textdata_link_addr = 0
27 * We guarantee alignment of virtual addresses to any alignment
28 * specified by the constituent object files (e.g. via
29 * __attribute__((aligned(x)))). Load addresses are guaranteed
30 * only up to _max_align. Provided that all loader and relocation
31 * code honours _max_align, this means that physical addresses are
32 * also guaranteed up to _max_align.
34 * Note that when using -DKEEP_IT_REAL, the UNDI segments are only
35 * guaranteed to be loaded on a paragraph boundary (i.e. 16-byte
36 * alignment). Using _max_align>16 will therefore not guarantee
37 * >16-byte alignment of physical addresses when -DKEEP_IT_REAL is
38 * used (though virtual addresses will still be fully aligned).
46 _prefix_link_addr = DEFINED ( _prefix_link_addr ) ? _prefix_link_addr : 0;
47 . = _prefix_link_addr;
50 .prefix : AT ( _prefix_load_offset + __prefix ) {
55 _eprefix_progbits = .;
61 * The 16-bit sections, if present
64 _text16_link_addr = 0;
65 . = _text16_link_addr;
68 .text16 : AT ( _text16_load_offset + __text16 ) {
72 _etext16_progbits = .;
77 _data16_link_addr = 0;
78 . = _data16_link_addr;
81 .rodata16 : AT ( _data16_load_offset + __rodata16 ) {
86 .data16 : AT ( _data16_load_offset + __data16 ) {
90 _edata16_progbits = .;
92 .bss16 : AT ( _data16_load_offset + __bss16 ) {
99 .stack16 : AT ( _data16_load_offset + __stack16 ) {
108 * The 32-bit sections
111 _textdata_link_addr = ( DEFINED ( _textdata_link_addr ) ?
112 _textdata_link_addr : 0 );
113 . = _textdata_link_addr;
118 .text : AT ( _textdata_load_offset + __text ) {
129 .rodata : AT ( _textdata_load_offset + __rodata ) {
134 .data : AT ( _textdata_load_offset + __data ) {
138 *(SORT(.tbl.*)) /* Various tables. See include/tables.h */
139 _etextdata_progbits = .;
141 .bss : AT ( _textdata_load_offset + __bss ) {
149 .stack : AT ( _textdata_load_offset + __stack ) {
162 * Dispose of the comment and note sections to make the link map
172 * Load address calculations. The slightly obscure nature of the
173 * calculations is because ALIGN(x) can only operate on the
177 _max_align = DEFINED ( _max_align ) ? _max_align : 16;
178 _load_addr = DEFINED ( _load_addr ) ? _load_addr : 0;
182 . -= _prefix_link_addr;
183 _prefix_load_offset = ALIGN ( _max_align );
184 _prefix_load_addr = _prefix_link_addr + _prefix_load_offset;
185 _prefix_size = _eprefix - _prefix;
186 _prefix_progbits_size = _eprefix_progbits - _prefix;
187 . = _prefix_load_addr + _prefix_progbits_size;
189 . -= _text16_link_addr;
190 _text16_load_offset = ALIGN ( _max_align );
191 _text16_load_addr = _text16_link_addr + _text16_load_offset;
192 _text16_size = _etext16 - _text16;
193 _text16_progbits_size = _etext16_progbits - _text16;
194 . = _text16_load_addr + _text16_progbits_size;
196 . -= _data16_link_addr;
197 _data16_load_offset = ALIGN ( _max_align );
198 _data16_load_addr = _data16_link_addr + _data16_load_offset;
199 _data16_size = _edata16 - _data16;
200 _data16_progbits_size = _edata16_progbits - _data16;
201 . = _data16_load_addr + _data16_progbits_size;
203 . -= _textdata_link_addr;
204 _textdata_load_offset = ALIGN ( _max_align );
205 _textdata_load_addr = _textdata_link_addr + _textdata_load_offset;
206 _textdata_size = _etextdata - _textdata;
207 _textdata_progbits_size = _etextdata_progbits - _textdata;
208 . = _textdata_load_addr + _textdata_progbits_size;
210 . = ALIGN ( _max_align );
212 _load_size = . - _load_addr;
215 * Alignment checks. ALIGN() can only operate on the location
216 * counter, so we set the location counter to each value we want
220 . = _prefix_load_addr - _prefix_link_addr;
221 _assert = ASSERT ( ( . == ALIGN ( _max_align ) ),
222 "_prefix is badly aligned" );
224 . = _text16_load_addr - _text16_link_addr;
225 _assert = ASSERT ( ( . == ALIGN ( _max_align ) ),
226 "_text16 is badly aligned" );
228 . = _data16_load_addr - _data16_link_addr;
229 _assert = ASSERT ( ( . == ALIGN ( _max_align ) ),
230 "_data16 is badly aligned" );
232 . = _textdata_load_addr - _textdata_link_addr;
233 _assert = ASSERT ( ( . == ALIGN ( _max_align ) ),
234 "_text is badly aligned" );
237 * Values calculated to save code from doing it
239 _load_size_pgh = ( _load_size / 16 );
240 _rom_size = ( ( _load_size + 511 ) / 512 );