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

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

commit 422c43949a95845712b31ea8f1260e2f964aa5cf
Author: anjiahao <anjia...@xiaomi.com>
AuthorDate: Mon Feb 10 17:53:46 2025 +0800

    binfmt:use crt0 inside of starthook
    
    test:
    1.use mps3-an547 build helloxx as module and run it
    2.use qemu-armv7a:knsh test kernel build helloxx and run it
    
    Signed-off-by: anjiahao <anjia...@xiaomi.com>
---
 arch/arm/src/Makefile                              |  7 +-
 arch/arm/src/armv7-a/Make.defs                     |  7 --
 arch/arm/src/common/Make.defs                      |  2 +
 arch/arm/src/common/Toolchain.defs                 |  9 ++-
 arch/arm/src/{armv7-a => common}/crt0.c            | 11 +--
 arch/arm64/src/Makefile                            |  7 +-
 arch/arm64/src/Toolchain.defs                      |  8 ++-
 arch/arm64/src/common/Make.defs                    |  5 --
 arch/arm64/src/common/crt0.c                       | 18 +++--
 arch/avr/src/avr/Toolchain.defs                    |  2 +-
 arch/avr/src/avr32/Toolchain.defs                  |  2 +-
 arch/ceva/src/xc5/Toolchain.defs                   |  2 +-
 arch/ceva/src/xm6/Toolchain.defs                   |  2 +-
 arch/mips/src/mips32/Toolchain.defs                |  2 +-
 arch/misoc/src/lm32/Toolchain.defs                 |  2 +-
 arch/misoc/src/minerva/Toolchain.defs              |  2 +-
 arch/or1k/src/mor1kx/Toolchain.defs                |  2 +-
 arch/risc-v/src/common/Make.defs                   |  2 -
 arch/risc-v/src/common/Toolchain.defs              |  2 +-
 arch/risc-v/src/common/crt0.c                      | 18 +++--
 arch/sparc/src/sparc_v8/Toolchain.defs             |  2 +-
 arch/tricore/src/common/ToolchainTasking.defs      |  2 +-
 arch/x86/src/common/Toolchain.defs                 |  2 +-
 arch/x86_64/src/Makefile                           |  7 +-
 arch/x86_64/src/common/Make.defs                   |  5 --
 arch/x86_64/src/common/Toolchain.defs              |  9 ++-
 arch/x86_64/src/common/crt0.c                      | 70 ++++++++++++++++++-
 arch/xtensa/src/lx6/Toolchain.defs                 |  2 +-
 arch/xtensa/src/lx7/Toolchain.defs                 |  2 +-
 arch/z80/src/ez80/Toolchain.defs                   |  2 +-
 arch/z80/src/z180/Toolchain.defs                   |  2 +-
 arch/z80/src/z8/Toolchain.defs                     |  2 +-
 arch/z80/src/z80/Toolchain.defs                    |  2 +-
 binfmt/Kconfig                                     |  2 +-
 binfmt/binfmt_execmodule.c                         | 57 ----------------
 boards/arm/cxd56xx/spresense/configs/elf/defconfig |  1 -
 boards/arm/imx6/sabre-6quad/configs/elf/defconfig  |  1 -
 .../lc823450-xgevk/configs/audio/defconfig         |  1 -
 .../lc823450/lc823450-xgevk/configs/bt/defconfig   |  1 -
 .../lc823450/lc823450-xgevk/configs/elf/defconfig  |  1 -
 .../lc823450/lc823450-xgevk/configs/ipl2/defconfig |  1 -
 .../lc823450/lc823450-xgevk/configs/knsh/defconfig |  1 -
 .../lc823450-xgevk/configs/krndis/defconfig        |  1 -
 .../lc823450/lc823450-xgevk/configs/nsh/defconfig  |  1 -
 .../lc823450-xgevk/configs/posix_spawn/defconfig   |  1 -
 .../lc823450-xgevk/configs/rndis/defconfig         |  1 -
 .../lc823450/lc823450-xgevk/configs/usb/defconfig  |  1 -
 .../stm32/olimex-stm32-p407/configs/kelf/defconfig |  1 -
 .../stm32/stm32f4discovery/configs/elf/defconfig   |  1 -
 .../stm32f4discovery/configs/posix_spawn/defconfig |  1 -
 boards/risc-v/k210/maix-bit/configs/smp2/defconfig |  1 -
 .../esp32/esp32-devkitc/configs/elf/defconfig      |  1 -
 .../esp32s3/esp32s3-devkit/configs/elf/defconfig   |  1 -
 include/nuttx/sched.h                              | 37 ----------
 sched/Kconfig                                      | 10 ---
 sched/task/CMakeLists.txt                          |  4 --
 sched/task/Make.defs                               |  4 --
 sched/task/task_start.c                            | 12 ----
 sched/task/task_starthook.c                        | 78 ----------------------
 59 files changed, 156 insertions(+), 287 deletions(-)

diff --git a/arch/arm/src/Makefile b/arch/arm/src/Makefile
index b8718ef91f..e539f924d8 100644
--- a/arch/arm/src/Makefile
+++ b/arch/arm/src/Makefile
@@ -169,11 +169,14 @@ $(AOBJS) $(UAOBJS) $(HEAD_OBJ): %$(OBJEXT): %.S
 $(COBJS) $(UCOBJS): %$(OBJEXT): %.c
        $(call COMPILE, $<, $@)
 
+$(STARTUP_OBJS): %$(OBJEXT): %.c
+       $(Q) $(CC) $(CELFFLAGS) -c common$(DELIM)crt0.c -o crt0$(OBJEXT)
+
 ifeq ($(CONFIG_BUILD_FLAT),y)
-$(BIN): $(OBJS)
+$(BIN): $(STARTUP_OBJS) $(OBJS)
        $(call ARCHIVE, $@, $(OBJS))
 else
-$(BIN): $(UOBJS)
+$(BIN): $(STARTUP_OBJS) $(UOBJS)
        $(call ARCHIVE, $@, $(UOBJS))
 endif
 
diff --git a/arch/arm/src/armv7-a/Make.defs b/arch/arm/src/armv7-a/Make.defs
index 428f86e3b2..99a998b4a8 100644
--- a/arch/arm/src/armv7-a/Make.defs
+++ b/arch/arm/src/armv7-a/Make.defs
@@ -29,13 +29,6 @@ include common/Make.defs
 
 HEAD_ASRC += arm_vectortab.S
 
