Skip to content

Commit bb794f9

Browse files
earlephilhowerdevyte
authored andcommitted
Move C++ vtables into IRAM, out of HEAP (#4179)
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 bb794f9

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)