mlibc.ld 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. * Copyright (c) mlibc & plct lab
  3. *
  4. * SPDX-License-Identifier: MIT
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024/8/23 0Bitbiscuits the first version
  9. */
  10. ENTRY(_start)
  11. DEFAULT_FLASH_ADDR = 0x00000000; /* Default flash addr is 0x00000000 */
  12. DEFAULT_FLASH_SIZE = 0x00001000; /* Default flash size is 4k */
  13. DEFAULT_RAM_ADDR = 0x20000000; /* Default ram addr is 0x20000000 */
  14. DEFAULT_RAM_SIZE = 0x00010000; /* Default ram size is 16k */
  15. DEFAULT_ALIGNMENT = 0x00000010; /* Default ALIGNMENT */
  16. DEFAULT_STACK_SIZE = 0x00000400; /* Default stack size is 1k */
  17. MEMORY
  18. {
  19. flash (rx!w) :
  20. ORIGIN = DEFINED(__flash) ? __flash : DEFAULT_FLASH_ADDR,
  21. LENGTH = DEFINED(__flash_size) ? __flash_size : DEFAULT_FLASH_SIZE
  22. ram (w!rx) :
  23. ORIGIN = DEFINED(__ram) ? __ram : DEFAULT_RAM_ADDR,
  24. LENGTH = DEFINED(__ram_size) ? __ram_size : DEFAULT_RAM_SIZE
  25. }
  26. PHDRS
  27. {
  28. text PT_LOAD;
  29. ram_init PT_LOAD;
  30. ram PT_LOAD;
  31. }
  32. SECTIONS
  33. {
  34. PROVIDE(__stack = ORIGIN(ram) + LENGTH(ram));
  35. .text : {
  36. /* code */
  37. *(.text.unlikely .text.unlikely.*)
  38. *(.text.startup .text.startup.*)
  39. *(.text .text.* .opd .opd.*)
  40. *(.gnu.linkonce.t.*)
  41. KEEP (*(.init .init.*))
  42. KEEP (*(.fini .fini.*))
  43. __text_end = .;
  44. PROVIDE (__etext = __text_end);
  45. PROVIDE (_etext = __text_end);
  46. PROVIDE (etext = __text_end);
  47. /* Need to pre-align so that the symbols come after padding */
  48. . = ALIGN(DEFAULT_ALIGNMENT);
  49. PROVIDE_HIDDEN ( __init_array_start = . );
  50. KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
  51. KEEP (*(.init_array))
  52. PROVIDE_HIDDEN ( __init_array_end = . );
  53. PROVIDE_HIDDEN ( __fini_array_start = . );
  54. KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
  55. KEEP (*(.fini_array .dtors))
  56. PROVIDE_HIDDEN ( __fini_array_end = . );
  57. } >flash AT>flash :text
  58. .rodata : {
  59. /* read-only data */
  60. *(.rdata)
  61. *(.rodata .rodata.*)
  62. *(.gnu.linkonce.r.*)
  63. *(.srodata.cst16)
  64. *(.srodata.cst8)
  65. *(.srodata.cst4)
  66. *(.srodata.cst2)
  67. *(.srodata .srodata.*)
  68. } >flash AT>flash :text
  69. /*
  70. * Data values which are preserved across reset
  71. */
  72. .preserve (NOLOAD) : {
  73. PROVIDE(__preserve_start__ = .);
  74. KEEP(*(SORT_BY_NAME(.preserve.*)))
  75. KEEP(*(.preserve))
  76. PROVIDE(__preserve_end__ = .);
  77. } >ram AT>ram :ram
  78. .data : ALIGN_WITH_INPUT {
  79. *(.data .data.*)
  80. *(.gnu.linkonce.d.*)
  81. /* Need to pre-align so that the symbols come after padding */
  82. . = ALIGN(DEFAULT_ALIGNMENT);
  83. PROVIDE( __global_pointer$ = . + 0x800 );
  84. PROVIDE( _gp = . + 0x8000);
  85. *(.sdata .sdata.* .sdata2.*)
  86. *(.gnu.linkonce.s.*)
  87. } >ram AT>flash :ram_init
  88. PROVIDE(__data_start = ADDR(.data));
  89. PROVIDE(__data_source = LOADADDR(.data));
  90. PROVIDE(__data_end = .);
  91. PROVIDE(__data_source_end = LOADADDR(.data) + SIZEOF(.data));
  92. PROVIDE(__edata = __data_end);
  93. PROVIDE(_edata = __data_end);
  94. PROVIDE(edata = __data_end);
  95. PROVIDE(__data_size = __data_end - __data_start);
  96. PROVIDE(__data_source_size = __data_source_end - __data_source);
  97. .bss (NOLOAD) : {
  98. *(.sbss*)
  99. *(.gnu.linkonce.sb.*)
  100. *(.bss .bss.*)
  101. *(.gnu.linkonce.b.*)
  102. *(COMMON)
  103. /* Align the heap */
  104. . = ALIGN(DEFAULT_ALIGNMENT);
  105. __bss_end = .;
  106. } >ram AT>ram :ram
  107. PROVIDE(__bss_start = ADDR(.bss));
  108. PROVIDE(__end = __bss_end);
  109. _end = __bss_end;
  110. PROVIDE(end = __bss_end);
  111. PROVIDE(__bss_size = __bss_end - __bss_start);
  112. /* Make the rest of memory available for heap storage */
  113. PROVIDE(__heap_start = __end);
  114. PROVIDE(__heap_end = __stack - (DEFINED(__stack_size) ? __stack_size : DEFAULT_STACK_SIZE));
  115. PROVIDE(__heap_size = __heap_end - __heap_start);
  116. /* Allow a minimum heap size to be specified */
  117. .heap (NOLOAD) : {
  118. . += (DEFINED(__heap_size_min) ? __heap_size_min : 0);
  119. } >ram :ram
  120. /* Define a stack region to make sure it fits in memory */
  121. .stack (NOLOAD) : {
  122. . += (DEFINED(__stack_size) ? __stack_size : DEFAULT_STACK_SIZE);
  123. } >ram :ram
  124. /* Exception handling frames - keep them but place in flash */
  125. .eh_frame : {
  126. KEEP(*(.eh_frame .eh_frame.*))
  127. } >flash AT>flash :text
  128. /* @C_START@ */
  129. /DISCARD/ : {
  130. *(.note .note.*)
  131. *(.ARM.extab* .gnu.linkonce.armextab.*)
  132. *(.ARM.exidx*)
  133. }
  134. /* @C_END@ */
  135. }