From d0f05cd6908f746446bc9596ecfb3b67fe90f06a Mon Sep 17 00:00:00 2001 From: Alexey Lapshin Date: Sun, 4 Aug 2024 23:05:36 +0700 Subject: [PATCH] fix(esp_system): fix binary generation error when no eh_frame but TLS ERROR: A fatal error occurred: Segment loaded at 0x3c01d150 lands in same 64KB flash mapping as segment loaded at 0x3c018020. Can't generate binary. Suggest changing linker script or ELF to merge sections. Seems binary generator does not handle well empty sections that contains aligning only. I did not investigate much but this change helped. --- components/esp_system/ld/elf_misc.ld.in | 8 ++++---- components/esp_system/ld/esp32/sections.ld.in | 4 ++-- components/esp_system/ld/esp32c2/sections.ld.in | 10 ++++------ components/esp_system/ld/esp32c3/sections.ld.in | 10 ++++------ components/esp_system/ld/esp32c5/sections.ld.in | 10 ++++------ components/esp_system/ld/esp32c6/sections.ld.in | 10 ++++------ components/esp_system/ld/esp32c61/sections.ld.in | 11 ++++------- components/esp_system/ld/esp32h2/sections.ld.in | 10 ++++------ components/esp_system/ld/esp32p4/sections.ld.in | 10 ++++------ components/esp_system/ld/esp32s2/sections.ld.in | 4 ++-- components/esp_system/ld/esp32s3/sections.ld.in | 4 ++-- components/esp_system/ld/ld.common | 10 ++++++++++ 12 files changed, 48 insertions(+), 53 deletions(-) diff --git a/components/esp_system/ld/elf_misc.ld.in b/components/esp_system/ld/elf_misc.ld.in index 5f15c0a8f7..84de2e16eb 100644 --- a/components/esp_system/ld/elf_misc.ld.in +++ b/components/esp_system/ld/elf_misc.ld.in @@ -55,10 +55,10 @@ */ *(.rela.*) *(.got .got.plt) /* TODO: GCC-382 */ -#if !(CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME) +#if !EH_FRAME_LINKING_ENABLED *(.eh_frame_hdr) *(.eh_frame) -#endif // !(CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME) +#endif // !EH_FRAME_LINKING_ENABLED } #elif CONFIG_IDF_TARGET_ARCH_XTENSA /** @@ -79,9 +79,9 @@ { *(.fini) *(.eh_frame_hdr) -#if !CONFIG_COMPILER_CXX_EXCEPTIONS +#if !EH_FRAME_LINKING_ENABLED *(.eh_frame) -#endif // !CONFIG_COMPILER_CXX_EXCEPTIONS +#endif // !EH_FRAME_LINKING_ENABLED } #else #error "Target architecture is not supported!" diff --git a/components/esp_system/ld/esp32/sections.ld.in b/components/esp_system/ld/esp32/sections.ld.in index 066994b743..17b6fc276e 100644 --- a/components/esp_system/ld/esp32/sections.ld.in +++ b/components/esp_system/ld/esp32/sections.ld.in @@ -353,7 +353,7 @@ SECTIONS __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.); *(.xt_except_desc_end) -#if CONFIG_COMPILER_CXX_EXCEPTIONS +#if EH_FRAME_LINKING_ENABLED ALIGNED_SYMBOL(4, __eh_frame) KEEP(*(.eh_frame)) /** @@ -361,7 +361,7 @@ SECTIONS * (see __FRAME_END__ in libgcc sources), it is manually provided here. */ LONG(0); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS +#endif // EH_FRAME_LINKING_ENABLED /** * C++ constructor tables. diff --git a/components/esp_system/ld/esp32c2/sections.ld.in b/components/esp_system/ld/esp32c2/sections.ld.in index d6cd375783..529e5ee5e2 100644 --- a/components/esp_system/ld/esp32c2/sections.ld.in +++ b/components/esp_system/ld/esp32c2/sections.ld.in @@ -227,19 +227,18 @@ SECTIONS _esp_system_init_fn_array_end = ABSOLUTE(.); _rodata_end = ABSOLUTE(.); - . = ALIGN(ALIGNOF(.eh_frame_hdr)); + . = ALIGN(ALIGNOF(SECTION_AFTER_FLASH_RODATA)); } > default_rodata_seg - ASSERT_SECTIONS_GAP(.flash.rodata, .eh_frame_hdr) + ASSERT_SECTIONS_GAP(.flash.rodata, SECTION_AFTER_FLASH_RODATA) +#if EH_FRAME_LINKING_ENABLED .eh_frame_hdr : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame_hdr) KEEP (*(.eh_frame_hdr)) __eh_frame_hdr_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.eh_frame)); } > default_rodata_seg @@ -247,7 +246,6 @@ SECTIONS .eh_frame : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame) KEEP (*(.eh_frame)) @@ -258,11 +256,11 @@ SECTIONS LONG(0); __eh_frame_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.flash.tdata)); } > default_rodata_seg ASSERT_SECTIONS_GAP(.eh_frame, .flash.tdata) +#endif // EH_FRAME_LINKING_ENABLED .flash.tdata : { diff --git a/components/esp_system/ld/esp32c3/sections.ld.in b/components/esp_system/ld/esp32c3/sections.ld.in index 1077f6966d..e4bdd72eef 100644 --- a/components/esp_system/ld/esp32c3/sections.ld.in +++ b/components/esp_system/ld/esp32c3/sections.ld.in @@ -345,19 +345,18 @@ SECTIONS _esp_system_init_fn_array_end = ABSOLUTE(.); _rodata_end = ABSOLUTE(.); - . = ALIGN(ALIGNOF(.eh_frame_hdr)); + . = ALIGN(ALIGNOF(SECTION_AFTER_FLASH_RODATA)); } > default_rodata_seg - ASSERT_SECTIONS_GAP(.flash.rodata, .eh_frame_hdr) + ASSERT_SECTIONS_GAP(.flash.rodata, SECTION_AFTER_FLASH_RODATA) +#if EH_FRAME_LINKING_ENABLED .eh_frame_hdr : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame_hdr) KEEP (*(.eh_frame_hdr)) __eh_frame_hdr_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.eh_frame)); } > default_rodata_seg @@ -365,7 +364,6 @@ SECTIONS .eh_frame : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame) KEEP (*(.eh_frame)) @@ -376,11 +374,11 @@ SECTIONS LONG(0); __eh_frame_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.flash.tdata)); } > default_rodata_seg ASSERT_SECTIONS_GAP(.eh_frame, .flash.tdata) +#endif // EH_FRAME_LINKING_ENABLED .flash.tdata : { diff --git a/components/esp_system/ld/esp32c5/sections.ld.in b/components/esp_system/ld/esp32c5/sections.ld.in index 7ebf3390dc..9e91ed9e7e 100644 --- a/components/esp_system/ld/esp32c5/sections.ld.in +++ b/components/esp_system/ld/esp32c5/sections.ld.in @@ -378,9 +378,9 @@ SECTIONS _esp_system_init_fn_array_end = ABSOLUTE(.); _rodata_end = ABSOLUTE(.); - . = ALIGN(ALIGNOF(.eh_frame_hdr)); + . = ALIGN(ALIGNOF(SECTION_AFTER_FLASH_RODATA)); } > default_rodata_seg - ASSERT_SECTIONS_GAP(.flash.rodata, .eh_frame_hdr) + ASSERT_SECTIONS_GAP(.flash.rodata, SECTION_AFTER_FLASH_RODATA) /* External RAM */ /** @@ -421,15 +421,14 @@ SECTIONS } > extern_ram_seg #endif //CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY +#if EH_FRAME_LINKING_ENABLED .eh_frame_hdr : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame_hdr) KEEP (*(.eh_frame_hdr)) __eh_frame_hdr_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.eh_frame)); } > default_rodata_seg @@ -437,7 +436,6 @@ SECTIONS .eh_frame : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame) KEEP (*(.eh_frame)) @@ -448,11 +446,11 @@ SECTIONS LONG(0); __eh_frame_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.flash.tdata)); } > default_rodata_seg ASSERT_SECTIONS_GAP(.eh_frame, .flash.tdata) +#endif // EH_FRAME_LINKING_ENABLED .flash.tdata : { diff --git a/components/esp_system/ld/esp32c6/sections.ld.in b/components/esp_system/ld/esp32c6/sections.ld.in index 407d34390a..e89336d044 100644 --- a/components/esp_system/ld/esp32c6/sections.ld.in +++ b/components/esp_system/ld/esp32c6/sections.ld.in @@ -394,19 +394,18 @@ SECTIONS _esp_system_init_fn_array_end = ABSOLUTE(.); _rodata_end = ABSOLUTE(.); - . = ALIGN(ALIGNOF(.eh_frame_hdr)); + . = ALIGN(ALIGNOF(SECTION_AFTER_FLASH_RODATA)); } > default_rodata_seg - ASSERT_SECTIONS_GAP(.flash.rodata, .eh_frame_hdr) + ASSERT_SECTIONS_GAP(.flash.rodata, SECTION_AFTER_FLASH_RODATA) +#if EH_FRAME_LINKING_ENABLED .eh_frame_hdr : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame_hdr) KEEP (*(.eh_frame_hdr)) __eh_frame_hdr_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.eh_frame)); } > default_rodata_seg @@ -414,7 +413,6 @@ SECTIONS .eh_frame : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame) KEEP (*(.eh_frame)) @@ -425,11 +423,11 @@ SECTIONS LONG(0); __eh_frame_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.flash.tdata)); } > default_rodata_seg ASSERT_SECTIONS_GAP(.eh_frame, .flash.tdata) +#endif // EH_FRAME_LINKING_ENABLED .flash.tdata : { diff --git a/components/esp_system/ld/esp32c61/sections.ld.in b/components/esp_system/ld/esp32c61/sections.ld.in index f69dd45f7f..f1e6972431 100644 --- a/components/esp_system/ld/esp32c61/sections.ld.in +++ b/components/esp_system/ld/esp32c61/sections.ld.in @@ -236,10 +236,9 @@ SECTIONS _esp_system_init_fn_array_end = ABSOLUTE(.); _rodata_end = ABSOLUTE(.); - . = ALIGN(ALIGNOF(.eh_frame_hdr)); + . = ALIGN(ALIGNOF(SECTION_AFTER_FLASH_RODATA)); } > default_rodata_seg - ASSERT_SECTIONS_GAP(.flash.rodata, .eh_frame_hdr) - + ASSERT_SECTIONS_GAP(.flash.rodata, SECTION_AFTER_FLASH_RODATA) /* External RAM */ /** @@ -280,15 +279,14 @@ SECTIONS } > extern_ram_seg #endif //CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY +#if EH_FRAME_LINKING_ENABLED .eh_frame_hdr : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame_hdr) KEEP (*(.eh_frame_hdr)) __eh_frame_hdr_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.eh_frame)); } > default_rodata_seg @@ -296,7 +294,6 @@ SECTIONS .eh_frame : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame) KEEP (*(.eh_frame)) @@ -307,11 +304,11 @@ SECTIONS LONG(0); __eh_frame_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.flash.tdata)); } > default_rodata_seg ASSERT_SECTIONS_GAP(.eh_frame, .flash.tdata) +#endif // EH_FRAME_LINKING_ENABLED .flash.tdata : { diff --git a/components/esp_system/ld/esp32h2/sections.ld.in b/components/esp_system/ld/esp32h2/sections.ld.in index 5fb84f6b3b..6282646923 100644 --- a/components/esp_system/ld/esp32h2/sections.ld.in +++ b/components/esp_system/ld/esp32h2/sections.ld.in @@ -383,19 +383,18 @@ SECTIONS _esp_system_init_fn_array_end = ABSOLUTE(.); _rodata_end = ABSOLUTE(.); - . = ALIGN(ALIGNOF(.eh_frame_hdr)); + . = ALIGN(ALIGNOF(SECTION_AFTER_FLASH_RODATA)); } > default_rodata_seg - ASSERT_SECTIONS_GAP(.flash.rodata, .eh_frame_hdr) + ASSERT_SECTIONS_GAP(.flash.rodata, SECTION_AFTER_FLASH_RODATA) +#if EH_FRAME_LINKING_ENABLED .eh_frame_hdr : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame_hdr) KEEP (*(.eh_frame_hdr)) __eh_frame_hdr_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.eh_frame)); } > default_rodata_seg @@ -403,7 +402,6 @@ SECTIONS .eh_frame : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame) KEEP (*(.eh_frame)) @@ -414,11 +412,11 @@ SECTIONS LONG(0); __eh_frame_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.flash.tdata)); } > default_rodata_seg ASSERT_SECTIONS_GAP(.eh_frame, .flash.tdata) +#endif // EH_FRAME_LINKING_ENABLED .flash.tdata : { diff --git a/components/esp_system/ld/esp32p4/sections.ld.in b/components/esp_system/ld/esp32p4/sections.ld.in index 0a48714d3e..e1de398dd1 100644 --- a/components/esp_system/ld/esp32p4/sections.ld.in +++ b/components/esp_system/ld/esp32p4/sections.ld.in @@ -400,19 +400,18 @@ SECTIONS _esp_system_init_fn_array_end = ABSOLUTE(.); _rodata_end = ABSOLUTE(.); - . = ALIGN(ALIGNOF(.eh_frame_hdr)); + . = ALIGN(ALIGNOF(SECTION_AFTER_FLASH_RODATA)); } > rodata_seg_low - ASSERT_SECTIONS_GAP(.flash.init_array, .eh_frame_hdr) + ASSERT_SECTIONS_GAP(.flash.init_array, SECTION_AFTER_FLASH_RODATA) +#if EH_FRAME_LINKING_ENABLED .eh_frame_hdr : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame_hdr) KEEP (*(.eh_frame_hdr)) __eh_frame_hdr_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.eh_frame)); } > rodata_seg_low @@ -420,7 +419,6 @@ SECTIONS .eh_frame : { -#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME ALIGNED_SYMBOL(4, __eh_frame) KEEP (*(.eh_frame)) @@ -431,11 +429,11 @@ SECTIONS LONG(0); __eh_frame_end = ABSOLUTE(.); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME . = ALIGN(ALIGNOF(.flash.tdata)); } > rodata_seg_low ASSERT_SECTIONS_GAP(.eh_frame, .flash.tdata) +#endif // EH_FRAME_LINKING_ENABLED .flash.tdata : { diff --git a/components/esp_system/ld/esp32s2/sections.ld.in b/components/esp_system/ld/esp32s2/sections.ld.in index 1b6e992da6..fee3ceedeb 100644 --- a/components/esp_system/ld/esp32s2/sections.ld.in +++ b/components/esp_system/ld/esp32s2/sections.ld.in @@ -353,7 +353,7 @@ SECTIONS __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.); *(.xt_except_desc_end) -#if CONFIG_COMPILER_CXX_EXCEPTIONS +#if EH_FRAME_LINKING_ENABLED ALIGNED_SYMBOL(4, __eh_frame) KEEP(*(.eh_frame)) /** @@ -361,7 +361,7 @@ SECTIONS * (see __FRAME_END__ in libgcc sources), it is manually provided here. */ LONG(0); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS +#endif // EH_FRAME_LINKING_ENABLED /** * C++ constructor tables. diff --git a/components/esp_system/ld/esp32s3/sections.ld.in b/components/esp_system/ld/esp32s3/sections.ld.in index 499a117a98..38fb25911f 100644 --- a/components/esp_system/ld/esp32s3/sections.ld.in +++ b/components/esp_system/ld/esp32s3/sections.ld.in @@ -363,7 +363,7 @@ SECTIONS __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.); *(.xt_except_desc_end) -#if CONFIG_COMPILER_CXX_EXCEPTIONS +#if EH_FRAME_LINKING_ENABLED ALIGNED_SYMBOL(4, __eh_frame) KEEP(*(.eh_frame)) /** @@ -371,7 +371,7 @@ SECTIONS * (see __FRAME_END__ in libgcc sources), it is manually provided here. */ LONG(0); -#endif // CONFIG_COMPILER_CXX_EXCEPTIONS +#endif // EH_FRAME_LINKING_ENABLED /** * C++ constructor tables. diff --git a/components/esp_system/ld/ld.common b/components/esp_system/ld/ld.common index ca35c79094..a4a9b4e892 100644 --- a/components/esp_system/ld/ld.common +++ b/components/esp_system/ld/ld.common @@ -78,3 +78,13 @@ ASSERT((ADDR(NEXT_SECTION) == ADDR(PREV_SECTION) + SIZEOF(PREV_SECTION)), \ #define ALIGNED_SYMBOL(X, SYMBOL) \ \n . = ALIGN(X); \ \n SYMBOL = ABSOLUTE(.); + +#if CONFIG_COMPILER_CXX_EXCEPTIONS || CONFIG_ESP_SYSTEM_USE_EH_FRAME +#define EH_FRAME_LINKING_ENABLED 1 +#endif + +#if EH_FRAME_LINKING_ENABLED +#define SECTION_AFTER_FLASH_RODATA .eh_frame_hdr +#else +#define SECTION_AFTER_FLASH_RODATA .flash.tdata +#endif