-ifeq ($(CONFIG_BUILD_KERNEL),y)
-crt0$(OBJEXT): crt0.c
-       $(CC) $(CFLAGS) -c armv7-a$(DELIM)crt0.c -o crt0$(OBJEXT)
-
-STARTUP_OBJS = crt0$(OBJEXT)
-endif
-
 # Common assembly language files
 
 CMN_ASRCS += arm_cpuhead.S arm_vectors.S arm_saveusercontext.S
diff --git a/arch/arm/src/common/Make.defs b/arch/arm/src/common/Make.defs
index 7818eef46e..e11a42a84b 100644
--- a/arch/arm/src/common/Make.defs
+++ b/arch/arm/src/common/Make.defs
@@ -20,6 +20,8 @@
 #
 ############################################################################
 
+STARTUP_OBJS = crt0$(OBJEXT)
+
 # Common ARM files
 
 CMN_CSRCS += arm_allocateheap.c arm_createstack.c arm_exit.c
diff --git a/arch/arm/src/common/Toolchain.defs 
b/arch/arm/src/common/Toolchain.defs
index 7e9533fb96..104d887a37 100644
--- a/arch/arm/src/common/Toolchain.defs
+++ b/arch/arm/src/common/Toolchain.defs
@@ -551,7 +551,14 @@ else
   endif
 endif
 
-LDELFFLAGS +=  -e main -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
+ifneq ($(CONFIG_BUILD_KERNEL),y)
+  # Flat build and protected elf entry point use crt0,
+  # Kernel build will use apps/import/scripts/crt0
+
+  LDELFFLAGS += $(TOPDIR)$(DELIM)arch$(DELIM)arm$(DELIM)src$(DELIM)crt0.o
+endif
+
+LDELFFLAGS += -e __start -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
 
 # Zig toolchain
 
diff --git a/arch/arm/src/armv7-a/crt0.c b/arch/arm/src/common/crt0.c
similarity index 98%
rename from arch/arm/src/armv7-a/crt0.c
rename to arch/arm/src/common/crt0.c
index 93e74b2c05..ccdb94428f 100644
--- a/arch/arm/src/armv7-a/crt0.c
+++ b/arch/arm/src/common/crt0.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * arch/arm/src/armv7-a/crt0.c
+ * arch/arm/src/common/crt0.c
  *
  * SPDX-License-Identifier: Apache-2.0
  *
@@ -34,8 +34,6 @@
 
 #include <arch/syscall.h>
 
-#ifdef CONFIG_BUILD_KERNEL
-
 /****************************************************************************
  * Public Data
  ****************************************************************************/
@@ -80,6 +78,7 @@ int main(int argc, char *argv[]);
  *
  ****************************************************************************/
 
+#ifdef CONFIG_BUILD_KERNEL
 static void sig_trampoline(void) naked_function;
 static void sig_trampoline(void)
 {
@@ -99,6 +98,7 @@ static void sig_trampoline(void)
       "i"(SYS_syscall)
   );
 }
+#endif
 
 #ifdef CONFIG_HAVE_CXXINITIALIZE
 
@@ -135,6 +135,7 @@ static void exec_dtors(void)
 }
 
 #endif
+
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -167,7 +168,9 @@ void __start(int argc, char *argv[])
    * that is visible to the RTOS.
    */
 
+#ifdef CONFIG_BUILD_KERNEL
   ARCH_DATA_RESERVE->ar_sigtramp = (addrenv_sigtramp_t)sig_trampoline;
+#endif
 
 #ifdef CONFIG_HAVE_CXXINITIALIZE
   /* Call C++ constructors */
@@ -193,5 +196,3 @@ void __start(int argc, char *argv[])
 
   exit(ret);
 }
-
-#endif /* CONFIG_BUILD_KERNEL */
diff --git a/arch/arm64/src/Makefile b/arch/arm64/src/Makefile
index f0598f2309..47ea4379d5 100644
--- a/arch/arm64/src/Makefile
+++ b/arch/arm64/src/Makefile
@@ -142,11 +142,14 @@ $(AOBJS) $(UAOBJS) $(HEAD_OBJ): %$(OBJEXT): %.S
 $(COBJS) $(UCOBJS): %$(OBJEXT): %.c
        $(call COMPILE, $<, $@)
 
+$(STARTUP_OBJS): %$(OBJEXT): %.c
+       $(Q) $(CC) $(CELFFLAGS) -c common$(DELIM)crt0.c -o crt0$(OBJEXT)
+
 ifeq ($(CONFIG_BUILD_FLAT),y)
-$(BIN): $(OBJS)
+$(BIN): $(OBJS) $(STARTUP_OBJS)
        $(call ARCHIVE, $@, $(OBJS))
 else
-$(BIN): $(UOBJS)
+$(BIN): $(UOBJS) $(STARTUP_OBJS)
        $(call ARCHIVE, $@, $(UOBJS))
 endif
 
diff --git a/arch/arm64/src/Toolchain.defs b/arch/arm64/src/Toolchain.defs
index 9282ddc971..6eb3cd5a78 100644
--- a/arch/arm64/src/Toolchain.defs
+++ b/arch/arm64/src/Toolchain.defs
@@ -247,5 +247,11 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mlong-calls # --target1-abs
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -mlong-calls # --target1-abs
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
+ifneq ($(CONFIG_BUILD_KERNEL),y)
+  # Flat build and protected elf entry point use crt0,
+  # Kernel build will use apps/import/scripts/crt0
+
+  LDELFFLAGS += $(TOPDIR)$(DELIM)arch$(DELIM)arm64$(DELIM)src$(DELIM)crt0.o
+endif
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/arm64/src/common/Make.defs b/arch/arm64/src/common/Make.defs
index f23427948e..878354490d 100644
--- a/arch/arm64/src/common/Make.defs
+++ b/arch/arm64/src/common/Make.defs
@@ -25,12 +25,7 @@
 
 HEAD_ASRC  = arm64_head.S
 
-ifeq ($(CONFIG_BUILD_KERNEL),y)
-crt0$(OBJEXT): crt0.c
-       $(CC) $(CFLAGS) -c common$(DELIM)crt0.c -o crt0$(OBJEXT)
-
 STARTUP_OBJS = crt0$(OBJEXT)
-endif
 
 # Force the start-up logic to be at the beginning of the .text to simplify
 # debug.
diff --git a/arch/arm64/src/common/crt0.c b/arch/arm64/src/common/crt0.c
index c734cf6e86..b15a2e010a 100644
--- a/arch/arm64/src/common/crt0.c
+++ b/arch/arm64/src/common/crt0.c
@@ -34,8 +34,6 @@
 
 #include <arch/syscall.h>
 
-#ifdef CONFIG_BUILD_KERNEL
-
 /****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
@@ -69,6 +67,7 @@ int main(int argc, char *argv[]);
  *
  ****************************************************************************/
 
