max80.ld 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /* -*- ld-script -*-
  2. *
  3. * Linker script for MAX80 firmware
  4. */
  5. #include "sys.h"
  6. OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv",
  7. "elf32-littleriscv")
  8. OUTPUT_ARCH(riscv)
  9. ENTRY(_start)
  10. MEMORY
  11. {
  12. SRAM : org = SRAM_ADDR, len = SRAM_SIZE
  13. DRAM : org = SDRAM_ADDR, len = SDRAM_SIZE
  14. }
  15. SECTIONS
  16. {
  17. /*
  18. * Sections we do not need. This program cannot exit, so
  19. * fini/destructors are never needed. Exception handling
  20. * is not supported.
  21. */
  22. /DISCARD/ : {
  23. *(.note.GNU-stack)
  24. *(.gnu_debuglink)
  25. *(.gnu.lto_*)
  26. *(.discard)
  27. *(.discard.*)
  28. *(.dtors.*)
  29. *(.dtors)
  30. *(.fini_array)
  31. *(.fini_array.*)
  32. *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*)
  33. *(.eh_frame) *(.eh_frame.*)
  34. *(.gcc_except_table .gcc_except_table.*)
  35. *(.gnu_extab*)
  36. *(.exception_ranges*)
  37. *(.text.exit .text.exit.*)
  38. *crtbegin.o(*)
  39. *crt0.o(*)
  40. }
  41. PROVIDE (__executable_start = _PC_RESET);
  42. .init.reset _PC_RESET : ALIGN(4) {
  43. PROVIDE (___reset = .);
  44. KEEP (*(SORT_NONE(.init.reset)))
  45. } >SRAM
  46. .init.irq _PC_IRQ : ALIGN(4) {
  47. PROVIDE (___irq = .);
  48. KEEP (*(SORT_NONE(.init.irq)))
  49. }
  50. /*
  51. * Put the short data sections in the zero page.
  52. * This means the initialized sections aren't contiguous, but
  53. * all memory is intialized during FPGA load anyway.
  54. */
  55. .sdata : ALIGN(4) {
  56. __SDATA_BEGIN__ = .;
  57. *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4)
  58. *(.srodata.cst2) *(.srodata .srodata.*)
  59. *(.sdata .sdata.* .gnu.linkonce.s.*)
  60. }
  61. .sdata2 : {
  62. *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
  63. }
  64. . = ALIGN(32);
  65. __BSS_START__ = .;
  66. PROVIDE (__bss_start = .);
  67. .sbss : ALIGN(4) {
  68. *(.dynsbss)
  69. *(.sbss .sbss.* .gnu.linkonce.sb.*)
  70. *(.scommon)
  71. }
  72. .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }
  73. HIDDEN($assert_zero_page = ASSERT((. <= 2048), "zero page overflow"));
  74. .bss : {
  75. *(.dynbss)
  76. *(.bss .bss.* .gnu.linkonce.b.*)
  77. *(COMMON)
  78. }
  79. . = ALIGN(32);
  80. __BSS_END__ = .;
  81. __BSS_LEN__ = __BSS_END__ - __BSS_START__;
  82. . = ALIGN(4);
  83. __BSS_END__ = .;
  84. __BSS_LEN__ = __BSS_END__ - __BSS_START__;
  85. __global_pointer$ = 0;
  86. PROVIDE(___text = .);
  87. .init : ALIGN(4) {
  88. KEEP (*(SORT_NONE(.init)))
  89. }
  90. .text.hot : ALIGN(4) {
  91. *(.text.hot .text.hot.*)
  92. }
  93. .text : ALIGN(4) {
  94. *(.text.startup .text.startup.*)
  95. *(SORT(.text.sorted.*))
  96. *(.text .stub .text.* .gnu.linkonce.t.*)
  97. *(.text.unlikely .text.*_unlikely .text.unlikely.*)
  98. /* .gnu.warning sections are handled specially by elf.em. */
  99. *(.gnu.warning)
  100. }
  101. PROVIDE (__etext = .);
  102. PROVIDE (_etext = .);
  103. . = ALIGN(4);
  104. .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
  105. .rodata1 : { *(.rodata1) }
  106. /* Thread Local Storage sections */
  107. .tdata : {
  108. PROVIDE_HIDDEN (__tdata_start = .);
  109. *(.tdata .tdata.* .gnu.linkonce.td.*)
  110. }
  111. .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
  112. .preinit_array : {
  113. PROVIDE_HIDDEN (__preinit_array_start = .);
  114. KEEP (*(.preinit_array))
  115. PROVIDE_HIDDEN (__preinit_array_end = .);
  116. }
  117. .init_array : {
  118. PROVIDE_HIDDEN (__init_array_start = .);
  119. KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)
  120. SORT_BY_INIT_PRIORITY(.ctors.*)))
  121. KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
  122. PROVIDE_HIDDEN (__init_array_end = .);
  123. }
  124. /* Are these necessary/supportable? */
  125. .jcr : { KEEP (*(.jcr)) }
  126. .data.rel.ro : {
  127. *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*)
  128. }
  129. .data : {
  130. __DATA_BEGIN__ = .;
  131. *(.data .data.* .gnu.linkonce.d.*)
  132. SORT(CONSTRUCTORS)
  133. }
  134. .data1 : { *(.data1) }
  135. _edata = .;
  136. _end = .;
  137. .stack STACK_BOTTOM : {
  138. KEEP (*(.stack))
  139. }
  140. /* Sections in SDRAM */
  141. .dram.text : ALIGN(4) {
  142. *(.dram.text*)
  143. } >DRAM
  144. .dram.rodata : ALIGN(4) {
  145. *(.dram.rodata*)
  146. } >DRAM
  147. .dram.data : ALIGN(4) {
  148. *(.dram.data*)
  149. } >DRAM
  150. . = ALIGN(8);
  151. __dram_bss_start = .;
  152. .dram.bss (NOLOAD) : ALIGN(8) {
  153. *(.dram.bss*)
  154. } >DRAM
  155. . = ALIGN(8);
  156. __dram_bss_end = .;
  157. __dram_bss_len = __dram_bss_end - __dram_bss_start;
  158. /* Like BSS except no need to clear on boot */
  159. .dram.noinit (NOLOAD) : ALIGN(8) {
  160. *(.dram.noinit*)
  161. }
  162. /* No need to zero the heap */
  163. .heap (NOLOAD) : ALIGN(16) {
  164. *(.heap)
  165. } >DRAM
  166. __dram_end = .;
  167. }