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