esp32.bootloader.ld 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. We can abuse it in bootloader because APP CPU is still held in reset, the main app enables APP CPU cache */
  13. iram_seg (RWX) : org = 0x40078000, len = 0x8000
  14. /* 64k at the end of DRAM, after ROM bootloader stack */
  15. dram_seg (RW) : org = 0x3FFF0000, len = 0x10000
  16. }
  17. /* Default entry point: */
  18. ENTRY(call_start_cpu0);
  19. SECTIONS
  20. {
  21. .iram1.text :
  22. {
  23. . = ALIGN (16);
  24. *(.entry.text)
  25. *(.init.literal)
  26. *(.init)
  27. } > iram_seg
  28. /* Shared RAM */
  29. .dram0.bss (NOLOAD) :
  30. {
  31. . = ALIGN (8);
  32. _bss_start = ABSOLUTE(.);
  33. *(.dynsbss)
  34. *(.sbss)
  35. *(.sbss.*)
  36. *(.gnu.linkonce.sb.*)
  37. *(.scommon)
  38. *(.sbss2)
  39. *(.sbss2.*)
  40. *(.gnu.linkonce.sb2.*)
  41. *(.dynbss)
  42. *(.bss)
  43. *(.bss.*)
  44. *(.gnu.linkonce.b.*)
  45. *(COMMON)
  46. . = ALIGN (8);
  47. _bss_end = ABSOLUTE(.);
  48. } >dram_seg
  49. .dram0.data :
  50. {
  51. _data_start = ABSOLUTE(.);
  52. *(.data)
  53. *(.data.*)
  54. *(.gnu.linkonce.d.*)
  55. *(.data1)
  56. *(.sdata)
  57. *(.sdata.*)
  58. *(.gnu.linkonce.s.*)
  59. *(.sdata2)
  60. *(.sdata2.*)
  61. *(.gnu.linkonce.s2.*)
  62. *(.jcr)
  63. _data_end = ABSOLUTE(.);
  64. } >dram_seg
  65. .dram0.rodata :
  66. {
  67. _rodata_start = ABSOLUTE(.);
  68. *(.rodata)
  69. *(.rodata.*)
  70. *(.gnu.linkonce.r.*)
  71. *(.rodata1)
  72. __XT_EXCEPTION_TABLE_ = ABSOLUTE(.);
  73. *(.xt_except_table)
  74. *(.gcc_except_table)
  75. *(.gnu.linkonce.e.*)
  76. *(.gnu.version_r)
  77. *(.eh_frame)
  78. . = (. + 3) & ~ 3;
  79. /* C++ constructor and destructor tables, properly ordered: */
  80. __init_array_start = ABSOLUTE(.);
  81. KEEP (*crtbegin.o(.ctors))
  82. KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
  83. KEEP (*(SORT(.ctors.*)))
  84. KEEP (*(.ctors))
  85. __init_array_end = ABSOLUTE(.);
  86. KEEP (*crtbegin.o(.dtors))
  87. KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
  88. KEEP (*(SORT(.dtors.*)))
  89. KEEP (*(.dtors))
  90. /* C++ exception handlers table: */
  91. __XT_EXCEPTION_DESCS_ = ABSOLUTE(.);
  92. *(.xt_except_desc)
  93. *(.gnu.linkonce.h.*)
  94. __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
  95. *(.xt_except_desc_end)
  96. *(.dynamic)
  97. *(.gnu.version_d)
  98. _rodata_end = ABSOLUTE(.);
  99. /* Literals are also RO data. */
  100. _lit4_start = ABSOLUTE(.);
  101. *(*.lit4)
  102. *(.lit4.*)
  103. *(.gnu.linkonce.lit4.*)
  104. _lit4_end = ABSOLUTE(.);
  105. . = ALIGN(4);
  106. _heap_start = ABSOLUTE(.);
  107. } >dram_seg
  108. .iram.text :
  109. {
  110. _stext = .;
  111. _text_start = ABSOLUTE(.);
  112. *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
  113. *(.iram1 .iram1.*) /* catch stray IRAM_ATTR */
  114. *(.fini.literal)
  115. *(.fini)
  116. *(.gnu.version)
  117. _text_end = ABSOLUTE(.);
  118. _etext = .;
  119. } > iram_seg
  120. }