You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

i386.lds 6.0KB

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