link.lds 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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 = 0x40000
  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. .ARM.extab :
  53. {
  54. *(.ARM.extab* .gnu.linkonce.armextab.*)
  55. } > FLASH
  56. __exidx_start = .;
  57. .ARM.exidx :
  58. {
  59. *(.ARM.exidx* .gnu.linkonce.armexidx.*)
  60. } > FLASH
  61. __exidx_end = .;
  62. __etext = .;
  63. .data : AT (__etext)
  64. {
  65. __data_start__ = .;
  66. *(vtable)
  67. *(.data*)
  68. . = ALIGN(4);
  69. /* preinit data */
  70. PROVIDE_HIDDEN (__preinit_array_start = .);
  71. KEEP(*(.preinit_array))
  72. PROVIDE_HIDDEN (__preinit_array_end = .);
  73. . = ALIGN(4);
  74. /* init data */
  75. PROVIDE_HIDDEN (__init_array_start = .);
  76. KEEP(*(SORT(.init_array.*)))
  77. KEEP(*(.init_array))
  78. PROVIDE_HIDDEN (__init_array_end = .);
  79. . = ALIGN(4);
  80. /* finit data */
  81. PROVIDE_HIDDEN (__fini_array_start = .);
  82. KEEP(*(SORT(.fini_array.*)))
  83. KEEP(*(.fini_array))
  84. PROVIDE_HIDDEN (__fini_array_end = .);
  85. KEEP(*(.jcr*))
  86. . = ALIGN(4);
  87. /* All data end */
  88. __data_end__ = .;
  89. } > RAM
  90. .bss :
  91. {
  92. . = ALIGN(4);
  93. __bss_start__ = .;
  94. *(.bss*)
  95. *(COMMON)
  96. . = ALIGN(4);
  97. __bss_end__ = .;
  98. } > RAM
  99. .heap (COPY):
  100. {
  101. __HeapBase = .;
  102. __end__ = .;
  103. PROVIDE(end = .);
  104. KEEP(*(.heap*))
  105. __HeapLimit = .;
  106. } > RAM
  107. /* .stack_dummy section doesn't contains any symbols. It is only
  108. * used for linker to calculate size of stack sections, and assign
  109. * values to stack symbols later */
  110. .stack_dummy (COPY):
  111. {
  112. KEEP(*(.stack*))
  113. } > RAM
  114. /* Set stack top to end of RAM, and stack limit move down by
  115. * size of stack_dummy section */
  116. __StackTop = ORIGIN(RAM) + LENGTH(RAM);
  117. __StackLimit = __StackTop - SIZEOF(.stack_dummy);
  118. PROVIDE(__stack = __StackTop);
  119. /* Check if data + heap + stack exceeds RAM limit */
  120. ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
  121. /* Check if text sections + data exceeds FLASH limit */
  122. DataInitFlashUsed = __bss_start__ - __data_start__;
  123. CodeFlashUsed = __etext - ORIGIN(FLASH);
  124. TotalFlashUsed = CodeFlashUsed + DataInitFlashUsed;
  125. ASSERT(TotalFlashUsed <= LENGTH(FLASH), "region FLASH overflowed with .data and user data")
  126. }