Import bootloader from esp-idf v3
[apeos.git] / components / bootloader / subproject / main / esp32.bootloader.ld
blob54fe1a9a3c0d778fa62333784844d7dc71bada7d
1 /*
2 Linker file used to link the bootloader.
3 */
6 /* Simplified memory map for the bootloader
8    The main purpose is to make sure the bootloader can load into main memory
9    without overwriting itself.
11 MEMORY
13   /* I/O */
14   dport0_seg (RW) :                     org = 0x3FF00000, len = 0x10
15   /* 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 */
16   iram_seg (RWX) :           org = 0x40078000, len = 0x8000
17   /* 64k at the end of DRAM, after ROM bootloader stack */
18   dram_seg (RW) :                       org = 0x3FFF0000, len = 0x10000
21 /*  Default entry point:  */
22 ENTRY(call_start_cpu0);
25 SECTIONS
27   .iram1.text :
28   {
29     . = ALIGN (16);
30     *(.entry.text)
31     *(.init.literal)
32     *(.init)
33   } > iram_seg
36   /* Shared RAM */
37   .dram0.bss (NOLOAD) :
38   {
39     . = ALIGN (8);
40     _bss_start = ABSOLUTE(.);
41     *(.dynsbss)
42     *(.sbss)
43     *(.sbss.*)
44     *(.gnu.linkonce.sb.*)
45     *(.scommon)
46     *(.sbss2)
47     *(.sbss2.*)
48     *(.gnu.linkonce.sb2.*)
49     *(.dynbss)
50     *(.bss)
51     *(.bss.*)
52     *(.gnu.linkonce.b.*)
53     *(COMMON)
54     . = ALIGN (8);
55     _bss_end = ABSOLUTE(.);
56   } >dram_seg
58   .dram0.data :
59   {
60     _data_start = ABSOLUTE(.);
61     *(.data)
62     *(.data.*)
63     *(.gnu.linkonce.d.*)
64     *(.data1)
65     *(.sdata)
66     *(.sdata.*)
67     *(.gnu.linkonce.s.*)
68     *(.sdata2)
69     *(.sdata2.*)
70     *(.gnu.linkonce.s2.*)
71     *(.jcr)
72     _data_end = ABSOLUTE(.);
73   } >dram_seg
75   .dram0.rodata :
76   {
77     _rodata_start = ABSOLUTE(.);
78     *(.rodata)
79     *(.rodata.*)
80     *(.gnu.linkonce.r.*)
81     *(.rodata1)
82     __XT_EXCEPTION_TABLE_ = ABSOLUTE(.);
83     *(.xt_except_table)
84     *(.gcc_except_table)
85     *(.gnu.linkonce.e.*)
86     *(.gnu.version_r)
87     *(.eh_frame)
88     . = (. + 3) & ~ 3;
89     /*  C++ constructor and destructor tables, properly ordered:  */
90     __init_array_start = ABSOLUTE(.);
91     KEEP (*crtbegin.o(.ctors))
92     KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
93     KEEP (*(SORT(.ctors.*)))
94     KEEP (*(.ctors))
95     __init_array_end = ABSOLUTE(.);
96     KEEP (*crtbegin.o(.dtors))
97     KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
98     KEEP (*(SORT(.dtors.*)))
99     KEEP (*(.dtors))
100     /*  C++ exception handlers table:  */
101     __XT_EXCEPTION_DESCS_ = ABSOLUTE(.);
102     *(.xt_except_desc)
103     *(.gnu.linkonce.h.*)
104     __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
105     *(.xt_except_desc_end)
106     *(.dynamic)
107     *(.gnu.version_d)
108     _rodata_end = ABSOLUTE(.);
109         /* Literals are also RO data. */
110     _lit4_start = ABSOLUTE(.);
111     *(*.lit4)
112     *(.lit4.*)
113     *(.gnu.linkonce.lit4.*)
114     _lit4_end = ABSOLUTE(.);
115     . = ALIGN(4);
116     _heap_start = ABSOLUTE(.);
117   } >dram_seg
119   .iram.text :
120   {
121     _stext = .;
122     _text_start = ABSOLUTE(.);
123     *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
124     *(.iram1 .iram1.*) /* catch stray IRAM_ATTR */
125     *(.fini.literal)
126     *(.fini)
127     *(.gnu.version)
128     _text_end = ABSOLUTE(.);
129     _etext = .;
130   } > iram_seg