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 4.7KB

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