+#ifdef CONFIG_BUILD_KERNEL
 static void sig_trampoline(void) naked_function;
 static void sig_trampoline(void)
 {
@@ -91,6 +90,7 @@ static void sig_trampoline(void)
     :
   );
 }
+#endif
 
 /****************************************************************************
  * Public Data
@@ -107,7 +107,7 @@ extern initializer_t _edtors[];
  * Private Functions
  ****************************************************************************/
 
-#ifdef CONFIG_HAVE_CXX
+#ifdef CONFIG_HAVE_CXXINITIALIZE
 
 /****************************************************************************
  * Name: exec_ctors
@@ -175,25 +175,31 @@ void __start(int argc, char *argv[])
    * that is visible to the RTOS.
    */
 
+#ifdef CONFIG_BUILD_KERNEL
   ARCH_DATA_RESERVE->ar_sigtramp = (addrenv_sigtramp_t)sig_trampoline;
+#endif
 
-#ifdef CONFIG_HAVE_CXX
+#ifdef CONFIG_HAVE_CXXINITIALIZE
   /* Call C++ constructors */
 
   exec_ctors();
 
   /* Setup so that C++ destructors called on task exit */
 
+#  if CONFIG_LIBC_MAX_EXITFUNS > 0
   atexit(exec_dtors);
+#  endif
 #endif
 
   /* Call the main() entry point passing argc and argv. */
 
   ret = main(argc, argv);
 
+#if defined(CONFIG_HAVE_CXXINITIALIZE) && CONFIG_LIBC_MAX_EXITFUNS <= 0
+  exec_dtors();
+#endif
+
   /* Call exit() if/when the main() returns */
 
   exit(ret);
 }
-
-#endif /* CONFIG_BUILD_KERNEL */
diff --git a/arch/avr/src/avr/Toolchain.defs b/arch/avr/src/avr/Toolchain.defs
index 7d989a9240..ab60713eab 100644
--- a/arch/avr/src/avr/Toolchain.defs
+++ b/arch/avr/src/avr/Toolchain.defs
@@ -180,5 +180,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/avr/src/avr32/Toolchain.defs 
b/arch/avr/src/avr32/Toolchain.defs
index 24322a7ccd..b1745905bd 100644
--- a/arch/avr/src/avr32/Toolchain.defs
+++ b/arch/avr/src/avr32/Toolchain.defs
@@ -110,5 +110,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/ceva/src/xc5/Toolchain.defs b/arch/ceva/src/xc5/Toolchain.defs
index 8cbf082fe3..f1f556e030 100644
--- a/arch/ceva/src/xc5/Toolchain.defs
+++ b/arch/ceva/src/xc5/Toolchain.defs
@@ -99,5 +99,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/ceva/src/xm6/Toolchain.defs b/arch/ceva/src/xm6/Toolchain.defs
index db2a6a1769..5604220227 100644
--- a/arch/ceva/src/xm6/Toolchain.defs
+++ b/arch/ceva/src/xm6/Toolchain.defs
@@ -104,5 +104,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/mips/src/mips32/Toolchain.defs 
b/arch/mips/src/mips32/Toolchain.defs
index 225be8edb2..e2c88098e5 100644
--- a/arch/mips/src/mips32/Toolchain.defs
+++ b/arch/mips/src/mips32/Toolchain.defs
@@ -325,5 +325,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/misoc/src/lm32/Toolchain.defs 
b/arch/misoc/src/lm32/Toolchain.defs
index 932fe6dd77..821126ff79 100644
--- a/arch/misoc/src/lm32/Toolchain.defs
+++ b/arch/misoc/src/lm32/Toolchain.defs
@@ -141,5 +141,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/misoc/src/minerva/Toolchain.defs 
b/arch/misoc/src/minerva/Toolchain.defs
index 4967b6cb14..50b15eea6b 100644
--- a/arch/misoc/src/minerva/Toolchain.defs
+++ b/arch/misoc/src/minerva/Toolchain.defs
@@ -89,5 +89,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/or1k/src/mor1kx/Toolchain.defs 
b/arch/or1k/src/mor1kx/Toolchain.defs
index 5feaf57d55..a33d8e1c71 100644
--- a/arch/or1k/src/mor1kx/Toolchain.defs
+++ b/arch/or1k/src/mor1kx/Toolchain.defs
@@ -127,5 +127,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/risc-v/src/common/Make.defs b/arch/risc-v/src/common/Make.defs
index 68f0dbc527..b24560bb7d 100644
--- a/arch/risc-v/src/common/Make.defs
+++ b/arch/risc-v/src/common/Make.defs
@@ -20,9 +20,7 @@
 #
 ############################################################################
 
-ifeq ($(CONFIG_BUILD_KERNEL),y)
 STARTUP_OBJS = crt0$(OBJEXT)
-endif
 
 # Specify our general Assembly files
 CMN_ASRCS += riscv_vectors.S riscv_exception_common.S
diff --git a/arch/risc-v/src/common/Toolchain.defs 
b/arch/risc-v/src/common/Toolchain.defs
index 3fe0ab7a40..09b9400b7d 100644
--- a/arch/risc-v/src/common/Toolchain.defs
+++ b/arch/risc-v/src/common/Toolchain.defs
@@ -433,7 +433,7 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -e main
+LDELFFLAGS = -e __start
 
 ifeq ($(CONFIG_BINFMT_ELF_RELOCATABLE),y)
   LDELFFLAGS += -r
diff --git a/arch/risc-v/src/common/crt0.c b/arch/risc-v/src/common/crt0.c
index db7d51d8d5..73331e9fd3 100644
--- a/arch/risc-v/src/common/crt0.c
+++ b/arch/risc-v/src/common/crt0.c
@@ -35,8 +35,6 @@
 
 #include "riscv_internal.h"
 
-#ifdef CONFIG_BUILD_KERNEL
-
 /****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
@@ -66,6 +64,7 @@ int main(int argc, char *argv[]);
  *
  ****************************************************************************/
 
+#ifdef CONFIG_BUILD_KERNEL
 static void sig_trampoline(void) naked_function;
 static void sig_trampoline(void)
 {
@@ -88,6 +87,7 @@ static void sig_trampoline(void)
     :
   );
 }
+#endif
 
 /****************************************************************************
  * Public Data
@@ -104,7 +104,7 @@ extern initializer_t _edtors[];
  * Private Functions
  ****************************************************************************/
 
-#ifdef CONFIG_HAVE_CXX
+#ifdef CONFIG_HAVE_CXXINITIALIZE
 
 /****************************************************************************
  * Name: exec_ctors
@@ -172,25 +172,31 @@ void __start(int argc, char *argv[])
    * that is visible to the RTOS.
    */
 
