[build] Fix building with binutils 2.16
[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     PROVIDE ( _max_align = 16 );
28
29     /*
30      * The prefix
31      *
32      */
33
34     .prefix 0x0 : AT ( _prefix_lma ) {
35         _prefix = .;
36         *(.prefix)
37         *(.prefix.*)
38         _mprefix = .;
39     } .bss.prefix (NOLOAD) : AT ( _end_lma ) {
40         _eprefix = .;
41     }
42     _prefix_filesz      = ABSOLUTE ( _mprefix - _prefix );
43     _prefix_memsz       = ABSOLUTE ( _eprefix - _prefix );
44
45     /*
46      * The 16-bit (real-mode) code section
47      *
48      */
49
50     .text16.early 0x0 : AT ( _text16_early_lma ) {
51         _text16 = .;
52         *(.text16.null)
53         . += 1;                         /* Prevent NULL being valid */
54         *(.text16.early)
55         *(.text16.early.*)
56         _etext16_early = .;
57     } .text16.late ALIGN ( _max_align ) : AT ( _text16_late_lma ) {
58         _text16_late = .;
59         *(.text16)
60         *(.text16.*)
61         _mtext16 = .;
62     } .bss.text16 (NOLOAD) : AT ( _end_lma ) {
63         _etext16 = .;
64     }
65     _text16_early_filesz = ABSOLUTE ( _etext16_early - _text16 );
66     _text16_early_memsz = ABSOLUTE ( _etext16_early - _text16 );
67     _text16_late_filesz = ABSOLUTE ( _mtext16 - _text16_late );
68     _text16_late_memsz  = ABSOLUTE ( _etext16 - _text16_late );
69     _text16_memsz       = ABSOLUTE ( _etext16 - _text16 );
70
71     /*
72      * The 16-bit (real-mode) data section
73      *
74      */
75
76     .data16 0x0 : AT ( _data16_lma ) {
77         _data16 = .;
78         . += 1;                         /* Prevent NULL being valid */
79         *(.rodata16)
80         *(.rodata16.*)
81         *(.data16)
82         *(.data16.*)
83         _mdata16 = .;
84     } .bss.data16 (NOLOAD) : AT ( _end_lma ) {
85         *(.bss16)
86         *(.bss16.*)
87         *(.stack16)
88         *(.stack16.*)
89         _edata16 = .;
90     }
91     _data16_filesz      = ABSOLUTE ( _mdata16 - _data16 );
92     _data16_memsz       = ABSOLUTE ( _edata16 - _data16 );
93
94     /*
95      * The 32-bit sections
96      *
97      */
98
99     .textdata 0x0 : AT ( _textdata_lma ) {
100         _textdata = .;
101         *(.text.null_trap)
102         . += 1;                         /* Prevent NULL being valid */
103         *(.text)
104         *(.text.*)
105         *(.rodata)
106         *(.rodata.*)
107         *(.data)
108         *(.data.*)
109         *(SORT(.tbl.*))         /* Various tables.  See include/tables.h */
110         _mtextdata = .;
111     } .bss.textdata (NOLOAD) : AT ( _end_lma ) {
112         *(.bss)
113         *(.bss.*)
114         *(COMMON)
115         *(.stack)
116         *(.stack.*)
117         _etextdata = .;
118     }
119     _textdata_filesz    = ABSOLUTE ( _mtextdata - _textdata );
120     _textdata_memsz     = ABSOLUTE ( _etextdata - _textdata );
121
122     /*
123      * Compressor information block
124      *
125      */
126
127     .zinfo 0x0 : AT ( _zinfo_lma ) {
128         _zinfo = .;
129         *(.zinfo)
130         *(.zinfo.*)
131         _mzinfo = .;
132     } .bss.zinfo (NOLOAD) : AT ( _end_lma ) {
133         _ezinfo = .;
134     }
135     _zinfo_filesz       = ABSOLUTE ( _mzinfo - _zinfo );
136     _zinfo_memsz        = ABSOLUTE ( _ezinfo - _zinfo );
137
138     /*
139      * Weak symbols that need zero values if not otherwise defined
140      *
141      */
142
143     .weak 0x0 : AT ( _end_lma ) {
144         _weak = .;
145         *(.weak)
146         _eweak = .;
147     }
148     _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" );
149
150     /*
151      * Dispose of the comment and note sections to make the link map
152      * easier to read
153      *
154      */
155
156     /DISCARD/ : {
157         *(.comment)
158         *(.comment.*)
159         *(.note)
160         *(.note.*)
161         *(.eh_frame)
162         *(.eh_frame.*)
163         *(.rel)
164         *(.rel.*)
165         *(.discard)
166     }
167
168     /*
169      * Load address calculations.  In older versions of ld, ALIGN()
170      * can operate only on the location counter, so we use that.
171      *
172      */
173
174     .                   = 0;
175
176     .                   = ALIGN ( _max_align );
177     _prefix_lma         = .;
178     .                   += _prefix_filesz;
179
180     .                   = ALIGN ( _max_align );
181     _text16_early_lma   = .;
182     .                   += _text16_early_filesz;
183
184     .                   = ALIGN ( _max_align );
185     _payload_lma        = .;
186     _text16_late_lma    = .;
187     .                   += _text16_late_filesz;
188
189     .                   = ALIGN ( _max_align );
190     _data16_lma         = .;
191     .                   += _data16_filesz;
192
193     .                   = ALIGN ( _max_align );
194     _textdata_lma       = .;
195     .                   += _textdata_filesz;
196
197     _filesz             = .; /* Do not include zinfo block in file size */
198
199     .                   = ALIGN ( _max_align );
200     _zinfo_lma          = .;
201     .                   += _zinfo_filesz;
202
203     .                   = ALIGN ( _max_align );
204     _end_lma            = .;
205
206     /*
207      * Values calculated to save code from doing it
208      *
209      */
210     _text16_memsz_pgh   = ( ( _text16_memsz + 15 ) / 16 );
211     _data16_memsz_pgh   = ( ( _data16_memsz + 15 ) / 16 );
212     _textdata_memsz_pgh = ( ( _textdata_memsz + 15 ) / 16 );
213     _textdata_memsz_kb  = ( ( _textdata_memsz + 1023 ) / 1024 );
214 }