aboutsummaryrefslogtreecommitdiff
path: root/ports/esp32/esp32.custom_common.ld
diff options
context:
space:
mode:
Diffstat (limited to 'ports/esp32/esp32.custom_common.ld')
-rw-r--r--ports/esp32/esp32.custom_common.ld215
1 files changed, 215 insertions, 0 deletions
diff --git a/ports/esp32/esp32.custom_common.ld b/ports/esp32/esp32.custom_common.ld
new file mode 100644
index 000000000..45242f9af
--- /dev/null
+++ b/ports/esp32/esp32.custom_common.ld
@@ -0,0 +1,215 @@
+/* Default entry point: */
+ENTRY(call_start_cpu0);
+
+SECTIONS
+{
+ /* RTC fast memory holds RTC wake stub code,
+ including from any source file named rtc_wake_stub*.c
+ */
+ .rtc.text :
+ {
+ . = ALIGN(4);
+ *(.rtc.literal .rtc.text)
+ *rtc_wake_stub*.o(.literal .text .literal.* .text.*)
+ } >rtc_iram_seg
+
+ /* RTC slow memory holds RTC wake stub
+ data/rodata, including from any source file
+ named rtc_wake_stub*.c
+ */
+ .rtc.data :
+ {
+ _rtc_data_start = ABSOLUTE(.);
+ *(.rtc.data)
+ *(.rtc.rodata)
+ *rtc_wake_stub*.o(.data .rodata .data.* .rodata.* .bss .bss.*)
+ _rtc_data_end = ABSOLUTE(.);
+ } > rtc_slow_seg
+
+ /* RTC bss, from any source file named rtc_wake_stub*.c */
+ .rtc.bss (NOLOAD) :
+ {
+ _rtc_bss_start = ABSOLUTE(.);
+ *rtc_wake_stub*.o(.bss .bss.*)
+ *rtc_wake_stub*.o(COMMON)
+ _rtc_bss_end = ABSOLUTE(.);
+ } > rtc_slow_seg
+
+ /* Send .iram0 code to iram */
+ .iram0.vectors :
+ {
+ /* Vectors go to IRAM */
+ _init_start = ABSOLUTE(.);
+ /* Vectors according to builds/RF-2015.2-win32/esp108_v1_2_s5_512int_2/config.html */
+ . = 0x0;
+ KEEP(*(.WindowVectors.text));
+ . = 0x180;
+ KEEP(*(.Level2InterruptVector.text));
+ . = 0x1c0;
+ KEEP(*(.Level3InterruptVector.text));
+ . = 0x200;
+ KEEP(*(.Level4InterruptVector.text));
+ . = 0x240;
+ KEEP(*(.Level5InterruptVector.text));
+ . = 0x280;
+ KEEP(*(.DebugExceptionVector.text));
+ . = 0x2c0;
+ KEEP(*(.NMIExceptionVector.text));
+ . = 0x300;
+ KEEP(*(.KernelExceptionVector.text));
+ . = 0x340;
+ KEEP(*(.UserExceptionVector.text));
+ . = 0x3C0;
+ KEEP(*(.DoubleExceptionVector.text));
+ . = 0x400;
+ *(.*Vector.literal)
+
+ *(.UserEnter.literal);
+ *(.UserEnter.text);
+ . = ALIGN (16);
+ *(.entry.text)
+ *(.init.literal)
+ *(.init)
+ _init_end = ABSOLUTE(.);
+
+ /* This goes here, not at top of linker script, so addr2line finds it last,
+ and uses it in preference to the first symbol in IRAM */
+ _iram_start = ABSOLUTE(0);
+ } > iram0_0_seg
+
+ .iram0.text :
+ {
+ /* Code marked as runnning out of IRAM */
+ _iram_text_start = ABSOLUTE(.);
+ *(.iram1 .iram1.*)
+ *freertos/*(.literal .text .literal.* .text.*)
+ *heap/multi_heap.o(.literal .text .literal.* .text.*)
+ *heap/multi_heap_poisoning.o(.literal .text .literal.* .text.*)
+ *esp32/panic.o(.literal .text .literal.* .text.*)
+ *esp32/core_dump.o(.literal .text .literal.* .text.*)
+ *app_trace/*(.literal .text .literal.* .text.*)
+ *xtensa-debug-module/eri.o(.literal .text .literal.* .text.*)
+ *esp32/app_trace.o(.literal .text .literal.* .text.*)
+ *libphy.a:(.literal .text .literal.* .text.*)
+ *librtc.a:(.literal .text .literal.* .text.*)
+ *libsoc.a:(.literal .text .literal.* .text.*)
+ *libhal.a:(.literal .text .literal.* .text.*)
+ *libgcc.a:lib2funcs.o(.literal .text .literal.* .text.*)
+ *spi_flash/spi_flash_rom_patch.o(.literal .text .literal.* .text.*)
+ *py/scheduler.o*(.literal .text .literal.* .text.*)
+ _iram_text_end = ABSOLUTE(.);
+ } > iram0_0_seg
+
+ .dram0.data :
+ {
+ _data_start = ABSOLUTE(.);
+ *(.data)
+ *(.data.*)
+ *(.gnu.linkonce.d.*)
+ *(.data1)
+ *(.sdata)
+ *(.sdata.*)
+ *(.gnu.linkonce.s.*)
+ *(.sdata2)
+ *(.sdata2.*)
+ *(.gnu.linkonce.s2.*)
+ *(.jcr)
+ *(.dram1 .dram1.*)
+ *esp32/panic.o(.rodata .rodata.*)
+ *libphy.a:(.rodata .rodata.*)
+ *app_trace/app_trace.o:(.rodata .rodata.*)
+ *heap/multi_heap.o(.rodata .rodata.*)
+ *heap/multi_heap_poisoning.o(.rodata .rodata.*)
+ _data_end = ABSOLUTE(.);
+ . = ALIGN(4);
+ } >dram0_0_seg
+
+ /* Shared RAM */
+ .dram0.bss (NOLOAD) :
+ {
+ . = ALIGN (8);
+ _bss_start = ABSOLUTE(.);
+ *(.dynsbss)
+ *(.sbss)
+ *(.sbss.*)
+ *(.gnu.linkonce.sb.*)
+ *(.scommon)
+ *(.sbss2)
+ *(.sbss2.*)
+ *(.gnu.linkonce.sb2.*)
+ *(.dynbss)
+ *(.bss)
+ *(.bss.*)
+ *(.share.mem)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN (8);
+ _bss_end = ABSOLUTE(.);
+ _heap_start = ABSOLUTE(.);
+ } >dram0_0_seg
+
+ .flash.rodata :
+ {
+ _rodata_start = ABSOLUTE(.);
+ *(.rodata)
+ *(.rodata.*)
+ *(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
+ *(.gnu.linkonce.r.*)
+ *(.rodata1)
+ __XT_EXCEPTION_TABLE_ = ABSOLUTE(.);
+ *(.xt_except_table)
+ *(.gcc_except_table .gcc_except_table.*)
+ *(.gnu.linkonce.e.*)
+ *(.gnu.version_r)
+ . = (. + 3) & ~ 3;
+ __eh_frame = ABSOLUTE(.);
+ KEEP(*(.eh_frame))
+ . = (. + 7) & ~ 3;
+ /* C++ constructor and destructor tables, properly ordered: */
+ __init_array_start = ABSOLUTE(.);
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ __init_array_end = ABSOLUTE(.);
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ /* C++ exception handlers table: */
+ __XT_EXCEPTION_DESCS_ = ABSOLUTE(.);
+ *(.xt_except_desc)
+ *(.gnu.linkonce.h.*)
+ __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
+ *(.xt_except_desc_end)
+ *(.dynamic)
+ *(.gnu.version_d)
+ _rodata_end = ABSOLUTE(.);
+ /* Literals are also RO data. */
+ _lit4_start = ABSOLUTE(.);
+ *(*.lit4)
+ *(.lit4.*)
+ *(.gnu.linkonce.lit4.*)
+ _lit4_end = ABSOLUTE(.);
+ . = ALIGN(4);
+ } >drom0_0_seg
+
+ .flash.text :
+ {
+ _stext = .;
+ _text_start = ABSOLUTE(.);
+ *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+ *(.irom0.text) /* catch stray ICACHE_RODATA_ATTR */
+ *(.fini.literal)
+ *(.fini)
+ *(.gnu.version)
+ _text_end = ABSOLUTE(.);
+ _etext = .;
+
+ /* Similar to _iram_start, this symbol goes here so it is
+ resolved by addr2line in preference to the first symbol in
+ the flash.text segment.
+ */
+ _flash_cache_start = ABSOLUTE(0);
+ } >iram0_2_seg
+}