[prefix] Add .text16.early section
[people/meteger/gpxe.git] / src / arch / i386 / scripts / i386.lds
1 /* -*- sh -*- */
2
3 /*
4  * Linker script for i386 images
5  *
6  */
7
8 SECTIONS {
9
10     /* Each section starts at a virtual address of zero.
11      *
12      * We guarantee alignment of virtual addresses to any alignment
13      * specified by the constituent object files (e.g. via
14      * __attribute__((aligned(x)))).  Load addresses are guaranteed
15      * only up to _max_align.  Provided that all loader and relocation
16      * code honours _max_align, this means that physical addresses are
17      * also guaranteed up to _max_align.
18      *
19      * Note that when using -DKEEP_IT_REAL, the UNDI segments are only
20      * guaranteed to be loaded on a paragraph boundary (i.e. 16-byte
21      * alignment).  Using _max_align>16 will therefore not guarantee
22      * >16-byte alignment of physical addresses when -DKEEP_IT_REAL is
23      * used (though virtual addresses will still be fully aligned).
24      *
25      */
26
27     /*
28      * The prefix
29      *
30      */
31
32     .prefix 0x0 : AT ( _prefix_lma ) {
33         _prefix = .;
34         *(.prefix)
35         *(.prefix.*)
36         _mprefix = .;
37     } .bss.prefix (NOLOAD) : AT ( _end_lma ) {
38         _eprefix = .;
39     }
40     _prefix_filesz      = ABSOLUTE ( _mprefix - _prefix );
41     _prefix_memsz       = ABSOLUTE ( _eprefix - _prefix );
42
43     /*
44      * The 16-bit (real-mode) code section
45      *
46      */
47
48     .text16.early 0x0 : AT ( _text16_early_lma ) {
49         _text16 = .;
50         *(.text16.null)
51         . += 1;                         /* Prevent NULL being valid */
52         *(.text16.early)
53         *(.text16.early.*)
54         _etext16_early = .;
55     } .text16.late ALIGN ( _max_align ) : AT ( _text16_late_lma ) {
56         _text16_late = .;
57         *(.text16)
58         *(.text16.*)
59         _mtext16 = .;
60     } .bss.text16 (NOLOAD) : AT ( _end_lma ) {
61         _etext16 = .;
62     }
63     _text16_early_filesz = ABSOLUTE ( _etext16_early - _text16 );
64     _text16_early_memsz = ABSOLUTE ( _etext16_early - _text16 );
65     _text16_late_filesz = ABSOLUTE ( _mtext16 - _text16_late );
66     _text16_late_memsz  = ABSOLUTE ( _etext16 - _text16_late );
67     _text16_memsz       = ABSOLUTE ( _etext16 - _text16 );
68
69     /*
70      * The 16-bit (real-mode) data section
71      *
72      */
73
74     .data16 0x0 : AT ( _data16_lma ) {
75         _data16 = .;
76         . += 1;                         /* Prevent NULL being valid */
77         *(.rodata16)
78         *(.rodata16.*)
79         *(.data16)
80         *(.data16.*)
81         _mdata16 = .;
82     } .bss.data16 (NOLOAD) : AT ( _end_lma ) {
83         *(.bss16)
84         *(.bss16.*)
85         *(.stack16)
86         *(.stack16.*)
87         _edata16 = .;
88     }
89     _data16_filesz      = ABSOLUTE ( _mdata16 - _data16 );
90     _data16_memsz       = ABSOLUTE ( _edata16 - _data16 );
91
92     /*
93      * The 32-bit sections
94      *
95      */
96
97     .textdata 0x0 : AT ( _textdata_lma ) {
98         _textdata = .;
99         *(.text.null_trap)
100         . += 1;                         /* Prevent NULL being valid */
101         *(.text)
102         *(.text.*)
103         *(.rodata)
104         *(.rodata.*)
105         *(.data)
106         *(.data.*)
107         *(SORT(.tbl.*))         /* Various tables.  See include/tables.h */
108         _mtextdata = .;
109     } .bss.textdata (NOLOAD) : AT ( _end_lma ) {
110         *(.bss)
111         *(.bss.*)
112         *(COMMON)
113         *(.stack)
114         *(.stack.*)
115         _etextdata = .;
116     }
117     _textdata_filesz    = ABSOLUTE ( _mtextdata - _textdata );
118     _textdata_memsz     = ABSOLUTE ( _etextdata - _textdata );
119
120     /*
121      * Compressor information block
122      *
123      */
124
125     .zinfo 0x0 : AT ( _zinfo_lma ) {
126         _zinfo = .;
127         *(.zinfo)
128         *(.zinfo.*)
129         _mzinfo = .;
130     } .bss.zinfo (NOLOAD) : AT ( _end_lma ) {
131         _ezinfo = .;
132     }
133     _zinfo_filesz       = ABSOLUTE ( _mzinfo - _zinfo );
134     _zinfo_memsz        = ABSOLUTE ( _ezinfo - _zinfo );
135
136     /*
137      * Weak symbols that need zero values if not otherwise defined
138      *
139      */
140
141     .weak 0x0 : AT ( _end_lma ) {
142         _weak = .;
143         *(.weak)
144         _eweak = .;
145     }
146     _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" );
147
148     /*
149      * Dispose of the comment and note sections to make the link map
150      * easier to read
151      *
152      */
153
154     /DISCARD/ : {
155         *(.comment)
156         *(.comment.*)
157         *(.note)
158         *(.note.*)
159         *(.eh_frame)
160         *(.eh_frame.*)
161         *(.rel)
162         *(.rel.*)
163         *(.discard)
164     }
165
166     /*
167      * Load address calculations.  In older versions of ld, ALIGN()
168      * can operate only on the location counter, so we use that.
169      *
170      */
171
172     PROVIDE ( _max_align = 16 );
173     .                   = 0;
174
175     .                   = ALIGN ( _max_align );
176     _prefix_lma         = .;
177     .                   += _prefix_filesz;
178
179     .                   = ALIGN ( _max_align );
180     _text16_early_lma   = .;
181     .                   += _text16_early_filesz;
182
183     .                   = ALIGN ( _max_align );
184     _payload_lma        = .;
185     _text16_late_lma    = .;
186     .                   += _text16_late_filesz;
187
188     .                   = ALIGN ( _max_align );
189     _data16_lma         = .;
190     .                   += _data16_filesz;
191
192     .                   = ALIGN ( _max_align );
193     _textdata_lma       = .;
194     .                   += _textdata_filesz;
195
196     _filesz             = .; /* Do not include zinfo block in file size */
197
198     .                   = ALIGN ( _max_align );
199     _zinfo_lma          = .;
200     .                   += _zinfo_filesz;
201
202     .                   = ALIGN ( _max_align );
203     _end_lma            = .;
204
205     /*
206      * Values calculated to save code from doing it
207      *
208      */
209     _text16_memsz_pgh   = ( ( _text16_memsz + 15 ) / 16 );
210     _data16_memsz_pgh   = ( ( _data16_memsz + 15 ) / 16 );
211 }