link.lds 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /* Linker script to configure memory regions. */
  2. SEARCH_DIR(.)
  3. GROUP(-lgcc -lc -lnosys)
  4. MEMORY
  5. {
  6. FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x100000
  7. RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x80000
  8. }
  9. ENTRY(Reset_Handler)
  10. SECTIONS
  11. {
  12. .text :
  13. {
  14. KEEP(*(.isr_vector))
  15. *(.text*)
  16. KEEP(*(.init))
  17. KEEP(*(.fini))
  18. /* .ctors */
  19. *crtbegin.o(.ctors)
  20. *crtbegin?.o(.ctors)
  21. *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
  22. *(SORT(.ctors.*))
  23. *(.ctors)
  24. /* .dtors */
  25. *crtbegin.o(.dtors)
  26. *crtbegin?.o(.dtors)
  27. *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
  28. *(SORT(.dtors.*))
  29. *(.dtors)
  30. *(.rodata*)
  31. KEEP(*(.eh_frame*))
  32. /* section information for finsh shell */
  33. . = ALIGN(4);
  34. __fsymtab_start = .;
  35. KEEP(*(FSymTab))
  36. __fsymtab_end = .;
  37. . = ALIGN(4);
  38. __vsymtab_start = .;
  39. KEEP(*(VSymTab))
  40. __vsymtab_end = .;
  41. /* section information for initial. */
  42. . = ALIGN(4);
  43. __rt_init_start = .;
  44. KEEP(*(SORT(.rti_fn*)))
  45. __rt_init_end = .;
  46. . = ALIGN(4);
  47. PROVIDE(__ctors_start__ = .);
  48. KEEP (*(SORT(.init_array.*)))
  49. KEEP (*(.init_array))
  50. PROVIDE(__ctors_end__ = .);
  51. } > FLASH
  52. .nrf_queue :
  53. {
  54. PROVIDE(__start_nrf_queue = .);
  55. KEEP(*(.nrf_balloc))
  56. PROVIDE(__stop_nrf_queue = .);
  57. } > FLASH
  58. .ARM.extab :
  59. {
  60. *(.ARM.extab* .gnu.linkonce.armextab.*)
  61. } > FLASH
  62. __exidx_start = .;
  63. .ARM.exidx :
  64. {
  65. *(.ARM.exidx* .gnu.linkonce.armexidx.*)
  66. } > FLASH
  67. __exidx_end = .;
  68. __etext = .;
  69. .data : AT (__etext)
  70. {
  71. __data_start__ = .;
  72. *(vtable)
  73. *(.data*)
  74. . = ALIGN(4);
  75. /* preinit data */
  76. PROVIDE_HIDDEN (__preinit_array_start = .);
  77. KEEP(*(.preinit_array))
  78. PROVIDE_HIDDEN (__preinit_array_end = .);
  79. . = ALIGN(4);
  80. /* init data */
  81. PROVIDE_HIDDEN (__init_array_start = .);
  82. KEEP(*(SORT(.init_array.*)))
  83. KEEP(*(.init_array))
  84. PROVIDE_HIDDEN (__init_array_end = .);
  85. . = ALIGN(4);
  86. /* finit data */
  87. PROVIDE_HIDDEN (__fini_array_start = .);
  88. KEEP(*(SORT(.fini_array.*)))
  89. KEEP(*(.fini_array))
  90. PROVIDE_HIDDEN (__fini_array_end = .);
  91. KEEP(*(.jcr*))
  92. . = ALIGN(4);
  93. /* All data end */
  94. __data_end__ = .;
  95. } > RAM
  96. .bss :
  97. {
  98. . = ALIGN(4);
  99. __bss_start__ = .;
  100. *(.bss*)
  101. *(COMMON)
  102. . = ALIGN(4);
  103. __bss_end__ = .;
  104. } > RAM
  105. .heap (COPY):
  106. {
  107. __HeapBase = .;
  108. __end__ = .;
  109. PROVIDE(end = .);
  110. KEEP(*(.heap*))
  111. __HeapLimit = .;
  112. } > RAM
  113. /* .stack_dummy section doesn't contains any symbols. It is only
  114. * used for linker to calculate size of stack sections, and assign
  115. * values to stack symbols later */
  116. .stack_dummy (COPY):
  117. {
  118. KEEP(*(.stack*))
  119. } > RAM
  120. /* Set stack top to end of RAM, and stack limit move down by
  121. * size of stack_dummy section */
  122. __StackTop = ORIGIN(RAM) + LENGTH(RAM);
  123. __StackLimit = __StackTop - SIZEOF(.stack_dummy);
  124. PROVIDE(__stack = __StackTop);
  125. /* Check if data + heap + stack exceeds RAM limit */
  126. ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
  127. /* Check if text sections + data exceeds FLASH limit */
  128. DataInitFlashUsed = __bss_start__ - __data_start__;
  129. CodeFlashUsed = __etext - ORIGIN(FLASH);
  130. TotalFlashUsed = CodeFlashUsed + DataInitFlashUsed;
  131. ASSERT(TotalFlashUsed <= LENGTH(FLASH), "region FLASH overflowed with .data and user data")
  132. }