esp32.bootloader.ld 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /*
  2. Linker file used to link the bootloader.
  3. */
  4. /* Simplified memory map for the bootloader
  5. The main purpose is to make sure the bootloader can load into main memory
  6. without overwriting itself.
  7. */
  8. MEMORY
  9. {
  10. /* I/O */
  11. dport0_seg (RW) : org = 0x3FF00000, len = 0x10
  12. /* IRAM POOL1, used for APP CPU cache. Bootloader runs from here during the final stage of loading the app because APP CPU is still held in reset, the main app enables APP CPU cache */
  13. iram_loader_seg (RWX) : org = 0x40078000, len = 0x8000 /* 32KB, APP CPU cache */
  14. iram_seg (RWX) : org = 0x40080000, len = 0x10000 /* 64KB, IRAM */
  15. /* 64k at the end of DRAM, after ROM bootloader stack */
  16. dram_seg (RW) : org = 0x3FFF0000, len = 0x10000
  17. }
  18. /* Default entry point: */
  19. ENTRY(call_start_cpu0);
  20. SECTIONS
  21. {
  22. .iram_loader.text :
  23. {
  24. . = ALIGN (16);
  25. _stext = .;
  26. _text_start = ABSOLUTE(.);
  27. *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
  28. *(.iram1 .iram1.*) /* catch stray IRAM_ATTR */
  29. *liblog.a:(.literal .text .literal.* .text.*)
  30. *libgcc.a:(.literal .text .literal.* .text.*)
  31. *libbootloader_support.a:bootloader_utility.o(.literal .text .literal.* .text.*)
  32. *libbootloader_support.a:esp_image_format.o(.literal .text .literal.* .text.*)
  33. *libbootloader_support.a:bootloader_random.o(.literal .text .literal.* .text.*)
  34. *libbootloader_support.a:bootloader_flash.o(.literal .text .literal.* .text.*)
  35. *libbootloader_support.a:flash_partitions.o(.literal .text .literal.* .text.*)
  36. *libbootloader_support.a:bootloader_sha.o(.literal .text .literal.* .text.*)
  37. *(.fini.literal)
  38. *(.fini)
  39. *(.gnu.version)
  40. _text_end = ABSOLUTE(.);
  41. _etext = .;
  42. } > iram_loader_seg
  43. .iram.text :
  44. {
  45. . = ALIGN (16);
  46. *(.entry.text)
  47. *(.init.literal)
  48. *(.init)
  49. } > iram_seg
  50. /* Shared RAM */
  51. .dram0.bss (NOLOAD) :
  52. {
  53. . = ALIGN (8);
  54. _bss_start = ABSOLUTE(.);
  55. *(.dynsbss)
  56. *(.sbss)
  57. *(.sbss.*)
  58. *(.gnu.linkonce.sb.*)
  59. *(.scommon)
  60. *(.sbss2)
  61. *(.sbss2.*)
  62. *(.gnu.linkonce.sb2.*)
  63. *(.dynbss)
  64. *(.bss)
  65. *(.bss.*)
  66. *(.gnu.linkonce.b.*)
  67. *(COMMON)
  68. . = ALIGN (8);
  69. _bss_end = ABSOLUTE(.);
  70. } >dram_seg
  71. .dram0.data :
  72. {
  73. _data_start = ABSOLUTE(.);
  74. *(.data)
  75. *(.data.*)
  76. *(.gnu.linkonce.d.*)
  77. *(.data1)
  78. *(.sdata)
  79. *(.sdata.*)
  80. *(.gnu.linkonce.s.*)
  81. *(.sdata2)
  82. *(.sdata2.*)
  83. *(.gnu.linkonce.s2.*)
  84. *(.jcr)
  85. _data_end = ABSOLUTE(.);
  86. } >dram_seg
  87. .dram0.rodata :
  88. {
  89. _rodata_start = ABSOLUTE(.);
  90. *(.rodata)
  91. *(.rodata.*)
  92. *(.gnu.linkonce.r.*)
  93. *(.rodata1)
  94. __XT_EXCEPTION_TABLE_ = ABSOLUTE(.);
  95. *(.xt_except_table)
  96. *(.gcc_except_table)
  97. *(.gnu.linkonce.e.*)
  98. *(.gnu.version_r)
  99. *(.eh_frame)
  100. . = (. + 3) & ~ 3;
  101. /* C++ constructor and destructor tables, properly ordered: */
  102. __init_array_start = ABSOLUTE(.);
  103. KEEP (*crtbegin.o(.ctors))
  104. KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
  105. KEEP (*(SORT(.ctors.*)))
  106. KEEP (*(.ctors))
  107. __init_array_end = ABSOLUTE(.);
  108. KEEP (*crtbegin.o(.dtors))
  109. KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
  110. KEEP (*(SORT(.dtors.*)))
  111. KEEP (*(.dtors))
  112. /* C++ exception handlers table: */
  113. __XT_EXCEPTION_DESCS_ = ABSOLUTE(.);
  114. *(.xt_except_desc)
  115. *(.gnu.linkonce.h.*)
  116. __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
  117. *(.xt_except_desc_end)
  118. *(.dynamic)
  119. *(.gnu.version_d)
  120. _rodata_end = ABSOLUTE(.);
  121. /* Literals are also RO data. */
  122. _lit4_start = ABSOLUTE(.);
  123. *(*.lit4)
  124. *(.lit4.*)
  125. *(.gnu.linkonce.lit4.*)
  126. _lit4_end = ABSOLUTE(.);
  127. . = ALIGN(4);
  128. _heap_start = ABSOLUTE(.);
  129. } >dram_seg
  130. .iram.text :
  131. {
  132. _stext = .;
  133. _text_start = ABSOLUTE(.);
  134. *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
  135. *(.iram .iram.*) /* catch stray IRAM_ATTR */
  136. *(.fini.literal)
  137. *(.fini)
  138. *(.gnu.version)
  139. _text_end = ABSOLUTE(.);
  140. _etext = .;
  141. } > iram_seg
  142. }