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-kir.lds 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /* -*- sh -*- */
  2. /*
  3. * Linker script for i386 images
  4. *
  5. */
  6. OUTPUT_FORMAT ( "elf32-i386", "elf32-i386", "elf32-i386" )
  7. OUTPUT_ARCH ( i386 )
  8. ENTRY ( _entry )
  9. SECTIONS {
  10. /* All sections in the resulting file have consecutive load
  11. * addresses, but may have individual link addresses depending on
  12. * the memory model being used.
  13. *
  14. * The linker symbols _prefix_link_addr, load_addr, and
  15. * _max_align may be specified explicitly. If not specified, they
  16. * will default to:
  17. *
  18. * _prefix_link_addr = 0
  19. * _load_addr = 0
  20. * _max_align = 16
  21. *
  22. * We guarantee alignment of virtual addresses to any alignment
  23. * specified by the constituent object files (e.g. via
  24. * __attribute__((aligned(x)))). Load addresses are guaranteed
  25. * only up to _max_align. Provided that all loader and relocation
  26. * code honours _max_align, this means that physical addresses are
  27. * also guaranteed up to _max_align.
  28. *
  29. * Note that when using -DKEEP_IT_REAL, the UNDI segments are only
  30. * guaranteed to be loaded on a paragraph boundary (i.e. 16-byte
  31. * alignment). Using _max_align>16 will therefore not guarantee
  32. * >16-byte alignment of physical addresses when -DKEEP_IT_REAL is
  33. * used (though virtual addresses will still be fully aligned).
  34. *
  35. */
  36. /*
  37. * The prefix
  38. */
  39. _prefix_link_addr = DEFINED ( _prefix_link_addr ) ? _prefix_link_addr : 0;
  40. . = _prefix_link_addr;
  41. _prefix = .;
  42. .prefix : AT ( _prefix_load_offset + __prefix ) {
  43. __prefix = .;
  44. _entry = .;
  45. *(.prefix)
  46. *(.prefix.*)
  47. _eprefix_progbits = .;
  48. }
  49. _eprefix = .;
  50. /*
  51. * The 16-bit sections
  52. */
  53. _text16_link_addr = 0;
  54. . = _text16_link_addr;
  55. _text16 = .;
  56. . += 1; /* Prevent NULL being valid */
  57. .text16 : AT ( _text16_load_offset + __text16 ) {
  58. __text16 = .;
  59. *(.text.null_trap)
  60. *(.text16)
  61. *(.text16.*)
  62. *(.text)
  63. *(.text.*)
  64. _etext16_progbits = .;
  65. } = 0x9090
  66. _etext16 = .;
  67. _data16_link_addr = 0;
  68. . = _data16_link_addr;
  69. _data16 = .;
  70. . += 1; /* Prevent NULL being valid */
  71. .rodata16 : AT ( _data16_load_offset + __rodata16 ) {
  72. __rodata16 = .;
  73. *(.rodata16)
  74. *(.rodata16.*)
  75. *(.rodata)
  76. *(.rodata.*)
  77. }
  78. .data16 : AT ( _data16_load_offset + __data16 ) {
  79. __data16 = .;
  80. *(.data16)
  81. *(.data16.*)
  82. *(.data)
  83. *(.data.*)
  84. *(SORT(.tbl.*)) /* Various tables. See include/tables.h */
  85. _edata16_progbits = .;
  86. }
  87. .bss16 : AT ( _data16_load_offset + __bss16 ) {
  88. __bss16 = .;
  89. _bss16 = .;
  90. *(.bss16)
  91. *(.bss16.*)
  92. *(.bss)
  93. *(.bss.*)
  94. *(COMMON)
  95. _ebss16 = .;
  96. }
  97. .stack16 : AT ( _data16_load_offset + __stack16 ) {
  98. __stack16 = .;
  99. *(.stack16)
  100. *(.stack16.*)
  101. *(.stack)
  102. *(.stack.*)
  103. }
  104. _edata16 = .;
  105. _end = .;
  106. /*
  107. * Dispose of the comment and note sections to make the link map
  108. * easier to read
  109. */
  110. /DISCARD/ : {
  111. *(.comment)
  112. *(.note)
  113. *(.discard)
  114. }
  115. /*
  116. * Load address calculations. The slightly obscure nature of the
  117. * calculations is because ALIGN(x) can only operate on the
  118. * location counter.
  119. */
  120. _max_align = DEFINED ( _max_align ) ? _max_align : 16;
  121. _load_addr = DEFINED ( _load_addr ) ? _load_addr : 0;
  122. . = _load_addr;
  123. . -= _prefix_link_addr;
  124. _prefix_load_offset = ALIGN ( _max_align );
  125. _prefix_load_addr = _prefix_link_addr + _prefix_load_offset;
  126. _prefix_size = _eprefix - _prefix;
  127. _prefix_progbits_size = _eprefix_progbits - _prefix;
  128. . = _prefix_load_addr + _prefix_progbits_size;
  129. . -= _text16_link_addr;
  130. _text16_load_offset = ALIGN ( _max_align );
  131. _text16_load_addr = _text16_link_addr + _text16_load_offset;
  132. _text16_size = _etext16 - _text16;
  133. _text16_progbits_size = _etext16_progbits - _text16;
  134. . = _text16_load_addr + _text16_progbits_size;
  135. . -= _data16_link_addr;
  136. _data16_load_offset = ALIGN ( _max_align );
  137. _data16_load_addr = _data16_link_addr + _data16_load_offset;
  138. _data16_size = _edata16 - _data16;
  139. _data16_progbits_size = _edata16_progbits - _data16;
  140. . = _data16_load_addr + _data16_progbits_size;
  141. . = ALIGN ( _max_align );
  142. _load_size = . - _load_addr;
  143. /*
  144. * Alignment checks. ALIGN() can only operate on the location
  145. * counter, so we set the location counter to each value we want
  146. * to check.
  147. */
  148. . = _prefix_load_addr - _prefix_link_addr;
  149. _assert = ASSERT ( ( . == ALIGN ( _max_align ) ),
  150. "_prefix is badly aligned" );
  151. . = _text16_load_addr - _text16_link_addr;
  152. _assert = ASSERT ( ( . == ALIGN ( _max_align ) ),
  153. "_text16 is badly aligned" );
  154. . = _data16_load_addr - _data16_link_addr;
  155. _assert = ASSERT ( ( . == ALIGN ( _max_align ) ),
  156. "_data16 is badly aligned" );
  157. /*
  158. * Values calculated to save code from doing it
  159. */
  160. _text16_size_pgh = ( ( _text16_size + 15 ) / 16 );
  161. _data16_size_pgh = ( ( _data16_size + 15 ) / 16 );
  162. _load_size_pgh = ( ( _load_size + 15 ) / 16 );
  163. _load_size_sect = ( ( _load_size + 511 ) / 512 );
  164. }