Skip to content

Commit e7d98a4

Browse files
Move C++ vtables into IRAM, out of HEAP
GCC places vtables in .rodata, with a mangled name of "_ZTV*." Because these are simply address jump tables, there is no need to place them in RAM. Instead, have the linker place them in the .text (aka IRAM) section. This will free up a variable amount of heap space, depending on the number of classes with virtual functions used in any particular project.
1 parent 074402e commit e7d98a4

File tree

1 file changed

+67
-66
lines changed

1 file changed

+67
-66
lines changed

tools/sdk/ld/eagle.app.v6.common.ld

+67-66
Original file line numberDiff line numberDiff line change
@@ -84,72 +84,6 @@ SECTIONS
8484
_data_end = ABSOLUTE(.);
8585
} >dram0_0_seg :dram0_0_phdr
8686

87-
.rodata : ALIGN(4)
88-
{
89-
_rodata_start = ABSOLUTE(.);
90-
*(.sdk.version)
91-
*(.rodata)
92-
*(.rodata.*)
93-
*(.gnu.linkonce.r.*)
94-
*(.rodata1)
95-
__XT_EXCEPTION_TABLE__ = ABSOLUTE(.);
96-
*(.xt_except_table)
97-
*(.gcc_except_table)
98-
*(.gnu.linkonce.e.*)
99-
*(.gnu.version_r)
100-
*(.eh_frame)
101-
. = (. + 3) & ~ 3;
102-
/* C++ constructor and destructor tables, properly ordered: */
103-
__init_array_start = ABSOLUTE(.);
104-
KEEP (*crtbegin.o(.ctors))
105-
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
106-
KEEP (*(SORT(.ctors.*)))
107-
KEEP (*(.ctors))
108-
__init_array_end = ABSOLUTE(.);
109-
KEEP (*crtbegin.o(.dtors))
110-
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
111-
KEEP (*(SORT(.dtors.*)))
112-
KEEP (*(.dtors))
113-
/* C++ exception handlers table: */
114-
__XT_EXCEPTION_DESCS__ = ABSOLUTE(.);
115-
*(.xt_except_desc)
116-
*(.gnu.linkonce.h.*)
117-
__XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
118-
*(.xt_except_desc_end)
119-
*(.dynamic)
120-
*(.gnu.version_d)
121-
. = ALIGN(4); /* this table MUST be 4-byte aligned */
122-
_bss_table_start = ABSOLUTE(.);
123-
LONG(_bss_start)
124-
LONG(_bss_end)
125-
_bss_table_end = ABSOLUTE(.);
126-
_rodata_end = ABSOLUTE(.);
127-
} >dram0_0_seg :dram0_0_phdr
128-
129-
.bss ALIGN(8) (NOLOAD) : ALIGN(4)
130-
{
131-
. = ALIGN (8);
132-
_bss_start = ABSOLUTE(.);
133-
*(.dynsbss)
134-
*(.sbss)
135-
*(.sbss.*)
136-
*(.gnu.linkonce.sb.*)
137-
*(.scommon)
138-
*(.sbss2)
139-
*(.sbss2.*)
140-
*(.gnu.linkonce.sb2.*)
141-
*(.dynbss)
142-
*(.bss)
143-
*(.bss.*)
144-
*(.gnu.linkonce.b.*)
145-
*(COMMON)
146-
. = ALIGN (8);
147-
_bss_end = ABSOLUTE(.);
148-
_heap_start = ABSOLUTE(.);
149-
/* _stack_sentry = ALIGN(0x8); */
150-
} >dram0_0_seg :dram0_0_bss_phdr
151-
/* __stack = 0x3ffc8000; */
152-
15387
.irom0.text : ALIGN(4)
15488
{
15589
_irom0_text_start = ABSOLUTE(.);
@@ -231,6 +165,7 @@ SECTIONS
231165
*(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
232166
*.cpp.o(.iram.text)
233167
*.c.o(.iram.text)
168+
*(.rodata._ZTV*) /* C++ vtables */
234169
/* PlatformIO */
235170
/* framework */
236171
*.pioenvs\\*\\lib*.a:(.iram.text)
@@ -249,6 +184,72 @@ SECTIONS
249184
_etext = .;
250185
} >iram1_0_seg :iram1_0_phdr
251186

187+
.rodata : ALIGN(4)
188+
{
189+
_rodata_start = ABSOLUTE(.);
190+
*(.sdk.version)
191+
*(.rodata)
192+
*(.rodata.*)
193+
*(.gnu.linkonce.r.*)
194+
*(.rodata1)
195+
__XT_EXCEPTION_TABLE__ = ABSOLUTE(.);
196+
*(.xt_except_table)
197+
*(.gcc_except_table)
198+
*(.gnu.linkonce.e.*)
199+
*(.gnu.version_r)
200+
*(.eh_frame)
201+
. = (. + 3) & ~ 3;
202+
/* C++ constructor and destructor tables, properly ordered: */
203+
__init_array_start = ABSOLUTE(.);
204+
KEEP (*crtbegin.o(.ctors))
205+
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
206+
KEEP (*(SORT(.ctors.*)))
207+
KEEP (*(.ctors))
208+
__init_array_end = ABSOLUTE(.);
209+
KEEP (*crtbegin.o(.dtors))
210+
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
211+
KEEP (*(SORT(.dtors.*)))
212+
KEEP (*(.dtors))
213+
/* C++ exception handlers table: */
214+
__XT_EXCEPTION_DESCS__ = ABSOLUTE(.);
215+
*(.xt_except_desc)
216+
*(.gnu.linkonce.h.*)
217+
__XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
218+
*(.xt_except_desc_end)
219+
*(.dynamic)
220+
*(.gnu.version_d)
221+
. = ALIGN(4); /* this table MUST be 4-byte aligned */
222+
_bss_table_start = ABSOLUTE(.);
223+
LONG(_bss_start)
224+
LONG(_bss_end)
225+
_bss_table_end = ABSOLUTE(.);
226+
_rodata_end = ABSOLUTE(.);
227+
} >dram0_0_seg :dram0_0_phdr
228+
229+
.bss ALIGN(8) (NOLOAD) : ALIGN(4)
230+
{
231+
. = ALIGN (8);
232+
_bss_start = ABSOLUTE(.);
233+
*(.dynsbss)
234+
*(.sbss)
235+
*(.sbss.*)
236+
*(.gnu.linkonce.sb.*)
237+
*(.scommon)
238+
*(.sbss2)
239+
*(.sbss2.*)
240+
*(.gnu.linkonce.sb2.*)
241+
*(.dynbss)
242+
*(.bss)
243+
*(.bss.*)
244+
*(.gnu.linkonce.b.*)
245+
*(COMMON)
246+
. = ALIGN (8);
247+
_bss_end = ABSOLUTE(.);
248+
_heap_start = ABSOLUTE(.);
249+
/* _stack_sentry = ALIGN(0x8); */
250+
} >dram0_0_seg :dram0_0_bss_phdr
251+
/* __stack = 0x3ffc8000; */
252+
252253
.lit4 : ALIGN(4)
253254
{
254255
_lit4_start = ABSOLUTE(.);

0 commit comments

Comments
 (0)