+#ifdef CONFIG_BUILD_KERNEL
   ARCH_DATA_RESERVE->ar_sigtramp = (addrenv_sigtramp_t)sig_trampoline;
+#endif
 
-#ifdef CONFIG_HAVE_CXX
+#ifdef CONFIG_HAVE_CXXINITIALIZE
   /* Call C++ constructors */
 
   exec_ctors();
 
   /* Setup so that C++ destructors called on task exit */
 
+#  if CONFIG_LIBC_MAX_EXITFUNS > 0
   atexit(exec_dtors);
+#  endif
 #endif
 
   /* Call the main() entry point passing argc and argv. */
 
   ret = main(argc, argv);
 
+#if defined(CONFIG_HAVE_CXXINITIALIZE) && CONFIG_LIBC_MAX_EXITFUNS <= 0
+  exec_dtors();
+#endif
+
   /* Call exit() if/when the main() returns */
 
   exit(ret);
 }
-
-#endif /* CONFIG_BUILD_KERNEL */
diff --git a/arch/sparc/src/sparc_v8/Toolchain.defs 
b/arch/sparc/src/sparc_v8/Toolchain.defs
index a743abeec7..d5041d7d11 100644
--- a/arch/sparc/src/sparc_v8/Toolchain.defs
+++ b/arch/sparc/src/sparc_v8/Toolchain.defs
@@ -136,5 +136,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/tricore/src/common/ToolchainTasking.defs 
b/arch/tricore/src/common/ToolchainTasking.defs
index cf121918ee..6ae81f937c 100644
--- a/arch/tricore/src/common/ToolchainTasking.defs
+++ b/arch/tricore/src/common/ToolchainTasking.defs
@@ -138,5 +138,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/x86/src/common/Toolchain.defs 
b/arch/x86/src/common/Toolchain.defs
index f24da4a50c..641a9c7b1a 100644
--- a/arch/x86/src/common/Toolchain.defs
+++ b/arch/x86/src/common/Toolchain.defs
@@ -90,5 +90,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/x86_64/src/Makefile b/arch/x86_64/src/Makefile
index 80ef3a6b2b..45e1fdc859 100644
--- a/arch/x86_64/src/Makefile
+++ b/arch/x86_64/src/Makefile
@@ -115,11 +115,14 @@ $(AOBJS): %$(OBJEXT): %.S
 $(COBJS): %$(OBJEXT): %.c
        $(call COMPILE, $<, $@)
 
+$(STARTUP_OBJS): %$(OBJEXT): %.c
+       $(Q) $(CC) $(CELFFLAGS) -c common$(DELIM)crt0.c -o crt0$(OBJEXT)
+
 ifeq ($(CONFIG_BUILD_FLAT),y)
-$(BIN): $(OBJS)
+$(BIN): $(OBJS) $(STARTUP_OBJS)
        $(call ARCHIVE, $@, $(OBJS))
 else
-$(BIN): $(UOBJS)
+$(BIN): $(UOBJS) $(STARTUP_OBJS)
        $(call ARCHIVE, $@, $(UOBJS))
 endif
 
diff --git a/arch/x86_64/src/common/Make.defs b/arch/x86_64/src/common/Make.defs
index acc90a455a..88377c90a6 100644
--- a/arch/x86_64/src/common/Make.defs
+++ b/arch/x86_64/src/common/Make.defs
@@ -20,12 +20,7 @@
 #
 ############################################################################
 
-ifeq ($(CONFIG_BUILD_KERNEL),y)
-crt0$(OBJEXT): crt0.c
-       $(CC) $(CFLAGS) -c common$(DELIM)crt0.c -o crt0$(OBJEXT)
-
 STARTUP_OBJS = crt0$(OBJEXT)
-endif
 
 # Common x86_64 files
 
diff --git a/arch/x86_64/src/common/Toolchain.defs 
b/arch/x86_64/src/common/Toolchain.defs
index be3490a122..9206d4ed90 100644
--- a/arch/x86_64/src/common/Toolchain.defs
+++ b/arch/x86_64/src/common/Toolchain.defs
@@ -248,7 +248,14 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
+ifneq ($(CONFIG_BUILD_KERNEL),y)
+  # Flat build and protected elf entry point use crt0,
+  # Kernel build will use apps/import/scripts/crt0
+
+  LDELFFLAGS += $(TOPDIR)$(DELIM)arch$(DELIM)x86_64$(DELIM)src$(DELIM)crt0.o
+endif
+
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
 
 # -fno-pic to avoid GOT relocations
diff --git a/arch/x86_64/src/common/crt0.c b/arch/x86_64/src/common/crt0.c
index bb39d48e5b..54b26ec147 100644
--- a/arch/x86_64/src/common/crt0.c
+++ b/arch/x86_64/src/common/crt0.c
@@ -30,10 +30,20 @@
 #include <stdlib.h>
 
 #include <nuttx/addrenv.h>
+#include <nuttx/arch.h>
 
 #include <arch/syscall.h>
 
-#ifdef CONFIG_BUILD_KERNEL
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/* Linker defined symbols to .ctors and .dtors */
+
+extern initializer_t _sctors[];
+extern initializer_t _ectors[];
+extern initializer_t _sdtors[];
+extern initializer_t _edtors[];
 
 /****************************************************************************
  * Public Function Prototypes
@@ -58,6 +68,7 @@ int main(int argc, char *argv[]);
  *
  ****************************************************************************/
 
+#ifdef CONFIG_BUILD_KERNEL
 static void sig_trampoline(void) naked_function;
 static void sig_trampoline(void)
 {
@@ -77,6 +88,43 @@ static void sig_trampoline(void)
   );
 }
 
+#endif
+
+#ifdef CONFIG_HAVE_CXXINITIALIZE
+
+/****************************************************************************
+ * Name: exec_ctors
+ *
+ * Description:
+ *   Call static constructors
+ *
+ ****************************************************************************/
+
+static void exec_ctors(void)
+{
+  for (initializer_t *ctor = _sctors; ctor != _ectors; ctor++)
+    {
+      (*ctor)();
+    }
+}
+
+/****************************************************************************
+ * Name: exec_dtors
+ *
+ * Description:
+ *   Call static destructors
+ *
+ ****************************************************************************/
+
+static void exec_dtors(void)
+{
+  for (initializer_t *dtor = _sdtors; dtor != _edtors; dtor++)
+    {
+      (*dtor)();
+    }
+}
+
+#endif
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -109,15 +157,31 @@ void __start(int argc, char *argv[])
    * that is visible to the RTOS.
    */
 
