From c79d304c4dfaed0fe44bc40e48443834dc88e5b3 Mon Sep 17 00:00:00 2001 From: Alexey Gerenkov Date: Mon, 8 Dec 2025 19:44:53 +0300 Subject: [PATCH] fix(build): Fixed constructors placement by Clang for Xtensa By default Clang puts constructors into '.init_array'. Close https://github.com/espressif/esp-idf/issues/17990 --- components/esp_system/ld/esp32/sections.ld.in | 5 +++++ components/esp_system/ld/esp32s2/sections.ld.in | 5 +++++ components/esp_system/ld/esp32s3/sections.ld.in | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/components/esp_system/ld/esp32/sections.ld.in b/components/esp_system/ld/esp32/sections.ld.in index 8e3c76efac..62793100e8 100644 --- a/components/esp_system/ld/esp32/sections.ld.in +++ b/components/esp_system/ld/esp32/sections.ld.in @@ -352,8 +352,13 @@ SECTIONS KEEP (*(.preinit_array)) __preinit_array_end = ABSOLUTE(.); ALIGNED_SYMBOL(4, __init_array_start) +#if CONFIG_IDF_TOOLCHAIN_CLANG + KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*))) + KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array)) +#else KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors.*))) KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors)) +#endif __init_array_end = ABSOLUTE(.); __bothinit_array_end = ABSOLUTE(.); diff --git a/components/esp_system/ld/esp32s2/sections.ld.in b/components/esp_system/ld/esp32s2/sections.ld.in index d74e3cb96d..158df7fb8a 100644 --- a/components/esp_system/ld/esp32s2/sections.ld.in +++ b/components/esp_system/ld/esp32s2/sections.ld.in @@ -356,8 +356,13 @@ SECTIONS KEEP (*(.preinit_array)) __preinit_array_end = ABSOLUTE(.); ALIGNED_SYMBOL(4, __init_array_start) +#if CONFIG_IDF_TOOLCHAIN_CLANG + KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*))) + KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array)) +#else KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors.*))) KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors)) +#endif __init_array_end = ABSOLUTE(.); __bothinit_array_end = ABSOLUTE(.); diff --git a/components/esp_system/ld/esp32s3/sections.ld.in b/components/esp_system/ld/esp32s3/sections.ld.in index 61ca1a846b..b7facdb8c5 100644 --- a/components/esp_system/ld/esp32s3/sections.ld.in +++ b/components/esp_system/ld/esp32s3/sections.ld.in @@ -365,8 +365,13 @@ SECTIONS KEEP (*(.preinit_array)) __preinit_array_end = ABSOLUTE(.); ALIGNED_SYMBOL(4, __init_array_start) +#if CONFIG_IDF_TOOLCHAIN_CLANG + KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array.*))) + KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .init_array)) +#else KEEP (*(SORT_BY_INIT_PRIORITY(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors.*))) KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors)) +#endif __init_array_end = ABSOLUTE(.); __bothinit_array_end = ABSOLUTE(.);