This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 0d31418ba8e arch, boards, cmake: Build C++ ELF modules without 
__cxa_atexit.
0d31418ba8e is described below

commit 0d31418ba8ee0e9bae97dea84805729daca2b2d7
Author: Marco Casaroli <[email protected]>
AuthorDate: Wed Sep 2 18:05:44 2026 +0200

    arch, boards, cmake: Build C++ ELF modules without __cxa_atexit.
    
    A C++ module with a static object does not link.  GCC registers each such
    object's destructor with __cxa_atexit(dtor, obj, &__dso_handle), and
    __dso_handle comes from crtbegin, which a module does not link:
    
      hello++3.cxx:119: undefined reference to `__dso_handle'
    
    It is reachable today with CONFIG_PIC, where a module is linked as an
    executable and the symbol has to resolve.  Without it the link is
    relocatable, the symbol stays undefined and nothing complains until
    something makes it resolve.
    
    -fno-use-cxa-atexit registers the destructors with atexit() instead, which
    puts them in .fini_array.  That is also where libelf_uninit() looks for them
    when the module is unloaded, so the flag that makes the link work is also
    the flag that makes the destructors run.
    
    The option goes wherever CXXELFFLAGS is defined, which is the architecture
    Toolchain.defs and the boards that reassign it.  The toolchains that are not
    GCC or Clang are left alone: ceva, tricore, z16 and the z80 family.
    
    The CMake build sets it once, next to where the architecture elf.cmake is
    included.  A generator expression keeps it off the C compiles, because the
    option is valid for C++ alone and GCC warns about it otherwise, and the
    compiler id gates it so that a toolchain which is neither GCC nor Clang does
    not see it.  It cannot go in the toolchain file itself: CMake reads that 
file
    again inside try_compile, in a project that has not included the NuttX
    extensions, so the call is an unknown command there.
    
    Reproduced with apps/examples/elf on mps3-an547:picostest with CONFIG_PIC
    enabled: hello++3 fails to link before and links after.
    
    Assisted-by: Claude Opus 5 (1M context) <[email protected]>
    Signed-off-by: Marco Casaroli <[email protected]>
---
 CMakeLists.txt                                             | 14 ++++++++++++++
 arch/arm/src/common/Toolchain.defs                         |  4 ++++
 arch/arm64/src/Toolchain.defs                              |  4 ++++
 arch/avr/src/avr/Toolchain.defs                            |  4 ++++
 arch/avr/src/avr32/Toolchain.defs                          |  4 ++++
 arch/mips/src/mips32/Toolchain.defs                        |  4 ++++
 arch/misoc/src/lm32/Toolchain.defs                         |  4 ++++
 arch/misoc/src/minerva/Toolchain.defs                      |  4 ++++
 arch/or1k/src/mor1kx/Toolchain.defs                        |  4 ++++
 arch/risc-v/src/common/Toolchain.defs                      |  4 ++++
 arch/sparc/src/sparc_v8/Toolchain.defs                     |  4 ++++
 arch/x86/src/common/Toolchain.defs                         |  4 ++++
 arch/x86_64/src/common/Toolchain.defs                      |  4 ++++
 arch/xtensa/src/lx6/Toolchain.defs                         |  4 ++++
 arch/xtensa/src/lx7/Toolchain.defs                         |  4 ++++
 boards/arm/sama5/sama5d3-xplained/scripts/Make.defs        |  4 ++++
 boards/arm/stm32h7/devebox-stm32h743/scripts/Make.defs     |  4 ++++
 boards/arm/stm32h7/linum-stm32h753bi/scripts/Make.defs     |  4 ++++
 boards/arm/stm32h7/openh743i/scripts/Make.defs             |  4 ++++
 boards/arm/stm32h7/weact-stm32h743/scripts/Make.defs       |  4 ++++
 boards/arm/stm32h7/weact-stm32h750/scripts/Make.defs       |  4 ++++
 boards/risc-v/esp32c6/esp32c6-devkitc/scripts/Make.defs    |  4 ++++
 boards/risc-v/esp32c6/esp32c6-xiao/scripts/Make.defs       |  4 ++++
 boards/sim/sim/sim/scripts/Make.defs                       |  5 +++++
 boards/xtensa/esp32/esp32-2432S028/scripts/Make.defs       |  4 ++++
 boards/xtensa/esp32s3/esp32s3-korvo-2/scripts/Make.defs    |  4 ++++
 boards/xtensa/esp32s3/esp32s3-lhcbit/scripts/Make.defs     |  4 ++++
 boards/xtensa/esp32s3/esp32s3-touch-lcd7/scripts/Make.defs |  4 ++++
 boards/xtensa/esp32s3/esp32s3-xiao/scripts/Make.defs       |  4 ++++
 29 files changed, 127 insertions(+)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 64d222f45ab..d058637a92b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -516,6 +516,20 @@ if(EXISTS 
${NUTTX_DIR}/arch/${CONFIG_ARCH}/src/cmake/elf.cmake)
   include(${NUTTX_DIR}/arch/${CONFIG_ARCH}/src/cmake/elf.cmake)
 endif()
 
+# The default registers each static object's destructor with __cxa_atexit(dtor,
+# obj, &__dso_handle), and __dso_handle comes from crtbegin, which a module 
does
+# not link.  Turning it off also puts the destructors in .fini_array, which is
+# where the loader looks for them when the module is unloaded.
+#
+# GCC and Clang alone take the option, which is why the architectures built by
+# another compiler do not carry it in their Toolchain.defs either.  ARMClang
+# reports ARMClang, so it keeps it.  The generator expression keeps the option
+# off the C compiles, which it is not valid for.
+
+if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
+  nuttx_elf_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-use-cxa-atexit>)
+endif()
+
 include(platform)
 
 if(CONFIG_ARCH_TOOLCHAIN_TASKING)
diff --git a/arch/arm/src/common/Toolchain.defs 
b/arch/arm/src/common/Toolchain.defs
index 734762fbb30..155ef3f3d7c 100644
--- a/arch/arm/src/common/Toolchain.defs
+++ b/arch/arm/src/common/Toolchain.defs
@@ -633,6 +633,10 @@ CELFFLAGS = $(filter-out --fixed-r9,$(CFLAGS)) 
-fvisibility=hidden \
 CXXELFFLAGS = $(filter-out --fixed-r9,$(CXXFLAGS)) -fvisibility=hidden \
               -mlong-calls
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 ifeq ($(CONFIG_PIC),y)
   # ARCHCFLAGS, not CFLAGS: board Make.defs reassign CFLAGS with ':='
   # after including this file, which would discard the flag.
diff --git a/arch/arm64/src/Toolchain.defs b/arch/arm64/src/Toolchain.defs
index c01ce0d7486..3fc5950552a 100644
--- a/arch/arm64/src/Toolchain.defs
+++ b/arch/arm64/src/Toolchain.defs
@@ -292,6 +292,10 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden # --target1-abs
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden # --target1-abs
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e _start
 ifneq ($(CONFIG_BUILD_KERNEL),y)
   # Flat build and protected elf entry point use crt0,
diff --git a/arch/avr/src/avr/Toolchain.defs b/arch/avr/src/avr/Toolchain.defs
index fc74397c170..62adab91149 100644
--- a/arch/avr/src/avr/Toolchain.defs
+++ b/arch/avr/src/avr/Toolchain.defs
@@ -219,5 +219,9 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e _start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)elf$(DELIM)gnu-elf.ld)
diff --git a/arch/avr/src/avr32/Toolchain.defs 
b/arch/avr/src/avr32/Toolchain.defs
index de75445721b..a6c219453c1 100644
--- a/arch/avr/src/avr32/Toolchain.defs
+++ b/arch/avr/src/avr32/Toolchain.defs
@@ -115,5 +115,9 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e _start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)elf$(DELIM)gnu-elf.ld)
diff --git a/arch/mips/src/mips32/Toolchain.defs 
b/arch/mips/src/mips32/Toolchain.defs
index 5b09c374a1e..4c1f0e325d7 100644
--- a/arch/mips/src/mips32/Toolchain.defs
+++ b/arch/mips/src/mips32/Toolchain.defs
@@ -332,5 +332,9 @@ LDMODULEFLAGS = -EL -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e _start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)elf$(DELIM)gnu-elf.ld)
diff --git a/arch/misoc/src/lm32/Toolchain.defs 
b/arch/misoc/src/lm32/Toolchain.defs
index a0d5b368cd3..431f901444e 100644
--- a/arch/misoc/src/lm32/Toolchain.defs
+++ b/arch/misoc/src/lm32/Toolchain.defs
@@ -146,5 +146,9 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e _start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)elf$(DELIM)gnu-elf.ld)
diff --git a/arch/misoc/src/minerva/Toolchain.defs 
b/arch/misoc/src/minerva/Toolchain.defs
index b4daf29b330..12d2e3afc4a 100644
--- a/arch/misoc/src/minerva/Toolchain.defs
+++ b/arch/misoc/src/minerva/Toolchain.defs
@@ -94,5 +94,9 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e _start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)elf$(DELIM)gnu-elf.ld)
diff --git a/arch/or1k/src/mor1kx/Toolchain.defs 
b/arch/or1k/src/mor1kx/Toolchain.defs
index ee5d116e2bf..c03d3234662 100644
--- a/arch/or1k/src/mor1kx/Toolchain.defs
+++ b/arch/or1k/src/mor1kx/Toolchain.defs
@@ -132,5 +132,9 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e _start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)elf$(DELIM)gnu-elf.ld)
diff --git a/arch/risc-v/src/common/Toolchain.defs 
b/arch/risc-v/src/common/Toolchain.defs
index 084bb327582..f1262238e11 100644
--- a/arch/risc-v/src/common/Toolchain.defs
+++ b/arch/risc-v/src/common/Toolchain.defs
@@ -449,6 +449,10 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -e _start
 
 ifeq ($(CONFIG_BINFMT_ELF_RELOCATABLE),y)
diff --git a/arch/sparc/src/sparc_v8/Toolchain.defs 
b/arch/sparc/src/sparc_v8/Toolchain.defs
index 9ec57660242..03bf6d8e0c6 100644
--- a/arch/sparc/src/sparc_v8/Toolchain.defs
+++ b/arch/sparc/src/sparc_v8/Toolchain.defs
@@ -137,5 +137,9 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e _start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)elf$(DELIM)gnu-elf.ld)
diff --git a/arch/x86/src/common/Toolchain.defs 
b/arch/x86/src/common/Toolchain.defs
index 92d31c00662..0c6bf27dde6 100644
--- a/arch/x86/src/common/Toolchain.defs
+++ b/arch/x86/src/common/Toolchain.defs
@@ -106,5 +106,9 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e _start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)elf$(DELIM)gnu-elf.ld)
diff --git a/arch/x86_64/src/common/Toolchain.defs 
b/arch/x86_64/src/common/Toolchain.defs
index 2cff921aab5..d82500482ee 100644
--- a/arch/x86_64/src/common/Toolchain.defs
+++ b/arch/x86_64/src/common/Toolchain.defs
@@ -286,6 +286,10 @@ endif
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e _start
 ifneq ($(CONFIG_BUILD_KERNEL),y)
   # Flat build and protected elf entry point use crt0,
diff --git a/arch/xtensa/src/lx6/Toolchain.defs 
b/arch/xtensa/src/lx6/Toolchain.defs
index c00c80633dd..d0f290e47f7 100644
--- a/arch/xtensa/src/lx6/Toolchain.defs
+++ b/arch/xtensa/src/lx6/Toolchain.defs
@@ -236,6 +236,10 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mtext-section-literals
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -mtext-section-literals
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e _start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)elf$(DELIM)gnu-elf.ld)
 ifneq ($(CONFIG_BUILD_KERNEL),y)
diff --git a/arch/xtensa/src/lx7/Toolchain.defs 
b/arch/xtensa/src/lx7/Toolchain.defs
index cd4e593230c..8561a5a883b 100644
--- a/arch/xtensa/src/lx7/Toolchain.defs
+++ b/arch/xtensa/src/lx7/Toolchain.defs
@@ -240,6 +240,10 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mtext-section-literals
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -mtext-section-literals
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e _start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)elf$(DELIM)gnu-elf.ld)
 ifneq ($(CONFIG_BUILD_KERNEL),y)
diff --git a/boards/arm/sama5/sama5d3-xplained/scripts/Make.defs 
b/boards/arm/sama5/sama5d3-xplained/scripts/Make.defs
index 26c92eb5b26..fa6c2c2ca83 100644
--- a/boards/arm/sama5/sama5d3-xplained/scripts/Make.defs
+++ b/boards/arm/sama5/sama5d3-xplained/scripts/Make.defs
@@ -50,5 +50,9 @@ LDNXFLATFLAGS = -e main -s 2048
 CELFFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
 CXXELFFLAGS = $(CXXFLAGS) -mlong-calls # --target1-abs
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e main
 LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
diff --git a/boards/arm/stm32h7/devebox-stm32h743/scripts/Make.defs 
b/boards/arm/stm32h7/devebox-stm32h743/scripts/Make.defs
index e91c28ac69d..3bce721393a 100644
--- a/boards/arm/stm32h7/devebox-stm32h743/scripts/Make.defs
+++ b/boards/arm/stm32h7/devebox-stm32h743/scripts/Make.defs
@@ -44,5 +44,9 @@ LDNXFLATFLAGS = -e main -s 2048
 CELFFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
 CXXELFFLAGS = $(CXXFLAGS) -mlong-calls # --target1-abs
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e main
 LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/elf/gnu-elf.ld)
diff --git a/boards/arm/stm32h7/linum-stm32h753bi/scripts/Make.defs 
b/boards/arm/stm32h7/linum-stm32h753bi/scripts/Make.defs
index a0239ec01e3..af4c5bd255d 100644
--- a/boards/arm/stm32h7/linum-stm32h753bi/scripts/Make.defs
+++ b/boards/arm/stm32h7/linum-stm32h753bi/scripts/Make.defs
@@ -42,5 +42,9 @@ LDNXFLATFLAGS = -e main -s 2048
 CELFFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
 CXXELFFLAGS = $(CXXFLAGS) -mlong-calls # --target1-abs
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e main
 LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/elf/gnu-elf.ld)
diff --git a/boards/arm/stm32h7/openh743i/scripts/Make.defs 
b/boards/arm/stm32h7/openh743i/scripts/Make.defs
index f58a9766be6..3d99a02ddc8 100644
--- a/boards/arm/stm32h7/openh743i/scripts/Make.defs
+++ b/boards/arm/stm32h7/openh743i/scripts/Make.defs
@@ -42,5 +42,9 @@ LDNXFLATFLAGS = -e main -s 2048
 CELFFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
 CXXELFFLAGS = $(CXXFLAGS) -mlong-calls # --target1-abs
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e main
 LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/elf/gnu-elf.ld)
diff --git a/boards/arm/stm32h7/weact-stm32h743/scripts/Make.defs 
b/boards/arm/stm32h7/weact-stm32h743/scripts/Make.defs
index 443bb0322b9..26eb471ffb4 100644
--- a/boards/arm/stm32h7/weact-stm32h743/scripts/Make.defs
+++ b/boards/arm/stm32h7/weact-stm32h743/scripts/Make.defs
@@ -42,5 +42,9 @@ LDNXFLATFLAGS = -e main -s 2048
 CELFFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
 CXXELFFLAGS = $(CXXFLAGS) -mlong-calls # --target1-abs
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e main
 LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/elf/gnu-elf.ld)
diff --git a/boards/arm/stm32h7/weact-stm32h750/scripts/Make.defs 
b/boards/arm/stm32h7/weact-stm32h750/scripts/Make.defs
index ccfcc38f166..2e7f4db1770 100644
--- a/boards/arm/stm32h7/weact-stm32h750/scripts/Make.defs
+++ b/boards/arm/stm32h7/weact-stm32h750/scripts/Make.defs
@@ -42,5 +42,9 @@ LDNXFLATFLAGS = -e main -s 2048
 CELFFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
 CXXELFFLAGS = $(CXXFLAGS) -mlong-calls # --target1-abs
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e main
 LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/elf/gnu-elf.ld)
diff --git a/boards/risc-v/esp32c6/esp32c6-devkitc/scripts/Make.defs 
b/boards/risc-v/esp32c6/esp32c6-devkitc/scripts/Make.defs
index d2af1cb4ca3..d910987ee16 100644
--- a/boards/risc-v/esp32c6/esp32c6-devkitc/scripts/Make.defs
+++ b/boards/risc-v/esp32c6/esp32c6-devkitc/scripts/Make.defs
@@ -63,5 +63,9 @@ LDMODULEFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS)
 CXXELFFLAGS = $(CXXFLAGS)
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -melf32lriscv -r -e main
 LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/elf/gnu-elf.ld)
diff --git a/boards/risc-v/esp32c6/esp32c6-xiao/scripts/Make.defs 
b/boards/risc-v/esp32c6/esp32c6-xiao/scripts/Make.defs
index 55a42752727..10324fc4ca1 100644
--- a/boards/risc-v/esp32c6/esp32c6-xiao/scripts/Make.defs
+++ b/boards/risc-v/esp32c6/esp32c6-xiao/scripts/Make.defs
@@ -63,5 +63,9 @@ LDMODULEFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS)
 CXXELFFLAGS = $(CXXFLAGS)
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -melf32lriscv -r -e main
 LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/elf/gnu-elf.ld)
diff --git a/boards/sim/sim/sim/scripts/Make.defs 
b/boards/sim/sim/sim/scripts/Make.defs
index f3667253196..5f2ed0436e4 100644
--- a/boards/sim/sim/sim/scripts/Make.defs
+++ b/boards/sim/sim/sim/scripts/Make.defs
@@ -287,6 +287,11 @@ endif
 
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
+
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 # -fno-pic to avoid GOT relocations
 CELFFLAGS += -fno-pic
 CXXELFFLAGS += -fno-pic
diff --git a/boards/xtensa/esp32/esp32-2432S028/scripts/Make.defs 
b/boards/xtensa/esp32/esp32-2432S028/scripts/Make.defs
index 3ee9a7c5f30..dc5f12d4cdf 100644
--- a/boards/xtensa/esp32/esp32-2432S028/scripts/Make.defs
+++ b/boards/xtensa/esp32/esp32-2432S028/scripts/Make.defs
@@ -67,5 +67,9 @@ LDMODULEFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -mtext-section-literals
 CXXELFFLAGS = $(CXXFLAGS) -mtext-section-literals
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e main
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)elf$(DELIM)gnu-elf.ld)
diff --git a/boards/xtensa/esp32s3/esp32s3-korvo-2/scripts/Make.defs 
b/boards/xtensa/esp32s3/esp32s3-korvo-2/scripts/Make.defs
index 430701deaa9..b815da4c623 100644
--- a/boards/xtensa/esp32s3/esp32s3-korvo-2/scripts/Make.defs
+++ b/boards/xtensa/esp32s3/esp32s3-korvo-2/scripts/Make.defs
@@ -67,5 +67,9 @@ LDMODULEFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -mtext-section-literals
 CXXELFFLAGS = $(CXXFLAGS) -mtext-section-literals
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e main
 LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/elf/gnu-elf.ld)
diff --git a/boards/xtensa/esp32s3/esp32s3-lhcbit/scripts/Make.defs 
b/boards/xtensa/esp32s3/esp32s3-lhcbit/scripts/Make.defs
index 37aa9f31b0e..c0ec5bb42d3 100644
--- a/boards/xtensa/esp32s3/esp32s3-lhcbit/scripts/Make.defs
+++ b/boards/xtensa/esp32s3/esp32s3-lhcbit/scripts/Make.defs
@@ -67,5 +67,9 @@ LDMODULEFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -mtext-section-literals
 CXXELFFLAGS = $(CXXFLAGS) -mtext-section-literals
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e main
 LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/elf/gnu-elf.ld)
diff --git a/boards/xtensa/esp32s3/esp32s3-touch-lcd7/scripts/Make.defs 
b/boards/xtensa/esp32s3/esp32s3-touch-lcd7/scripts/Make.defs
index 3ee8f4a3852..05e764cd55d 100644
--- a/boards/xtensa/esp32s3/esp32s3-touch-lcd7/scripts/Make.defs
+++ b/boards/xtensa/esp32s3/esp32s3-touch-lcd7/scripts/Make.defs
@@ -67,5 +67,9 @@ LDMODULEFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -mtext-section-literals
 CXXELFFLAGS = $(CXXFLAGS) -mtext-section-literals
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e main
 LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/elf/gnu-elf.ld)
diff --git a/boards/xtensa/esp32s3/esp32s3-xiao/scripts/Make.defs 
b/boards/xtensa/esp32s3/esp32s3-xiao/scripts/Make.defs
index 5e591d98e67..c7b0e5c5289 100644
--- a/boards/xtensa/esp32s3/esp32s3-xiao/scripts/Make.defs
+++ b/boards/xtensa/esp32s3/esp32s3-xiao/scripts/Make.defs
@@ -67,5 +67,9 @@ LDMODULEFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -mtext-section-literals
 CXXELFFLAGS = $(CXXFLAGS) -mtext-section-literals
 
+# __dso_handle comes from crtbegin, which a module does not link
+
+CXXELFFLAGS += -fno-use-cxa-atexit
+
 LDELFFLAGS = -r -e main
 LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/libelf/gnu-elf.ld)

Reply via email to