+#ifdef CONFIG_BUILD_KERNEL
   ARCH_DATA_RESERVE->ar_sigtramp = (addrenv_sigtramp_t)sig_trampoline;
+#endif
+
+#ifdef CONFIG_HAVE_CXXINITIALIZE
+  /* Call C++ constructors */
+
+  exec_ctors();
+
+  /* Setup so that C++ destructors called on task exit */
+
+#  if CONFIG_LIBC_MAX_EXITFUNS > 0
+  atexit(exec_dtors);
+#  endif
+#endif
 
   /* Call the main() entry point passing argc and argv. */
 
   ret = main(argc, argv);
 
+#if defined(CONFIG_HAVE_CXXINITIALIZE) && CONFIG_LIBC_MAX_EXITFUNS <= 0
+  exec_dtors();
+#endif
+
   /* Call exit() if/when the main() returns */
 
   exit(ret);
 }
-
-#endif /* CONFIG_BUILD_KERNEL */
diff --git a/arch/xtensa/src/lx6/Toolchain.defs 
b/arch/xtensa/src/lx6/Toolchain.defs
index 8488e53475..e9dd39c0c9 100644
--- a/arch/xtensa/src/lx6/Toolchain.defs
+++ b/arch/xtensa/src/lx6/Toolchain.defs
@@ -217,5 +217,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mtext-section-literals
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -mtext-section-literals
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/xtensa/src/lx7/Toolchain.defs 
b/arch/xtensa/src/lx7/Toolchain.defs
index 51b1e4755d..963c784985 100644
--- a/arch/xtensa/src/lx7/Toolchain.defs
+++ b/arch/xtensa/src/lx7/Toolchain.defs
@@ -221,5 +221,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mtext-section-literals
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -mtext-section-literals
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/z80/src/ez80/Toolchain.defs b/arch/z80/src/ez80/Toolchain.defs
index 0e7b323357..ff8b88d099 100644
--- a/arch/z80/src/ez80/Toolchain.defs
+++ b/arch/z80/src/ez80/Toolchain.defs
@@ -222,5 +222,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/z80/src/z180/Toolchain.defs b/arch/z80/src/z180/Toolchain.defs
index f0392635c6..d6b21ac7b3 100644
--- a/arch/z80/src/z180/Toolchain.defs
+++ b/arch/z80/src/z180/Toolchain.defs
@@ -120,5 +120,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/z80/src/z8/Toolchain.defs b/arch/z80/src/z8/Toolchain.defs
index 79195a95fb..e2b825f598 100644
--- a/arch/z80/src/z8/Toolchain.defs
+++ b/arch/z80/src/z8/Toolchain.defs
@@ -145,5 +145,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/z80/src/z80/Toolchain.defs b/arch/z80/src/z80/Toolchain.defs
index 9072efcc42..645eaf2b3f 100644
--- a/arch/z80/src/z80/Toolchain.defs
+++ b/arch/z80/src/z80/Toolchain.defs
@@ -120,5 +120,5 @@ LDMODULEFLAGS = -r -T $(call 
CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
 CELFFLAGS = $(CFLAGS) -fvisibility=hidden
 CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
 
-LDELFFLAGS = -r -e main
+LDELFFLAGS = -r -e __start
 LDELFFLAGS += -T $(call 
CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/binfmt/Kconfig b/binfmt/Kconfig
index 585d878a4c..5a32240d70 100644
--- a/binfmt/Kconfig
+++ b/binfmt/Kconfig
@@ -66,7 +66,7 @@ endif
 config BINFMT_CONSTRUCTORS
        bool "C++ Static Constructor Support"
        default n
-       depends on HAVE_CXX && SCHED_STARTHOOK && ELF
+       depends on HAVE_CXX && ELF
        ---help---
                Built-in support for C++ constructors in loaded modules.  
Currently
                only support for ELF binary formats.
diff --git a/binfmt/binfmt_execmodule.c b/binfmt/binfmt_execmodule.c
index b8fe873eaf..d1c35d9b62 100644
--- a/binfmt/binfmt_execmodule.c
+++ b/binfmt/binfmt_execmodule.c
@@ -52,55 +52,10 @@
  * Pre-processor Definitions
  ****************************************************************************/
 
-/* If C++ constructors are used, then CONFIG_SCHED_STARTHOOK must also be
- * selected be the start hook is used to schedule execution of the
- * constructors.
- */
-
-#if defined(CONFIG_BINFMT_CONSTRUCTORS) && !defined(CONFIG_SCHED_STARTHOOK)
-#  error "CONFIG_SCHED_STARTHOOK must be defined to use constructors"
-#endif
-
 /****************************************************************************
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: exec_ctors
- *
- * Description:
- *   Execute C++ static constructors.  This function is registered as a
- *   start hook and runs on the thread of the newly created task before
- *   the new task's main function is called.
- *
- * Input Parameters:
- *   arg - Argument is instance of load state info structure cast to void *.
- *
- * Returned Value:
- *   0 (OK) is returned on success and a negated errno is returned on
- *   failure.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_BINFMT_CONSTRUCTORS
-static void exec_ctors(FAR void *arg)
-{
-  FAR const struct binary_s *binp = (FAR const struct binary_s *)arg;
-  binfmt_ctor_t *ctor = (CODE binfmt_ctor_t *)binp->mod.initarr;
-  int i;
-
-  /* Execute each constructor */
-
-  for (i = 0; i < binp->mod.ninit; i++)
-    {
-      binfo("Calling ctor %d at %p\n", i, ctor);
-
-      (*ctor)();
-      ctor++;
-    }
-}
-#endif
-
 /****************************************************************************
  * Name: exec_swap
  *
@@ -356,18 +311,6 @@ int exec_module(FAR struct binary_s *binp,
     }
 #endif
 
-#ifdef CONFIG_BINFMT_CONSTRUCTORS
-  /* Setup a start hook that will execute all of the C++ static constructors
-   * on the newly created thread.  The struct binary_s must persist at least
-   * until the new task has been started.
-   */
-
-  if (binp->mod.ninit > 0)
-    {
-      nxtask_starthook(tcb, exec_ctors, binp);
-    }
-#endif
-
 #ifdef CONFIG_SCHED_USER_IDENTITY
   if (binp->mode & S_ISUID)
     {
diff --git a/boards/arm/cxd56xx/spresense/configs/elf/defconfig 
b/boards/arm/cxd56xx/spresense/configs/elf/defconfig
index 5e440f0e4a..ea85276d00 100644
--- a/boards/arm/cxd56xx/spresense/configs/elf/defconfig
+++ b/boards/arm/cxd56xx/spresense/configs/elf/defconfig
@@ -44,7 +44,6 @@ CONFIG_RAM_START=0x0d000000
 CONFIG_RR_INTERVAL=200
 CONFIG_RTC=y
 CONFIG_RTC_DRIVER=y
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SCHED_WAITPID=y
 CONFIG_SPI=y
 CONFIG_STACK_COLORATION=y
diff --git a/boards/arm/imx6/sabre-6quad/configs/elf/defconfig 
b/boards/arm/imx6/sabre-6quad/configs/elf/defconfig
index 0fc0f31e6f..02b1fc9678 100644
--- a/boards/arm/imx6/sabre-6quad/configs/elf/defconfig
+++ b/boards/arm/imx6/sabre-6quad/configs/elf/defconfig
@@ -47,7 +47,6 @@ CONFIG_RAM_START=0x10000000
 CONFIG_RAM_VSTART=0x10000000
 CONFIG_RAW_BINARY=y
 CONFIG_RR_INTERVAL=200
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SCHED_WAITPID=y
 CONFIG_STACK_COLORATION=y
 CONFIG_START_DAY=17
diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/audio/defconfig 
b/boards/arm/lc823450/lc823450-xgevk/configs/audio/defconfig
index 50e25893f8..83c19b016b 100644
--- a/boards/arm/lc823450/lc823450-xgevk/configs/audio/defconfig
+++ b/boards/arm/lc823450/lc823450-xgevk/configs/audio/defconfig
@@ -103,7 +103,6 @@ CONFIG_RTC=y
 CONFIG_RTC_HIRES=y
 CONFIG_SCHED_CHILD_STATUS=y
 CONFIG_SCHED_HAVE_PARENT=y
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SERIAL_TERMIOS=y
 CONFIG_SMP=y
 CONFIG_SMP_NCPUS=2
diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/bt/defconfig 
b/boards/arm/lc823450/lc823450-xgevk/configs/bt/defconfig
index f0aa32439e..ca8f736496 100644
--- a/boards/arm/lc823450/lc823450-xgevk/configs/bt/defconfig
+++ b/boards/arm/lc823450/lc823450-xgevk/configs/bt/defconfig
@@ -122,7 +122,6 @@ CONFIG_SCHED_CHILD_STATUS=y
 CONFIG_SCHED_HAVE_PARENT=y
 CONFIG_SCHED_LPWORK=y
 CONFIG_SCHED_LPWORKPRIORITY=60
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SENSORS=y
 CONFIG_SERIAL_TERMIOS=y
 CONFIG_SMP=y
diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/elf/defconfig 
b/boards/arm/lc823450/lc823450-xgevk/configs/elf/defconfig
index 7330aeacb4..dd78b9b4ba 100644
--- a/boards/arm/lc823450/lc823450-xgevk/configs/elf/defconfig
+++ b/boards/arm/lc823450/lc823450-xgevk/configs/elf/defconfig
@@ -53,7 +53,6 @@ CONFIG_SCHED_CHILD_STATUS=y
 CONFIG_SCHED_HAVE_PARENT=y
 CONFIG_SCHED_INSTRUMENTATION=y
 CONFIG_SCHED_INSTRUMENTATION_SWITCH=y
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SCHED_WAITPID=y
 CONFIG_SERIAL_TERMIOS=y
 CONFIG_START_DAY=3
diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/ipl2/defconfig 
b/boards/arm/lc823450/lc823450-xgevk/configs/ipl2/defconfig
index cf0e7ad7a2..ce70320751 100644
--- a/boards/arm/lc823450/lc823450-xgevk/configs/ipl2/defconfig
+++ b/boards/arm/lc823450/lc823450-xgevk/configs/ipl2/defconfig
@@ -52,7 +52,6 @@ CONFIG_SCHED_CHILD_STATUS=y
 CONFIG_SCHED_HAVE_PARENT=y
 CONFIG_SCHED_INSTRUMENTATION=y
 CONFIG_SCHED_INSTRUMENTATION_SWITCH=y
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SCHED_WAITPID=y
 CONFIG_SENSORS=y
 CONFIG_SERIAL_TERMIOS=y
diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/knsh/defconfig 
b/boards/arm/lc823450/lc823450-xgevk/configs/knsh/defconfig
index fa068b00e7..24b488c1a7 100644
--- a/boards/arm/lc823450/lc823450-xgevk/configs/knsh/defconfig
+++ b/boards/arm/lc823450/lc823450-xgevk/configs/knsh/defconfig
@@ -95,7 +95,6 @@ CONFIG_SCHED_CHILD_STATUS=y
 CONFIG_SCHED_HAVE_PARENT=y
 CONFIG_SCHED_INSTRUMENTATION=y
 CONFIG_SCHED_INSTRUMENTATION_SWITCH=y
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SCHED_WAITPID=y
 CONFIG_SERIAL_TERMIOS=y
 CONFIG_SPI=y
diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/krndis/defconfig 
b/boards/arm/lc823450/lc823450-xgevk/configs/krndis/defconfig
index af3e8867fa..b5cd6c8c42 100644
--- a/boards/arm/lc823450/lc823450-xgevk/configs/krndis/defconfig
+++ b/boards/arm/lc823450/lc823450-xgevk/configs/krndis/defconfig
@@ -151,7 +151,6 @@ CONFIG_SCHED_INSTRUMENTATION_PREEMPTION=y
 CONFIG_SCHED_INSTRUMENTATION_SWITCH=y
 CONFIG_SCHED_LPWORK=y
 CONFIG_SCHED_LPWORKPRIORITY=60
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SCHED_WAITPID=y
 CONFIG_SENSORS=y
 CONFIG_SERIAL_TERMIOS=y
diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/nsh/defconfig 
b/boards/arm/lc823450/lc823450-xgevk/configs/nsh/defconfig
index 1c9e5f49b0..6d72a09e21 100644
--- a/boards/arm/lc823450/lc823450-xgevk/configs/nsh/defconfig
+++ b/boards/arm/lc823450/lc823450-xgevk/configs/nsh/defconfig
@@ -97,7 +97,6 @@ CONFIG_RTC=y
 CONFIG_RTC_DATETIME=y
 CONFIG_SCHED_CHILD_STATUS=y
 CONFIG_SCHED_HAVE_PARENT=y
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SCHED_WAITPID=y
 CONFIG_SERIAL_TERMIOS=y
 CONFIG_SMP=y
diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/posix_spawn/defconfig 
b/boards/arm/lc823450/lc823450-xgevk/configs/posix_spawn/defconfig
index 6e47075ae1..44dc7acab6 100644
--- a/boards/arm/lc823450/lc823450-xgevk/configs/posix_spawn/defconfig
+++ b/boards/arm/lc823450/lc823450-xgevk/configs/posix_spawn/defconfig
@@ -52,7 +52,6 @@ CONFIG_SCHED_CHILD_STATUS=y
 CONFIG_SCHED_HAVE_PARENT=y
 CONFIG_SCHED_INSTRUMENTATION=y
 CONFIG_SCHED_INSTRUMENTATION_SWITCH=y
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SCHED_WAITPID=y
 CONFIG_SERIAL_TERMIOS=y
 CONFIG_START_DAY=3
diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/rndis/defconfig 
b/boards/arm/lc823450/lc823450-xgevk/configs/rndis/defconfig
index 930a46fab1..ef45d9acfa 100644
--- a/boards/arm/lc823450/lc823450-xgevk/configs/rndis/defconfig
+++ b/boards/arm/lc823450/lc823450-xgevk/configs/rndis/defconfig
@@ -147,7 +147,6 @@ CONFIG_SCHED_HPWORK=y
 CONFIG_SCHED_HPWORKPRIORITY=192
 CONFIG_SCHED_LPWORK=y
 CONFIG_SCHED_LPWORKPRIORITY=60
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SENSORS=y
 CONFIG_SERIAL_TERMIOS=y
 CONFIG_SMP=y
diff --git a/boards/arm/lc823450/lc823450-xgevk/configs/usb/defconfig 
b/boards/arm/lc823450/lc823450-xgevk/configs/usb/defconfig
index 8700b61662..82b237309b 100644
--- a/boards/arm/lc823450/lc823450-xgevk/configs/usb/defconfig
+++ b/boards/arm/lc823450/lc823450-xgevk/configs/usb/defconfig
@@ -99,7 +99,6 @@ CONFIG_RTC=y
 CONFIG_RTC_DATETIME=y
 CONFIG_SCHED_CHILD_STATUS=y
 CONFIG_SCHED_HAVE_PARENT=y
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SENSORS=y
 CONFIG_SERIAL_TERMIOS=y
 CONFIG_SMP=y
diff --git a/boards/arm/stm32/olimex-stm32-p407/configs/kelf/defconfig 
b/boards/arm/stm32/olimex-stm32-p407/configs/kelf/defconfig
index 7f678543c0..88e6e2feef 100644
--- a/boards/arm/stm32/olimex-stm32-p407/configs/kelf/defconfig
+++ b/boards/arm/stm32/olimex-stm32-p407/configs/kelf/defconfig
@@ -44,7 +44,6 @@ CONFIG_RAM_SIZE=114688
 CONFIG_RAM_START=0x20000000
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_HPWORK=y
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=4
 CONFIG_START_MONTH=8
diff --git a/boards/arm/stm32/stm32f4discovery/configs/elf/defconfig 
b/boards/arm/stm32/stm32f4discovery/configs/elf/defconfig
index 95a1abc7cc..71c641aad4 100644
--- a/boards/arm/stm32/stm32f4discovery/configs/elf/defconfig
+++ b/boards/arm/stm32/stm32f4discovery/configs/elf/defconfig
@@ -35,7 +35,6 @@ CONFIG_RAM_SIZE=114688
 CONFIG_RAM_START=0x20000000
 CONFIG_RAW_BINARY=y
 CONFIG_RR_INTERVAL=200
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_START_DAY=26
 CONFIG_START_MONTH=10
 CONFIG_START_YEAR=2012
diff --git a/boards/arm/stm32/stm32f4discovery/configs/posix_spawn/defconfig 
b/boards/arm/stm32/stm32f4discovery/configs/posix_spawn/defconfig
index 7efe0e3858..9f49ec4157 100644
--- a/boards/arm/stm32/stm32f4discovery/configs/posix_spawn/defconfig
+++ b/boards/arm/stm32/stm32f4discovery/configs/posix_spawn/defconfig
@@ -37,7 +37,6 @@ CONFIG_RAM_SIZE=114688
 CONFIG_RAM_START=0x20000000
 CONFIG_RAW_BINARY=y
 CONFIG_RR_INTERVAL=200
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_START_DAY=26
 CONFIG_START_MONTH=10
 CONFIG_START_YEAR=2012
diff --git a/boards/risc-v/k210/maix-bit/configs/smp2/defconfig 
b/boards/risc-v/k210/maix-bit/configs/smp2/defconfig
index ada4d0b91b..576bf7dc5b 100644
--- a/boards/risc-v/k210/maix-bit/configs/smp2/defconfig
+++ b/boards/risc-v/k210/maix-bit/configs/smp2/defconfig
@@ -46,7 +46,6 @@ CONFIG_SCHED_CHILD_STATUS=y
 CONFIG_SCHED_HAVE_PARENT=y
 CONFIG_SCHED_INSTRUMENTATION=y
 CONFIG_SCHED_INSTRUMENTATION_SWITCH=y
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SMP=y
 CONFIG_SMP_NCPUS=2
 CONFIG_STACK_COLORATION=y
diff --git a/boards/xtensa/esp32/esp32-devkitc/configs/elf/defconfig 
b/boards/xtensa/esp32/esp32-devkitc/configs/elf/defconfig
index c40dc7f089..94ae8f5e79 100644
--- a/boards/xtensa/esp32/esp32-devkitc/configs/elf/defconfig
+++ b/boards/xtensa/esp32/esp32-devkitc/configs/elf/defconfig
@@ -52,7 +52,6 @@ CONFIG_RAM_START=0x20000000
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_HPWORK=y
 CONFIG_SCHED_LPWORK=y
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SCHED_WAITPID=y
 CONFIG_STACK_COLORATION=y
 CONFIG_START_DAY=6
diff --git a/boards/xtensa/esp32s3/esp32s3-devkit/configs/elf/defconfig 
b/boards/xtensa/esp32s3/esp32s3-devkit/configs/elf/defconfig
index 4ffa9af75f..ae76c348f9 100644
--- a/boards/xtensa/esp32s3/esp32s3-devkit/configs/elf/defconfig
+++ b/boards/xtensa/esp32s3/esp32s3-devkit/configs/elf/defconfig
@@ -51,7 +51,6 @@ CONFIG_RAM_START=0x20000000
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_HPWORK=y
 CONFIG_SCHED_LPWORK=y
-CONFIG_SCHED_STARTHOOK=y
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=6
 CONFIG_START_MONTH=12
diff --git a/include/nuttx/sched.h b/include/nuttx/sched.h
index ce0ee8ce51..018abb6a42 100644
--- a/include/nuttx/sched.h
+++ b/include/nuttx/sched.h
@@ -297,12 +297,6 @@ union entry_u
 
 typedef union entry_u entry_t;
 
-/* This is the type of the function called at task startup */
-
-#ifdef CONFIG_SCHED_STARTHOOK
-typedef CODE void (*starthook_t)(FAR void *arg);
-#endif
-
 /* struct sporadic_s ********************************************************/
 
 #ifdef CONFIG_SCHED_SPORADIC
@@ -744,13 +738,6 @@ struct task_tcb_s
   /* Task Group *************************************************************/
 
   struct task_group_s group;             /* Shared task group data          */
-
-  /* Task Management Fields *************************************************/
-
-#ifdef CONFIG_SCHED_STARTHOOK
-  starthook_t starthook;                 /* Task startup function           */
-  FAR void *starthookarg;                /* The argument passed to the hook */
-#endif
 };
 
 /* struct pthread_tcb_s *****************************************************/
@@ -1129,30 +1116,6 @@ int nxtask_delete(pid_t pid);
 
 void nxtask_activate(FAR struct tcb_s *tcb);
 
-/****************************************************************************
- * Name: nxtask_starthook
- *
- * Description:
- *   Configure a start hook... a function that will be called on the thread
- *   of the new task before the new task's main entry point is called.
- *   The start hook is useful, for example, for setting up automatic
- *   configuration of C++ constructors.
- *
- * Input Parameters:
- *   tcb - The new, unstarted task task that needs the start hook
- *   starthook - The pointer to the start hook function
- *   arg - The argument to pass to the start hook function.
- *
- * Returned Value:
- *   None
- *
- ****************************************************************************/
-
-#ifdef CONFIG_SCHED_STARTHOOK
-void nxtask_starthook(FAR struct task_tcb_s *tcb, starthook_t starthook,
-                      FAR void *arg);
-#endif
-
 /****************************************************************************
  * Name: nxtask_startup
  *
diff --git a/sched/Kconfig b/sched/Kconfig
index 07b616d794..09a7b315a0 100644
--- a/sched/Kconfig
+++ b/sched/Kconfig
@@ -1564,16 +1564,6 @@ config BOARD_INITTHREAD_PRIORITY
 
 endif # BOARD_LATE_INITIALIZE
 
-config SCHED_STARTHOOK
-       bool "Enable startup hook"
-       default n
-       ---help---
-               Enable a non-standard, internal OS API call nxtask_starthook().
-               nxtask_starthook() registers a function that will be called on 
task
-               startup before that actual task entry point is called.  The
-               starthook is useful, for example, for setting up automatic
-               configuration of C++ constructors.
-
 endmenu # RTOS hooks
 
 menu "Signal Configuration"
diff --git a/sched/task/CMakeLists.txt b/sched/task/CMakeLists.txt
index 34ee0b7fc5..fdc19fdc58 100644
--- a/sched/task/CMakeLists.txt
+++ b/sched/task/CMakeLists.txt
@@ -60,8 +60,4 @@ if(NOT CONFIG_BINFMT_DISABLE)
   endif()
 endif()
 
-if(CONFIG_SCHED_STARTHOOK)
-  list(APPEND SRCS task_starthook.c)
-endif()
-
 target_sources(sched PRIVATE ${SRCS})
diff --git a/sched/task/Make.defs b/sched/task/Make.defs
index 91281e556f..1fd24403b5 100644
--- a/sched/task/Make.defs
+++ b/sched/task/Make.defs
@@ -44,10 +44,6 @@ CSRCS += task_execve.c task_posixspawn.c
 endif
 endif
 
-ifeq ($(CONFIG_SCHED_STARTHOOK),y)
-CSRCS += task_starthook.c
-endif
-
 # Include task build support
 
 DEPPATH += --dep-path task
diff --git a/sched/task/task_start.c b/sched/task/task_start.c
index bcd63755cd..815b78bc06 100644
--- a/sched/task/task_start.c
+++ b/sched/task/task_start.c
@@ -69,9 +69,6 @@ void nxtask_start(void)
 {
   FAR struct tcb_s *tcb = this_task();
   uint8_t ttype = tcb->flags & TCB_FLAG_TTYPE_MASK;
-#ifdef CONFIG_SCHED_STARTHOOK
-  FAR struct task_tcb_s *ttcb = (FAR struct task_tcb_s *)tcb;
-#endif
   int exitcode = EXIT_FAILURE;
   FAR char **argv;
   int argc;
@@ -87,15 +84,6 @@ void nxtask_start(void)
     }
 #endif
 
-  /* Execute the start hook if one has been registered */
-
-#ifdef CONFIG_SCHED_STARTHOOK
-  if (ttype != TCB_FLAG_TTYPE_KERNEL && ttcb->starthook != NULL)
-    {
-      ttcb->starthook(ttcb->starthookarg);
-    }
-#endif
-
   /* Take args from stack, as group is shared for kthreads */
 
   argv = nxsched_get_stackargs(tcb);
diff --git a/sched/task/task_starthook.c b/sched/task/task_starthook.c
deleted file mode 100644
index c0ae56f4f4..0000000000
--- a/sched/task/task_starthook.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/****************************************************************************
- * sched/task/task_starthook.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.  The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <assert.h>
-#include <nuttx/sched.h>
-
-#include "task/task.h"
-
-#ifdef CONFIG_SCHED_STARTHOOK
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: nxtask_starthook
- *
- * Description:
- *   Configure a start hook... a function that will be called on the thread
- *   of the new task before the new task's main entry point is called.
- *   The start hook is useful, for example, for setting up automatic
- *   configuration of C++ constructors.
- *
- * Input Parameters:
- *   tcb - The new, unstarted task task that needs the start hook
- *   starthook - The pointer to the start hook function
- *   arg - The argument to pass to the start hook function.
- *
- * Returned Value:
- *   None
- *
- ****************************************************************************/
-
-void nxtask_starthook(FAR struct task_tcb_s *tcb, starthook_t starthook,
-                      FAR void *arg)
-{
-  /* Only tasks can have starthooks.  The starthook will be called when the
-   * task is started (or restarted).
-   */
-
-#ifndef CONFIG_DISABLE_PTHREAD
-  DEBUGASSERT(tcb &&
-              (tcb->cmn.flags & TCB_FLAG_TTYPE_MASK) !=
-               TCB_FLAG_TTYPE_PTHREAD);
-#endif
-
-  /* Set up the start hook */
-
-  tcb->starthook    = starthook;
-  tcb->starthookarg = arg;
-}
-
-#endif /* CONFIG_SCHED_STARTHOOK */


Reply via email to