[efi] Add EFI image format and basic runtime environment
[people/sha0/gpxe.git] / src / arch / i386 / scripts / efi.lds
1 /* -*- sh -*- */
2
3 /*
4  * Linker script for EFI images
5  *
6  */
7
8 EXTERN ( efi_entry )
9
10 SECTIONS {
11
12     /* The file starts at a virtual address of zero, and sections are
13      * contiguous.  Each section is aligned to at least _max_align,
14      * which defaults to 32.  Load addresses are equal to virtual
15      * addresses.
16      */
17
18     . = 0;
19     PROVIDE ( _max_align = 32 );
20
21     /*
22      * The prefix
23      *
24      */
25
26     .prefix : AT ( _prefix_lma ) {
27         _prefix = .;
28         *(.prefix)
29         *(.prefix.*)
30         _mprefix = .;
31     } .prefix_bss (NOLOAD) : {
32         _eprefix = .;
33     }
34     _prefix_filesz      = ABSOLUTE ( _mprefix - _prefix );
35     _prefix_memsz       = ABSOLUTE ( _eprefix - _prefix );
36
37     /*
38      * The text section
39      *
40      */
41
42     . = ALIGN ( _max_align );
43     .text : AT ( _text_lma ) {
44         _text = .;
45         *(.text)
46         *(.text.*)
47         _mtext = .;
48     } .text_bss (NOLOAD) : {
49         _etext = .;
50     }
51     _text_filesz        = ABSOLUTE ( _mtext - _text );
52     _text_memsz         = ABSOLUTE ( _etext - _text );
53
54     /*
55      * The rodata section
56      *
57      */
58
59     . = ALIGN ( _max_align );
60     .rodata : AT ( _rodata_lma ) {
61         _rodata = .;
62         *(.rodata)
63         *(.rodata.*)
64         _mrodata = .;
65     } .rodata_bss (NOLOAD) : {
66         _erodata = .;
67     }
68     _rodata_filesz      = ABSOLUTE ( _mrodata - _rodata );
69     _rodata_memsz       = ABSOLUTE ( _erodata - _rodata );
70
71     /*
72      * The data section
73      *
74      */
75
76     . = ALIGN ( _max_align );
77     .data : AT ( _data_lma ) {
78         _data = .;
79         *(.data)
80         *(.data.*)
81         *(SORT(.tbl.*))         /* Various tables.  See include/tables.h */
82         /* EFI seems to not support proper bss sections */
83         *(.bss)
84         *(.bss.*)
85         *(COMMON)
86         *(.stack)
87         *(.stack.*)
88         _mdata = .;
89     } .data_bss (NOLOAD) : {
90         _edata = .;
91     }
92     _data_filesz        = ABSOLUTE ( _mdata - _data );
93     _data_memsz         = ABSOLUTE ( _edata - _data );
94
95     /*
96      * The bss section
97      *
98      */
99
100     . = ALIGN ( _max_align );
101     .bss : AT ( _bss_lma ) {
102         _bss = .;
103         /* EFI seems to not support proper bss sections */
104         _mbss = .;
105     } .bss_bss (NOLOAD) : {
106         _ebss = .;
107     }
108     _bss_filesz         = ABSOLUTE ( _mbss - _bss );
109     _bss_memsz          = ABSOLUTE ( _ebss - _bss );
110
111     /*
112      * The reloc section
113      *
114      */
115
116     . = ALIGN ( _max_align );
117     .reloc : AT ( _reloc_lma ) {
118         _reloc = .;
119         /* Provide some dummy contents to force ld to include this
120          * section.  It will be created by the efilink utility.
121          */
122         . += 1;
123         _mreloc = .;
124     } .reloc_bss (NOLOAD) : {
125         _ereloc = .;
126     }
127     _reloc_filesz       = ABSOLUTE ( _mreloc - _reloc );
128     _reloc_memsz        = ABSOLUTE ( _ereloc - _reloc );
129
130     _filesz             = ABSOLUTE ( . );
131
132     /*
133      * Weak symbols that need zero values if not otherwise defined
134      *
135      */
136
137     .weak 0x0 : {
138         _weak = .;
139         *(.weak)
140         _eweak = .;
141     }
142     _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" );
143
144     /*
145      * Dispose of the comment and note sections to make the link map
146      * easier to read
147      *
148      */
149
150     /DISCARD/ : {
151         *(.comment)
152         *(.note)
153     }
154
155     /*
156      * Load address calculations.
157      *
158      */
159
160     _prefix_lma         = ABSOLUTE ( _prefix );
161     _text_lma           = ABSOLUTE ( _text );
162     _rodata_lma         = ABSOLUTE ( _rodata );
163     _data_lma           = ABSOLUTE ( _data );
164     _bss_lma            = ABSOLUTE ( _bss );
165     _reloc_lma          = ABSOLUTE ( _reloc );
166
167     /*
168      * Load addresses required by the prefix
169      *
170      */
171     efi_entry_lma       = ABSOLUTE ( efi_entry );
172     debugdir_lma        = ABSOLUTE ( debugdir );
173     codeview_rsds_lma   = ABSOLUTE ( codeview_rsds );
174 }