mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 03:00:34 +03:00
feat(esp_libc): make picolibc default libc
This commit is contained in:
@@ -69,7 +69,9 @@
|
||||
* And so forth...
|
||||
*/
|
||||
*(.rela.*)
|
||||
#if CONFIG_LIBC_NEWLIB
|
||||
*(.got .got.plt) /* TODO: GCC-382 */
|
||||
#endif
|
||||
#if !EH_FRAME_LINKING_ENABLED
|
||||
*(.eh_frame_hdr)
|
||||
*(.eh_frame)
|
||||
|
||||
@@ -360,12 +360,14 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
ALIGNED_SYMBOL(4, __init_array_start)
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -388,12 +390,24 @@ SECTIONS
|
||||
|
||||
/* TLS data. */
|
||||
ALIGNED_SYMBOL(4, _thread_local_start)
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata)
|
||||
*(.tdata.*)
|
||||
*(.tbss)
|
||||
*(.tbss.*)
|
||||
_thread_local_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
_flash_rodata_align = ALIGNOF(.flash.rodata);
|
||||
|
||||
|
||||
@@ -188,6 +188,9 @@ SECTIONS
|
||||
|
||||
mapping[flash_rodata]
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
*(.got .got.plt) /* TODO: GCC-439 */
|
||||
#endif
|
||||
*(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
|
||||
*(.gnu.linkonce.r.*)
|
||||
*(.rodata1)
|
||||
@@ -199,12 +202,14 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
ALIGNED_SYMBOL(4, __init_array_start)
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -254,24 +259,42 @@ SECTIONS
|
||||
|
||||
.flash.tdata :
|
||||
{
|
||||
/* Keep tdata and tbss sections contiguous (no gaps between them).
|
||||
* The TLS runtime code calculates offsets assuming these sections are
|
||||
* adjacent. Gaps would cause incorrect address calculations, leading
|
||||
* to accessing wrong memory.
|
||||
*
|
||||
* Storing all TLS structures in flash increases binary size, but avoids
|
||||
* runtime issues and reduces TLS allocations on the stack.
|
||||
*/
|
||||
/* tdata sections */
|
||||
_thread_local_data_start = ABSOLUTE(.);
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.tbss));
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.tbss)
|
||||
|
||||
.flash.tbss (NOLOAD) :
|
||||
{
|
||||
/* tbss sections */
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.rodata_noload));
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.rodata_noload)
|
||||
ASSERT(_thread_local_data_end == _thread_local_bss_start,
|
||||
"tdata and tbss must be contiguous.")
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
/**
|
||||
* This section contains all the rodata that is not used
|
||||
@@ -284,7 +307,7 @@ SECTIONS
|
||||
* driver to maintain the virtual address.
|
||||
* NOLOAD rodata may not be included in this section.
|
||||
*/
|
||||
_rodata_reserved_end = ADDR(.flash.tbss);
|
||||
_rodata_reserved_end = .;
|
||||
|
||||
mapping[rodata_noload]
|
||||
} > default_rodata_seg
|
||||
|
||||
@@ -310,6 +310,9 @@ SECTIONS
|
||||
|
||||
mapping[flash_rodata]
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
*(.got .got.plt) /* TODO: GCC-439 */
|
||||
#endif
|
||||
*(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
|
||||
*(.gnu.linkonce.r.*)
|
||||
*(.rodata1)
|
||||
@@ -321,12 +324,14 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
ALIGNED_SYMBOL(4, __init_array_start)
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -376,24 +381,42 @@ SECTIONS
|
||||
|
||||
.flash.tdata :
|
||||
{
|
||||
/* Keep tdata and tbss sections contiguous (no gaps between them).
|
||||
* The TLS runtime code calculates offsets assuming these sections are
|
||||
* adjacent. Gaps would cause incorrect address calculations, leading
|
||||
* to accessing wrong memory.
|
||||
*
|
||||
* Storing all TLS structures in flash increases binary size, but avoids
|
||||
* runtime issues and reduces TLS allocations on the stack.
|
||||
*/
|
||||
/* tdata sections */
|
||||
_thread_local_data_start = ABSOLUTE(.);
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.tbss));
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.tbss)
|
||||
|
||||
.flash.tbss (NOLOAD) :
|
||||
{
|
||||
/* tbss sections */
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.rodata_noload));
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.rodata_noload)
|
||||
ASSERT(_thread_local_data_end == _thread_local_bss_start,
|
||||
"tdata and tbss must be contiguous.")
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
/**
|
||||
* This section contains all the rodata that is not used
|
||||
@@ -406,7 +429,7 @@ SECTIONS
|
||||
* driver to maintain the virtual address.
|
||||
* NOLOAD rodata may not be included in this section.
|
||||
*/
|
||||
_rodata_reserved_end = ADDR(.flash.tbss);
|
||||
_rodata_reserved_end = .;
|
||||
|
||||
mapping[rodata_noload]
|
||||
} > default_rodata_seg
|
||||
|
||||
@@ -359,6 +359,9 @@ SECTIONS
|
||||
|
||||
mapping[flash_rodata]
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
*(.got .got.plt) /* TODO: GCC-439 */
|
||||
#endif
|
||||
*(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
|
||||
*(.gnu.linkonce.r.*)
|
||||
*(.rodata1)
|
||||
@@ -370,12 +373,14 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
ALIGNED_SYMBOL(4, __init_array_start)
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -425,32 +430,48 @@ SECTIONS
|
||||
|
||||
.flash.tdata :
|
||||
{
|
||||
/* Keep tdata and tbss sections contiguous (no gaps between them).
|
||||
* The TLS runtime code calculates offsets assuming these sections are
|
||||
* adjacent. Gaps would cause incorrect address calculations, leading
|
||||
* to accessing wrong memory.
|
||||
*
|
||||
* Storing all TLS structures in flash increases binary size, but avoids
|
||||
* runtime issues and reduces TLS allocations on the stack.
|
||||
*/
|
||||
/* tdata sections */
|
||||
_thread_local_data_start = ABSOLUTE(.);
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.tbss));
|
||||
/* tbss sections */
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.rodata_noload));
|
||||
#if CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION
|
||||
/* Align the end of flash rodata region as per PMP granularity to allow using the
|
||||
* page alignment gap created while mapping the flash region into the PSRAM memory.
|
||||
*/
|
||||
. = ALIGN(_esp_pmp_align_size);
|
||||
#endif // CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION
|
||||
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.tbss)
|
||||
|
||||
.flash.tbss (NOLOAD) :
|
||||
{
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.rodata_noload)
|
||||
ASSERT(_thread_local_data_end == _thread_local_bss_start,
|
||||
"tdata and tbss must be contiguous.")
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
/**
|
||||
* This section contains all the rodata that is not used
|
||||
@@ -463,7 +484,7 @@ SECTIONS
|
||||
* driver to maintain the virtual address.
|
||||
* NOLOAD rodata may not be included in this section.
|
||||
*/
|
||||
_rodata_reserved_end = ADDR(.flash.tbss);
|
||||
_rodata_reserved_end = .;
|
||||
|
||||
mapping[rodata_noload]
|
||||
} > default_rodata_seg
|
||||
|
||||
@@ -355,6 +355,9 @@ SECTIONS
|
||||
|
||||
mapping[flash_rodata]
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
*(.got .got.plt) /* TODO: GCC-439 */
|
||||
#endif
|
||||
*(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
|
||||
*(.gnu.linkonce.r.*)
|
||||
*(.rodata1)
|
||||
@@ -366,12 +369,14 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
ALIGNED_SYMBOL(4, __init_array_start)
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -421,24 +426,42 @@ SECTIONS
|
||||
|
||||
.flash.tdata :
|
||||
{
|
||||
/* Keep tdata and tbss sections contiguous (no gaps between them).
|
||||
* The TLS runtime code calculates offsets assuming these sections are
|
||||
* adjacent. Gaps would cause incorrect address calculations, leading
|
||||
* to accessing wrong memory.
|
||||
*
|
||||
* Storing all TLS structures in flash increases binary size, but avoids
|
||||
* runtime issues and reduces TLS allocations on the stack.
|
||||
*/
|
||||
/* tdata sections */
|
||||
_thread_local_data_start = ABSOLUTE(.);
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.tbss));
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.tbss)
|
||||
|
||||
.flash.tbss (NOLOAD) :
|
||||
{
|
||||
/* tbss sections */
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.rodata_noload));
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.rodata_noload)
|
||||
ASSERT(_thread_local_data_end == _thread_local_bss_start,
|
||||
"tdata and tbss must be contiguous.")
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
/**
|
||||
* This section contains all the rodata that is not used
|
||||
@@ -451,7 +474,7 @@ SECTIONS
|
||||
* driver to maintain the virtual address.
|
||||
* NOLOAD rodata may not be included in this section.
|
||||
*/
|
||||
_rodata_reserved_end = ADDR(.flash.tbss);
|
||||
_rodata_reserved_end = .;
|
||||
|
||||
mapping[rodata_noload]
|
||||
} > default_rodata_seg
|
||||
|
||||
@@ -217,6 +217,9 @@ SECTIONS
|
||||
|
||||
mapping[flash_rodata]
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
*(.got .got.plt) /* TODO: GCC-439 */
|
||||
#endif
|
||||
*(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
|
||||
*(.gnu.linkonce.r.*)
|
||||
*(.rodata1)
|
||||
@@ -228,6 +231,7 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
|
||||
@@ -235,6 +239,7 @@ SECTIONS
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -284,32 +289,48 @@ SECTIONS
|
||||
|
||||
.flash.tdata :
|
||||
{
|
||||
/* Keep tdata and tbss sections contiguous (no gaps between them).
|
||||
* The TLS runtime code calculates offsets assuming these sections are
|
||||
* adjacent. Gaps would cause incorrect address calculations, leading
|
||||
* to accessing wrong memory.
|
||||
*
|
||||
* Storing all TLS structures in flash increases binary size, but avoids
|
||||
* runtime issues and reduces TLS allocations on the stack.
|
||||
*/
|
||||
/* tdata sections */
|
||||
_thread_local_data_start = ABSOLUTE(.);
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.tbss));
|
||||
/* tbss sections */
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.rodata_noload));
|
||||
#if CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION
|
||||
/* Align the end of flash rodata region as per PMP granularity to allow using the
|
||||
* page alignment gap created while mapping the flash region into the PSRAM memory.
|
||||
*/
|
||||
. = ALIGN(_esp_pmp_align_size);
|
||||
#endif // CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION
|
||||
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.tbss)
|
||||
|
||||
.flash.tbss (NOLOAD) :
|
||||
{
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.rodata_noload)
|
||||
ASSERT(_thread_local_data_end == _thread_local_bss_start,
|
||||
"tdata and tbss must be contiguous.")
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
/**
|
||||
* This section contains all the rodata that is not used
|
||||
@@ -322,7 +343,7 @@ SECTIONS
|
||||
* driver to maintain the virtual address.
|
||||
* NOLOAD rodata may not be included in this section.
|
||||
*/
|
||||
_rodata_reserved_end = ADDR(.flash.tbss);
|
||||
_rodata_reserved_end = .;
|
||||
|
||||
mapping[rodata_noload]
|
||||
} > default_rodata_seg
|
||||
|
||||
@@ -357,6 +357,9 @@ SECTIONS
|
||||
|
||||
mapping[flash_rodata]
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
*(.got .got.plt) /* TODO: GCC-439 */
|
||||
#endif
|
||||
*(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
|
||||
*(.gnu.linkonce.r.*)
|
||||
*(.rodata1)
|
||||
@@ -368,12 +371,14 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
ALIGNED_SYMBOL(4, __init_array_start)
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -423,24 +428,42 @@ SECTIONS
|
||||
|
||||
.flash.tdata :
|
||||
{
|
||||
/* Keep tdata and tbss sections contiguous (no gaps between them).
|
||||
* The TLS runtime code calculates offsets assuming these sections are
|
||||
* adjacent. Gaps would cause incorrect address calculations, leading
|
||||
* to accessing wrong memory.
|
||||
*
|
||||
* Storing all TLS structures in flash increases binary size, but avoids
|
||||
* runtime issues and reduces TLS allocations on the stack.
|
||||
*/
|
||||
/* tdata sections */
|
||||
_thread_local_data_start = ABSOLUTE(.);
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.tbss));
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.tbss)
|
||||
|
||||
.flash.tbss (NOLOAD) :
|
||||
{
|
||||
/* tbss sections */
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.rodata_noload));
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.rodata_noload)
|
||||
ASSERT(_thread_local_data_end == _thread_local_bss_start,
|
||||
"tdata and tbss must be contiguous.")
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
/**
|
||||
* This section contains all the rodata that is not used
|
||||
@@ -453,7 +476,7 @@ SECTIONS
|
||||
* driver to maintain the virtual address.
|
||||
* NOLOAD rodata may not be included in this section.
|
||||
*/
|
||||
_rodata_reserved_end = ADDR(.flash.tbss);
|
||||
_rodata_reserved_end = .;
|
||||
|
||||
mapping[rodata_noload]
|
||||
} > default_rodata_seg
|
||||
|
||||
@@ -346,6 +346,9 @@ SECTIONS
|
||||
|
||||
mapping[flash_rodata]
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
*(.got .got.plt) /* TODO: GCC-439 */
|
||||
#endif
|
||||
*(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
|
||||
*(.gnu.linkonce.r.*)
|
||||
*(.rodata1)
|
||||
@@ -357,12 +360,14 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
ALIGNED_SYMBOL(4, __init_array_start)
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -412,24 +417,42 @@ SECTIONS
|
||||
|
||||
.flash.tdata :
|
||||
{
|
||||
/* Keep tdata and tbss sections contiguous (no gaps between them).
|
||||
* The TLS runtime code calculates offsets assuming these sections are
|
||||
* adjacent. Gaps would cause incorrect address calculations, leading
|
||||
* to accessing wrong memory.
|
||||
*
|
||||
* Storing all TLS structures in flash increases binary size, but avoids
|
||||
* runtime issues and reduces TLS allocations on the stack.
|
||||
*/
|
||||
/* tdata sections */
|
||||
_thread_local_data_start = ABSOLUTE(.);
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.tbss));
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.tbss)
|
||||
|
||||
.flash.tbss (NOLOAD) :
|
||||
{
|
||||
/* tbss sections */
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.rodata_noload));
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.rodata_noload)
|
||||
ASSERT(_thread_local_data_end == _thread_local_bss_start,
|
||||
"tdata and tbss must be contiguous.")
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
/**
|
||||
* This section contains all the rodata that is not used
|
||||
@@ -442,7 +465,7 @@ SECTIONS
|
||||
* driver to maintain the virtual address.
|
||||
* NOLOAD rodata may not be included in this section.
|
||||
*/
|
||||
_rodata_reserved_end = ADDR(.flash.tbss);
|
||||
_rodata_reserved_end = .;
|
||||
|
||||
mapping[rodata_noload]
|
||||
} > default_rodata_seg
|
||||
|
||||
@@ -191,6 +191,9 @@ SECTIONS
|
||||
|
||||
mapping[flash_rodata]
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
*(.got .got.plt) /* TODO: GCC-439 */
|
||||
#endif
|
||||
*(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
|
||||
*(.gnu.linkonce.r.*)
|
||||
*(.rodata1)
|
||||
@@ -202,12 +205,14 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
ALIGNED_SYMBOL(4, __init_array_start)
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -257,24 +262,42 @@ SECTIONS
|
||||
|
||||
.flash.tdata :
|
||||
{
|
||||
/* Keep tdata and tbss sections contiguous (no gaps between them).
|
||||
* The TLS runtime code calculates offsets assuming these sections are
|
||||
* adjacent. Gaps would cause incorrect address calculations, leading
|
||||
* to accessing wrong memory.
|
||||
*
|
||||
* Storing all TLS structures in flash increases binary size, but avoids
|
||||
* runtime issues and reduces TLS allocations on the stack.
|
||||
*/
|
||||
/* tdata sections */
|
||||
_thread_local_data_start = ABSOLUTE(.);
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.tbss));
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.tbss)
|
||||
|
||||
.flash.tbss (NOLOAD) :
|
||||
{
|
||||
/* tbss sections */
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.rodata_noload));
|
||||
} > default_rodata_seg
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.rodata_noload)
|
||||
ASSERT(_thread_local_data_end == _thread_local_bss_start,
|
||||
"tdata and tbss must be contiguous.")
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
/**
|
||||
* This section contains all the rodata that is not used
|
||||
@@ -287,7 +310,7 @@ SECTIONS
|
||||
* driver to maintain the virtual address.
|
||||
* NOLOAD rodata may not be included in this section.
|
||||
*/
|
||||
_rodata_reserved_end = ADDR(.flash.tbss);
|
||||
_rodata_reserved_end = .;
|
||||
|
||||
mapping[rodata_noload]
|
||||
} > default_rodata_seg
|
||||
|
||||
@@ -362,6 +362,9 @@ SECTIONS
|
||||
arrays[flash_rodata]
|
||||
mapping[flash_rodata]
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
*(.got .got.plt) /* TODO: GCC-439 */
|
||||
#endif
|
||||
*(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
|
||||
*(.gnu.linkonce.r.*)
|
||||
*(.rodata1)
|
||||
@@ -379,12 +382,14 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
ALIGNED_SYMBOL(4, __init_array_start)
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -434,32 +439,48 @@ SECTIONS
|
||||
|
||||
.flash.tdata :
|
||||
{
|
||||
/* Keep tdata and tbss sections contiguous (no gaps between them).
|
||||
* The TLS runtime code calculates offsets assuming these sections are
|
||||
* adjacent. Gaps would cause incorrect address calculations, leading
|
||||
* to accessing wrong memory.
|
||||
*
|
||||
* Storing all TLS structures in flash increases binary size, but avoids
|
||||
* runtime issues and reduces TLS allocations on the stack.
|
||||
*/
|
||||
/* tdata sections */
|
||||
_thread_local_data_start = ABSOLUTE(.);
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.tbss));
|
||||
/* tbss sections */
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.rodata_noload));
|
||||
#if CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION
|
||||
/* Align the end of flash rodata region as per PMP granularity to allow using the
|
||||
* page alignment gap created while mapping the flash region into the PSRAM memory.
|
||||
*/
|
||||
. = ALIGN(_esp_pmp_align_size);
|
||||
#endif // CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION
|
||||
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
} > rodata_seg_low
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.tbss)
|
||||
|
||||
.flash.tbss (NOLOAD) :
|
||||
{
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
} > rodata_seg_low
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.rodata_noload)
|
||||
ASSERT(_thread_local_data_end == _thread_local_bss_start,
|
||||
"tdata and tbss must be contiguous.")
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
/**
|
||||
* This section contains all the rodata that is not used
|
||||
@@ -472,7 +493,7 @@ SECTIONS
|
||||
* driver to maintain the virtual address.
|
||||
* NOLOAD rodata may not be included in this section.
|
||||
*/
|
||||
_rodata_reserved_end = ADDR(.flash.tbss);
|
||||
_rodata_reserved_end = .;
|
||||
|
||||
arrays[rodata_noload]
|
||||
mapping[rodata_noload]
|
||||
|
||||
@@ -388,6 +388,9 @@ SECTIONS
|
||||
arrays[flash_rodata]
|
||||
mapping[flash_rodata]
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
*(.got .got.plt) /* TODO: GCC-439 */
|
||||
#endif
|
||||
*(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
|
||||
*(.gnu.linkonce.r.*)
|
||||
*(.rodata1)
|
||||
@@ -405,12 +408,14 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
ALIGNED_SYMBOL(4, __init_array_start)
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -460,11 +465,37 @@ SECTIONS
|
||||
|
||||
.flash.tdata :
|
||||
{
|
||||
/* Keep tdata and tbss sections contiguous (no gaps between them).
|
||||
* The TLS runtime code calculates offsets assuming these sections are
|
||||
* adjacent. Gaps would cause incorrect address calculations, leading
|
||||
* to accessing wrong memory.
|
||||
*
|
||||
* Storing all TLS structures in flash increases binary size, but avoids
|
||||
* runtime issues and reduces TLS allocations on the stack.
|
||||
*/
|
||||
/* tdata sections */
|
||||
_thread_local_data_start = ABSOLUTE(.);
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.tbss));
|
||||
/* tbss sections */
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
|
||||
. = ALIGN(ALIGNOF(.flash.rodata_noload));
|
||||
|
||||
#if CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION
|
||||
/* Align the end of flash rodata region as per PMP granularity to allow using the
|
||||
@@ -472,20 +503,11 @@ SECTIONS
|
||||
*/
|
||||
. = ALIGN(_esp_pmp_align_size);
|
||||
#endif // CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION
|
||||
|
||||
_thread_local_data_end = ABSOLUTE(.);
|
||||
} > rodata_seg_low
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.tbss)
|
||||
|
||||
.flash.tbss (NOLOAD) :
|
||||
{
|
||||
_thread_local_bss_start = ABSOLUTE(.);
|
||||
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*)
|
||||
*(.tcommon .tcommon.*)
|
||||
|
||||
_thread_local_bss_end = ABSOLUTE(.);
|
||||
} > rodata_seg_low
|
||||
ASSERT_SECTIONS_GAP(.flash.tdata, .flash.rodata_noload)
|
||||
ASSERT(_thread_local_data_end == _thread_local_bss_start,
|
||||
"tdata and tbss must be contiguous.")
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
/**
|
||||
* This section contains all the rodata that is not used
|
||||
@@ -498,7 +520,7 @@ SECTIONS
|
||||
* driver to maintain the virtual address.
|
||||
* NOLOAD rodata may not be included in this section.
|
||||
*/
|
||||
_rodata_reserved_end = ADDR(.flash.tbss);
|
||||
_rodata_reserved_end = .;
|
||||
|
||||
arrays[rodata_noload]
|
||||
mapping[rodata_noload]
|
||||
|
||||
@@ -363,12 +363,14 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
ALIGNED_SYMBOL(4, __init_array_start)
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -391,12 +393,24 @@ SECTIONS
|
||||
|
||||
/* TLS data. */
|
||||
ALIGNED_SYMBOL(4, _thread_local_start)
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata)
|
||||
*(.tdata.*)
|
||||
*(.tbss)
|
||||
*(.tbss.*)
|
||||
_thread_local_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
_flash_rodata_align = ALIGNOF(.flash.rodata);
|
||||
|
||||
|
||||
@@ -374,12 +374,14 @@ SECTIONS
|
||||
* Excluding crtbegin.o/crtend.o since IDF doesn't use the toolchain crt.
|
||||
*/
|
||||
ALIGNED_SYMBOL(4, __preinit_array_start)
|
||||
ALIGNED_SYMBOL(4, __bothinit_array_start)
|
||||
KEEP (*(.preinit_array))
|
||||
__preinit_array_end = ABSOLUTE(.);
|
||||
ALIGNED_SYMBOL(4, __init_array_start)
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors.*)))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors))
|
||||
__init_array_end = ABSOLUTE(.);
|
||||
__bothinit_array_end = ABSOLUTE(.);
|
||||
|
||||
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
||||
ALIGNED_SYMBOL(4, soc_reserved_memory_region_start)
|
||||
@@ -402,12 +404,24 @@ SECTIONS
|
||||
|
||||
/* TLS data. */
|
||||
ALIGNED_SYMBOL(4, _thread_local_start)
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
_picolibc_reent_stub_start = ABSOLUTE(.);
|
||||
KEEP(*(.tdata.errno))
|
||||
#if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
/* Reproduce the public fields from struct _reent. */
|
||||
KEEP(*(.tdata.tls_stdin))
|
||||
KEEP(*(.tdata.tls_stdout))
|
||||
KEEP(*(.tdata.tls_stderr))
|
||||
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
_picolibc_reent_stub_end = ABSOLUTE(.);
|
||||
#endif // CONFIG_LIBC_PICOLIBC
|
||||
*(.tdata)
|
||||
*(.tdata.*)
|
||||
*(.tbss)
|
||||
*(.tbss.*)
|
||||
_thread_local_end = ABSOLUTE(.);
|
||||
} > default_rodata_seg
|
||||
ASSERT_PICOLIBC_REENT_STUB()
|
||||
|
||||
_flash_rodata_align = ALIGNOF(.flash.rodata);
|
||||
|
||||
|
||||
@@ -100,3 +100,14 @@ ASSERT((ADDR(NEXT_SECTION) == ADDR(PREV_SECTION) + SIZEOF(PREV_SECTION)), \
|
||||
#else
|
||||
#define SECTION_AFTER_FLASH_RODATA .flash.tdata
|
||||
#endif
|
||||
|
||||
#if CONFIG_LIBC_PICOLIBC
|
||||
# if CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
|
||||
# define PICOLIBC_REENT_STUB 16
|
||||
# else
|
||||
# define PICOLIBC_REENT_STUB 4
|
||||
# endif
|
||||
#define ASSERT_PICOLIBC_REENT_STUB() ASSERT((_picolibc_reent_stub_end - _picolibc_reent_stub_start) == PICOLIBC_REENT_STUB, "Newlib _reent stub have wrong size")
|
||||
#else
|
||||
#define ASSERT_PICOLIBC_REENT_STUB()
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user