選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

pcbios.lds 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  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. * Values used in page table calculations
  26. *
  27. * On older versions of ld (without the SANE_EXPR feature),
  28. * numeric literals within a section description tend to be
  29. * interpreted as section-relative symbols.
  30. *
  31. */
  32. _page_size = 4096;
  33. _page_size_1 = ( _page_size - 1 );
  34. _pte_size = 8;
  35. _pte_count = ( _page_size / _pte_size );
  36. _pte_count_1 = ( _pte_count - 1 );
  37. /*
  38. * Allow decompressor to require a minimum amount of temporary stack
  39. * space.
  40. *
  41. */
  42. PROVIDE ( _min_decompress_stack = 0 );
  43. /*
  44. * The prefix
  45. *
  46. */
  47. .prefix 0x0 : AT ( _prefix_lma ) {
  48. _prefix = .;
  49. *(.prefix)
  50. *(SORT(.pci_devlist.*))
  51. *(.prefix.*)
  52. _mprefix = .;
  53. } .bss.prefix (NOLOAD) : AT ( _end_lma ) {
  54. _eprefix = .;
  55. }
  56. _prefix_filesz = ABSOLUTE ( _mprefix ) - ABSOLUTE ( _prefix );
  57. _prefix_memsz = ABSOLUTE ( _eprefix ) - ABSOLUTE ( _prefix );
  58. /*
  59. * The 16-bit (real-mode) code section
  60. *
  61. */
  62. .text16.early 0x0 : AT ( _text16_early_lma ) {
  63. _text16 = .;
  64. KEEP(*(.text16.null))
  65. KEEP(*(.text16.null.*))
  66. . += 1; /* Prevent NULL being valid */
  67. *(.text16.early)
  68. *(.text16.early.*)
  69. _etext16_early = .;
  70. } .text16.late ALIGN ( _max_align ) : AT ( _text16_late_lma ) {
  71. _text16_late = .;
  72. *(.text16)
  73. *(.text16.*)
  74. _mtext16 = .;
  75. } .bss.text16 (NOLOAD) : AT ( _end_lma ) {
  76. _etext16 = .;
  77. }
  78. _text16_early_filesz = ABSOLUTE ( _etext16_early ) - ABSOLUTE ( _text16 );
  79. _text16_early_memsz = ABSOLUTE ( _etext16_early ) - ABSOLUTE ( _text16 );
  80. _text16_late_filesz = ABSOLUTE ( _mtext16 ) - ABSOLUTE ( _text16_late );
  81. _text16_late_memsz = ABSOLUTE ( _etext16 ) - ABSOLUTE ( _text16_late );
  82. _text16_memsz = ABSOLUTE ( _etext16 ) - ABSOLUTE ( _text16 );
  83. /*
  84. * The 16-bit (real-mode) data section
  85. *
  86. */
  87. .data16 0x0 : AT ( _data16_lma ) {
  88. _data16 = .;
  89. . += 1; /* Prevent NULL being valid */
  90. *(.rodata16)
  91. *(.rodata16.*)
  92. *(.data16)
  93. *(.data16.*)
  94. _mdata16 = .;
  95. } .bss.data16 (NOLOAD) : AT ( _end_lma ) {
  96. *(.bss16)
  97. *(.bss16.*)
  98. *(.stack16)
  99. *(.stack16.*)
  100. . = MAX ( ., _mdata16 + _min_decompress_stack );
  101. _edata16 = .;
  102. }
  103. _data16_filesz = ABSOLUTE ( _mdata16 ) - ABSOLUTE ( _data16 );
  104. _data16_memsz = ABSOLUTE ( _edata16 ) - ABSOLUTE ( _data16 );
  105. /*
  106. * The 32-bit sections
  107. *
  108. */
  109. .textdata 0x0 : AT ( _textdata_lma ) {
  110. _textdata = .;
  111. KEEP(*(.text.null_trap))
  112. KEEP(*(.text.null_trap.*))
  113. . += 1; /* Prevent NULL being valid */
  114. *(.text)
  115. *(.text.*)
  116. *(.rodata)
  117. *(.rodata.*)
  118. *(.data)
  119. *(.data.*)
  120. KEEP(*(SORT(.tbl.*))) /* Various tables. See include/tables.h */
  121. KEEP(*(.provided))
  122. KEEP(*(.provided.*))
  123. _mtextdata = .;
  124. } .bss.textdata (NOLOAD) : AT ( _end_lma ) {
  125. *(.bss)
  126. *(.bss.*)
  127. *(COMMON)
  128. *(.stack)
  129. *(.stack.*)
  130. _pages = .;
  131. *(.pages)
  132. *(.pages.*)
  133. _use_page_tables = ABSOLUTE ( . ) - ABSOLUTE ( _pages );
  134. _textdata_paged_len =
  135. ABSOLUTE ( ABSOLUTE ( . ) - ABSOLUTE ( _textdata ) );
  136. _textdata_ptes =
  137. ABSOLUTE ( ( _textdata_paged_len + _page_size_1 ) / _page_size );
  138. _textdata_pdes =
  139. ABSOLUTE ( ( _textdata_ptes + _pte_count_1 ) / _pte_count );
  140. . += ( _use_page_tables ? ( _textdata_pdes * _page_size ) : 0 );
  141. _epages = .;
  142. _etextdata = .;
  143. }
  144. _textdata_filesz = ABSOLUTE ( _mtextdata ) - ABSOLUTE ( _textdata );
  145. _textdata_memsz = ABSOLUTE ( _etextdata ) - ABSOLUTE ( _textdata );
  146. /*
  147. * Payload prefix
  148. *
  149. * If present, this will be placed between .text16.early and .text16.late.
  150. *
  151. */
  152. .pprefix 0x0 : AT ( _pprefix_lma ) {
  153. _pprefix = .;
  154. KEEP(*(.pprefix))
  155. KEEP(*(.pprefix.*))
  156. _mpprefix = .;
  157. } .bss.pprefix (NOLOAD) : AT ( _end_lma ) {
  158. _epprefix = .;
  159. }
  160. _pprefix_filesz = ABSOLUTE ( _mpprefix ) - ABSOLUTE ( _pprefix );
  161. _pprefix_memsz = ABSOLUTE ( _epprefix ) - ABSOLUTE ( _pprefix );
  162. /*
  163. * Compressor information block
  164. *
  165. */
  166. .zinfo 0x0 : AT ( _zinfo_lma ) {
  167. _zinfo = .;
  168. KEEP(*(.zinfo))
  169. KEEP(*(.zinfo.*))
  170. _mzinfo = .;
  171. } .bss.zinfo (NOLOAD) : AT ( _end_lma ) {
  172. _ezinfo = .;
  173. }
  174. _zinfo_filesz = ABSOLUTE ( _mzinfo ) - ABSOLUTE ( _zinfo );
  175. _zinfo_memsz = ABSOLUTE ( _ezinfo ) - ABSOLUTE ( _zinfo );
  176. /*
  177. * Weak symbols that need zero values if not otherwise defined
  178. *
  179. */
  180. .weak 0x0 : AT ( _end_lma ) {
  181. _weak = .;
  182. *(.weak)
  183. *(.weak.*)
  184. _eweak = .;
  185. }
  186. _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" );
  187. /*
  188. * Dispose of the comment and note sections to make the link map
  189. * easier to read
  190. *
  191. */
  192. /DISCARD/ : {
  193. *(.comment)
  194. *(.comment.*)
  195. *(.note)
  196. *(.note.*)
  197. *(.eh_frame)
  198. *(.eh_frame.*)
  199. *(.rel)
  200. *(.rel.*)
  201. *(.einfo)
  202. *(.einfo.*)
  203. *(.discard)
  204. *(.discard.*)
  205. }
  206. /*
  207. * Load address calculations. In older versions of ld, ALIGN()
  208. * can operate only on the location counter, so we use that.
  209. *
  210. */
  211. . = 0;
  212. . = ALIGN ( _max_align );
  213. _prefix_lma = .;
  214. . += _prefix_filesz;
  215. . = ALIGN ( _max_align );
  216. _text16_early_lma = .;
  217. . += _text16_early_filesz;
  218. . = ALIGN ( _max_align );
  219. . = ALIGN ( _payload_align );
  220. _pprefix_lma = .;
  221. . += _pprefix_filesz;
  222. . = ALIGN ( _max_align );
  223. _payload_lma = .;
  224. _pprefix_skip = ABSOLUTE ( _payload_lma ) - ABSOLUTE ( _pprefix_lma );
  225. _text16_late_lma = .;
  226. . += _text16_late_filesz;
  227. . = ALIGN ( _max_align );
  228. _data16_lma = .;
  229. . += _data16_filesz;
  230. . = ALIGN ( _max_align );
  231. _textdata_lma = .;
  232. . += _textdata_filesz;
  233. _filesz = .; /* Do not include zinfo block in file size */
  234. . = ALIGN ( _max_align );
  235. _zinfo_lma = .;
  236. . += _zinfo_filesz;
  237. . = ALIGN ( _max_align );
  238. _end_lma = .;
  239. /*
  240. * Values calculated to save code from doing it
  241. *
  242. */
  243. _text16_memsz_ppgh = ( ( ( _text16_memsz + 63 ) / 64 ) * 4 );
  244. _data16_memsz_ppgh = ( ( ( _data16_memsz + 63 ) / 64 ) * 4 );
  245. _textdata_memsz_pgh = ( ( _textdata_memsz + 15 ) / 16 );
  246. _textdata_memsz_kb = ( ( _textdata_memsz + 1023 ) / 1024 );
  247. }