From 6322802fffdea6db5ddc523293676f7d93eb0726 Mon Sep 17 00:00:00 2001 From: Marco Casaroli Date: Wed, 2 Sep 2026 18:05:44 +0200 Subject: [PATCH] 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) Signed-off-by: Marco Casaroli --- 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 ++++ .../arm/sama5/sama5d3-xplained/scripts/Make.defs | 4 ++++ .../stm32h7/devebox-stm32h743/scripts/Make.defs | 4 ++++ .../stm32h7/linum-stm32h753bi/scripts/Make.defs | 4 ++++ boards/arm/stm32h7/openh743i/scripts/Make.defs | 4 ++++ .../arm/stm32h7/weact-stm32h743/scripts/Make.defs | 4 ++++ .../arm/stm32h7/weact-stm32h750/scripts/Make.defs | 4 ++++ .../esp32c6/esp32c6-devkitc/scripts/Make.defs | 4 ++++ .../risc-v/esp32c6/esp32c6-xiao/scripts/Make.defs | 4 ++++ boards/sim/sim/sim/scripts/Make.defs | 5 +++++ .../xtensa/esp32/esp32-2432S028/scripts/Make.defs | 4 ++++ .../esp32s3/esp32s3-korvo-2/scripts/Make.defs | 4 ++++ .../esp32s3/esp32s3-lhcbit/scripts/Make.defs | 4 ++++ .../esp32s3/esp32s3-touch-lcd7/scripts/Make.defs | 4 ++++ .../xtensa/esp32s3/esp32s3-xiao/scripts/Make.defs | 4 ++++ 29 files changed, 127 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 64d222f45ab7f..d058637a92b95 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($<$:-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 734762fbb30fc..155ef3f3d7ce3 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 c01ce0d74864a..3fc5950552a7f 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 fc74397c170b9..62adab911497a 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 de75445721b1b..a6c219453c128 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 5b09c374a1e45..4c1f0e325d7e2 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 a0d5b368cd3e1..431f901444e69 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 b4daf29b33067..12d2e3afc4af6 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 ee5d116e2bf68..c03d3234662fc 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 084bb3275822c..f1262238e1176 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 9ec5766024247..03bf6d8e0c649 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 92d31c0066229..0c6bf27dde618 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 2cff921aab593..d82500482ee3b 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 c00c80633ddb0..d0f290e47f764 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 cd4e593230cff..8561a5a883bd3 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 26c92eb5b26de..fa6c2c2ca83bc 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 e91c28ac69d1a..3bce721393ac1 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 a0239ec01e382..af4c5bd255ddc 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 f58a9766be6c9..3d99a02ddc8c9 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 443bb0322b930..26eb471ffb4e4 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 ccfcc38f166fa..2e7f4db1770bd 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 d2af1cb4ca344..d910987ee16da 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 55a42752727c8..10324fc4ca1e1 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 f3667253196e5..5f2ed0436e436 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 3ee9a7c5f309e..dc5f12d4cdf48 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 430701deaa92a..b815da4c62321 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 37aa9f31b0e2f..c0ec5bb42d38b 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 3ee8f4a3852b0..05e764cd55da4 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 5e591d98e673e..c7b0e5c52891b 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)