Merge branch 'feature/refactor_linker_scripts' into 'master'

feat(esp_system): refactor linker scripts to reduce duplicated code

See merge request espressif/esp-idf!45220
This commit is contained in:
Alexey Lapshin
2026-02-02 13:09:30 +04:00
41 changed files with 1195 additions and 6154 deletions
@@ -165,8 +165,6 @@ _heap_start = _heap_low_start;
_heap_end = 0x40000000;
_data_seg_org = ORIGIN(rtc_data_seg);
/* The lines below define location alias for .rtc.data section based on Kconfig option.
When the option is not defined then use slow memory segment
else the data will be placed in fast memory segment */
+55 -83
View File
@@ -28,11 +28,7 @@ SECTIONS
HIDDEN(_rtc_code_start = .);
mapping[rtc_text]
/* mutable libs begin */
mutable[rtc_text]
/* mutable libs end */
SECTION_MAPPINGS(rtc_text)
*rtc_wake_stub*.*(.literal .text .literal.* .text.*)
@@ -67,11 +63,7 @@ SECTIONS
{
ALIGNED_SYMBOL(4, _rtc_force_fast_start)
mapping[rtc_force_fast]
/* mutable libs begin */
mutable[rtc_force_fast]
/* mutable libs end */
SECTION_MAPPINGS(rtc_force_fast)
*(.rtc.force_fast .rtc.force_fast.*)
@@ -90,11 +82,7 @@ SECTIONS
{
_rtc_data_start = ABSOLUTE(.);
mapping[rtc_data]
/* mutable libs begin */
mutable[rtc_data]
/* mutable libs end */
SECTION_MAPPINGS(rtc_data)
*rtc_wake_stub*.*(.data .rodata .data.* .rodata.*)
@@ -109,11 +97,7 @@ SECTIONS
*rtc_wake_stub*.*(.bss .bss.*)
*rtc_wake_stub*.*(COMMON)
mapping[rtc_bss]
/* mutable libs begin */
mutable[rtc_bss]
/* mutable libs end */
SECTION_MAPPINGS(rtc_bss)
_rtc_bss_end = ABSOLUTE(.);
} > rtc_data_location
@@ -130,7 +114,7 @@ SECTIONS
{
ALIGNED_SYMBOL(4, _rtc_noinit_start)
mapping[rtc_noinit]
SECTION_MAPPINGS(rtc_noinit)
*(.rtc_noinit .rtc_noinit.*)
@@ -229,12 +213,7 @@ SECTIONS
/* Code marked as running out of IRAM */
_iram_text_start = ABSOLUTE(.);
mapping[iram0_text]
/* mutable libs begin */
mutable[iram0_text]
FAST_REFLASHING_PADDING;
/* mutable libs end */
SECTION_MAPPINGS_WITH_PADDING(iram0_text)
/* Padding for possible CPU prefetch + alignment for PMS split lines */
. += _esp_memprot_prefetch_pad_size;
@@ -262,12 +241,7 @@ SECTIONS
*(.gnu.linkonce.s2.*)
*(.jcr)
mapping[dram0_data]
/* mutable libs begin */
mutable[dram0_data]
FAST_REFLASHING_PADDING;
/* mutable libs end */
SECTION_MAPPINGS_WITH_PADDING(dram0_data)
_data_end = ABSOLUTE(.);
} > dram0_0_seg
@@ -293,11 +267,7 @@ SECTIONS
{
ALIGNED_SYMBOL(4, _ext_ram_bss_start)
mapping[extern_ram]
/* mutable libs begin */
mutable[extern_ram]
/* mutable libs end */
SECTION_MAPPINGS(extern_ram)
ALIGNED_SYMBOL(4, _ext_ram_bss_end)
} > extern_ram_seg
@@ -312,6 +282,7 @@ SECTIONS
{
_ext_ram_noinit_start = ABSOLUTE(.);
SECTION_MAPPINGS(extram_noinit)
*(.ext_ram_noinit*)
ALIGNED_SYMBOL(4, _ext_ram_noinit_end)
@@ -323,15 +294,7 @@ SECTIONS
{
ALIGNED_SYMBOL(8, _bss_start)
/**
* ldgen places all bss-related data to mapping[dram0_bss]
* (See components/esp_system/app.lf).
*/
mapping[dram0_bss]
/* mutable libs begin */
mutable[dram0_bss]
/* mutable libs end */
SECTION_MAPPINGS(dram0_bss)
ALIGNED_SYMBOL(16, _bss_end)
} > dram0_0_seg
@@ -365,7 +328,7 @@ SECTIONS
{
_flash_rodata_start = ABSOLUTE(.);
mapping[flash_rodata]
SECTION_MAPPINGS_WITH_PADDING(flash_rodata)
*(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
*(.gnu.linkonce.r.*)
@@ -383,16 +346,6 @@ SECTIONS
__XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
*(.xt_except_desc_end)
#if EH_FRAME_LINKING_ENABLED
ALIGNED_SYMBOL(4, __eh_frame)
KEEP(*(.eh_frame))
/**
* As we are not linking with crtend.o, which includes the CIE terminator
* (see __FRAME_END__ in libgcc sources), it is manually provided here.
*/
LONG(0);
#endif // EH_FRAME_LINKING_ENABLED
/**
* C++ constructor tables.
*
@@ -418,11 +371,6 @@ SECTIONS
KEEP (*(SORT_BY_INIT_PRIORITY(.esp_system_init_fn.*)))
_esp_system_init_fn_array_end = ABSOLUTE(.);
/* mutable libs begin */
mutable[flash_rodata]
FAST_REFLASHING_PADDING;
/* mutable libs end */
_rodata_end = ABSOLUTE(.);
/* Literals are also RO data. */
@@ -431,9 +379,37 @@ SECTIONS
*(.lit4.*)
*(.gnu.linkonce.lit4.*)
_lit4_end = ABSOLUTE(.);
. = ALIGN(ALIGNOF(SECTION_AFTER_FLASH_RODATA));
} > default_rodata_seg
ASSERT_SECTIONS_GAP(.flash.rodata, SECTION_AFTER_FLASH_RODATA)
/* TLS data. */
ALIGNED_SYMBOL(4, _thread_local_start)
#if EH_FRAME_LINKING_ENABLED
.eh_frame :
{
ALIGNED_SYMBOL(4, __eh_frame)
KEEP (*(.eh_frame))
/**
* As we are not linking with crtend.o, which includes the CIE terminator
* (see __FRAME_END__ in libgcc sources), it is manually provided here.
*/
LONG(0);
__eh_frame_end = ABSOLUTE(.);
. = ALIGN(ALIGNOF(.flash.tdata));
} > default_rodata_seg
#endif // EH_FRAME_LINKING_ENABLED
.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.
*/
/* tdata sections */
_thread_local_data_start = ABSOLUTE(.);
#if CONFIG_LIBC_PICOLIBC
_picolibc_reent_stub_start = ABSOLUTE(.);
KEEP(*(.tdata.errno))
@@ -445,15 +421,18 @@ SECTIONS
#endif // CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY
_picolibc_reent_stub_end = ABSOLUTE(.);
#endif // CONFIG_LIBC_PICOLIBC
*(.tdata)
*(.tdata.*)
*(.tbss)
*(.tbss.*)
_thread_local_end = ABSOLUTE(.);
*(.tdata .tdata.* .gnu.linkonce.td.*)
_thread_local_data_end = ABSOLUTE(.);
/* tbss sections */
_thread_local_bss_start = ABSOLUTE(.);
*(.tbss .tbss.* .gnu.linkonce.tb.*)
*(.tcommon .tcommon.*)
_thread_local_bss_end = ABSOLUTE(.);
} > default_rodata_seg
_tls_section_alignment = ALIGNOF(.flash.tdata);
ASSERT_PICOLIBC_REENT_STUB()
_flash_rodata_align = ALIGNOF(.flash.rodata);
ASSERT(_thread_local_data_end == _thread_local_bss_start,
"tdata and tbss must be contiguous.")
/**
* This section contains all the rodata that is not used
@@ -468,11 +447,8 @@ SECTIONS
*/
_rodata_reserved_end = ABSOLUTE(.);
mapping[rodata_noload]
SECTION_MAPPINGS(rodata_noload)
/* mutable libs begin */
mutable[rodata_noload]
/* mutable libs end */
} > default_rodata_seg
.flash.text :
@@ -485,12 +461,7 @@ SECTIONS
_instruction_reserved_start = ABSOLUTE(.);
_text_start = ABSOLUTE(.);
mapping[flash_text]
/* mutable libs begin */
mutable[flash_text]
FAST_REFLASHING_PADDING;
/* mutable libs end */
SECTION_MAPPINGS_WITH_PADDING(flash_text)
*(.stub)
*(.gnu.warning)
@@ -534,7 +505,8 @@ SECTIONS
ALIGNED_SYMBOL(8, _heap_low_start)
} > dram0_0_seg
#include "elf_misc.ld.in"
#include "ld.debug.sections"
#include "ld.discard.sections"
}
ASSERT(((_iram_text_end - ORIGIN(iram0_0_seg)) <= LENGTH(iram0_0_seg)),