linker.ld 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /* This file is (C) 2023 Victor Suarez Rovere <suarezvictor@gmail.com>
  2. // SPDX-License-Identifier: BSD-2-Clause
  3. //
  4. // (C) Litex and Misoc developers
  5. // see LITEX_CONTRIBUTORS file for additional authors
  6. //
  7. */
  8. INCLUDE generated/output_format.ld
  9. ENTRY(_start)
  10. __DYNAMIC = 0;
  11. INCLUDE generated/regions.ld
  12. SECTIONS
  13. {
  14. .text :
  15. {
  16. _ftext = .;
  17. /* Make sure crt0 files come first, and they, and the isr */
  18. /* don't get disposed of by greedy optimisation */
  19. *crt0*(.text)
  20. KEEP(*crt0*(.text))
  21. *(.text .stub .text.* .gnu.linkonce.t.* .gnu.*lto*)
  22. _etext = .;
  23. } > main_ram
  24. .rodata :
  25. {
  26. . = ALIGN(8);
  27. _frodata = .;
  28. *(.rodata)
  29. *(.rodata.* .gnu.linkonce.r.*)
  30. *(.rodata1)
  31. . = ALIGN(8);
  32. _erodata = .;
  33. } > main_ram
  34. .init_array ALIGN(8) : /*newer versions of GCC adds constructors and initializers here */
  35. {
  36. KEEP (*.init_array)
  37. KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
  38. } > main_ram
  39. .fini_array ALIGN(8) : /*this is for destructors and deinitializers */
  40. {
  41. KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
  42. KEEP(*.fini_array)
  43. } > main_ram
  44. .data :
  45. {
  46. . = ALIGN(8);
  47. /* _fdata = .; */
  48. *(.data .data.* .gnu.linkonce.d.*)
  49. *(.data1)
  50. /* _gp = ALIGN(16); */
  51. *(.sdata .sdata.* .gnu.linkonce.s.*)
  52. . = ALIGN(8);
  53. /* _edata = .; */
  54. } > main_ram
  55. .fast_text :
  56. {
  57. . = ALIGN (8);
  58. _fast_text_loadaddr = LOADADDR(.fast_text);
  59. _fast_text = .;
  60. *(.fast_text)
  61. . = ALIGN (8);
  62. _efast_text = .;
  63. } > sram AT > main_ram
  64. .fast_data :
  65. {
  66. . = ALIGN (8);
  67. _fast_data_loadaddr = LOADADDR(.fast_data);
  68. _fast_data = .;
  69. *(.fast_data)
  70. _efast_data = .;
  71. } > sram AT > main_ram
  72. .bss : /* NOTE: this includes _end, so it must come at the end for correct malloc */
  73. {
  74. . = ALIGN(8);
  75. _fbss = .;
  76. *(.dynsbss)
  77. *(.sbss .sbss.* .gnu.linkonce.sb.*)
  78. *(.scommon)
  79. *(.dynbss)
  80. *(.bss .bss.* .gnu.linkonce.b.*)
  81. *(COMMON)
  82. . = ALIGN(8);
  83. _ebss = .;
  84. _end = .;
  85. } > main_ram
  86. }
  87. PROVIDE(_fstack = ORIGIN(sram) + LENGTH(sram) - 4);
  88. PROVIDE(_fdata_rom = LOADADDR(.data));
  89. PROVIDE(_edata_rom = LOADADDR(.data) + SIZEOF(.data));
  90. PROVIDE(_emain_ram = ORIGIN(main_ram) + LENGTH(main_ram));
  91. PROVIDE(__heap_start = ORIGIN(main_ram) + 0x01000000); /*skips video framebuffer, if any*/
  92. PROVIDE(__heap_end = ORIGIN(main_ram) + LENGTH(main_ram));
  93. PROVIDE_HIDDEN (__init_array_start = LOADADDR(.init_array));
  94. PROVIDE_HIDDEN (__init_array_end = LOADADDR(.init_array) + SIZEOF(.init_array));
  95. PROVIDE_HIDDEN (__fini_array_start = LOADADDR(.fini_array));
  96. PROVIDE_HIDDEN (__fini_array_end = LOADADDR(.fini_array) + SIZEOF(.fini_array));