Index: cpukit/libcsupport/src/newlibc_exit.c
===================================================================
--- cpukit/libcsupport/src/newlibc_exit.c	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/libcsupport/src/newlibc_exit.c	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -18,9 +18,6 @@
 #include <unistd.h>
 
-/* FIXME: These defines are a blatant hack */
-
   #if defined(__USE_INIT_FINI__)
-    #if defined(__ARM_EABI__) || defined(__riscv) \
-      || defined(__or1k__) || defined(__or1knd__)
+    #if CPU_USE_LIBC_INIT_FINI_ARRAY == TRUE
       #define FINI_SYMBOL __libc_fini_array
     #else
Index: cpukit/score/cpu/arm/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/arm/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/arm/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -153,4 +153,6 @@
 
 #define CPU_USE_GENERIC_BITFIELD_CODE TRUE
+
+#define CPU_USE_LIBC_INIT_FINI_ARRAY TRUE
 
 #define CPU_MAXIMUM_PROCESSORS 32
Index: cpukit/score/cpu/bfin/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/bfin/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/bfin/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -508,4 +508,6 @@
 #define CPU_USE_GENERIC_BITFIELD_CODE TRUE
 
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
+
 /* functions */
 
Index: cpukit/score/cpu/epiphany/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/epiphany/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/epiphany/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -446,4 +446,6 @@
 #define CPU_USE_GENERIC_BITFIELD_CODE TRUE
 
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
+
 #endif /* ASM */
 
Index: cpukit/score/cpu/i386/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/i386/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/i386/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -504,4 +504,6 @@
 /* end of Fatal Error manager macros */
 
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
+
 /*
  *  Bitfield handler macros
Index: cpukit/score/cpu/lm32/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/lm32/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/lm32/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -629,4 +629,6 @@
 #define CPU_USE_GENERIC_BITFIELD_CODE TRUE
 
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
+
 /* functions */
 
Index: cpukit/score/cpu/m68k/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/m68k/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/m68k/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -433,4 +433,6 @@
 
 /* end of Fatal Error manager macros */
+
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
 
 /*
Index: cpukit/score/cpu/mips/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/mips/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/mips/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -741,4 +741,6 @@
 #define CPU_USE_GENERIC_BITFIELD_CODE TRUE
 
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
+
 /* functions */
 
Index: cpukit/score/cpu/moxie/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/moxie/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/moxie/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -428,4 +428,6 @@
 #define CPU_USE_GENERIC_BITFIELD_CODE TRUE
 
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
+
 /* functions */
 
Index: cpukit/score/cpu/nios2/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/nios2/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/nios2/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -90,4 +90,6 @@
 
 #define CPU_USE_GENERIC_BITFIELD_CODE TRUE
+
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
 
 #define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
Index: cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -249,4 +249,11 @@
  */
 #define CPU_MAXIMUM_PROCESSORS 32
+
+/**
+ * The following define determines whether or not this CPU port will use
+ * libc global constructors and destructors instead of _init/_fini functions
+ * depending on .ctors and .dtors linker sections.
+ */
+#define CPU_USE_LIBC_INIT_FINI_ARRAY TRUE
 
 /*
Index: cpukit/score/cpu/or1k/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/or1k/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/or1k/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -436,4 +436,6 @@
 #define CPU_USE_GENERIC_BITFIELD_CODE TRUE
 
+#define CPU_USE_LIBC_INIT_FINI_ARRAY TRUE
+
 #endif /* ASM */
 
Index: cpukit/score/cpu/powerpc/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/powerpc/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/powerpc/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -806,4 +806,7 @@
 
 #ifndef ASM
+
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
+
 /* Bitfield handler macros */
 
Index: cpukit/score/cpu/riscv/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/riscv/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/riscv/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -219,4 +219,6 @@
 
 #define CPU_USE_GENERIC_BITFIELD_DATA TRUE
+
+#define CPU_USE_LIBC_INIT_FINI_ARRAY TRUE
 
 #define CPU_MAXIMUM_PROCESSORS 32
Index: cpukit/score/cpu/sh/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/sh/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/sh/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -536,4 +536,6 @@
 #define CPU_USE_GENERIC_BITFIELD_CODE TRUE
 
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
+
 /* functions */
 
Index: cpukit/score/cpu/sparc/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/sparc/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/sparc/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -918,4 +918,6 @@
 /* end of Fatal Error manager macros */
 
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
+
 /* Bitfield handler macros */
 
Index: cpukit/score/cpu/sparc64/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/sparc64/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/sparc64/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -802,4 +802,6 @@
 /* end of Fatal Error manager macros */
 
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
+
 /* Bitfield handler macros */
 
Index: cpukit/score/cpu/v850/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/v850/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/v850/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -494,4 +494,6 @@
 #define CPU_USE_GENERIC_BITFIELD_CODE TRUE
 
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
+
 /* functions */
 
Index: cpukit/score/cpu/x86_64/include/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/x86_64/include/rtems/score/cpu.h	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/cpu/x86_64/include/rtems/score/cpu.h	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -243,4 +243,6 @@
 /* end of Fatal Error manager macros */
 
+#define CPU_USE_LIBC_INIT_FINI_ARRAY FALSE
+
 /* Bitfield handler macros */
 
Index: cpukit/score/src/threadhandler.c
===================================================================
--- cpukit/score/src/threadhandler.c	(revision 37c36def7a7ef4488c68958735275fb23b80fd86)
+++ cpukit/score/src/threadhandler.c	(revision 48dd7b8c2ef7056ff4730c378ccd7e9445b5e40f)
@@ -29,7 +29,11 @@
  *  initialization this target and compiler version uses.
  */
+RTEMS_STATIC_ASSERT(
+  CPU_USE_LIBC_INIT_FINI_ARRAY == TRUE
+    || CPU_USE_LIBC_INIT_FINI_ARRAY == FALSE,
+  CPU_USE_LIBC_INIT_FINI_ARRAY
+);
 #if defined(__USE_INIT_FINI__)
-  #if defined(__ARM_EABI__) || defined(__riscv) \
-    || defined(__or1k__) || defined(__or1knd__)
+  #if CPU_USE_LIBC_INIT_FINI_ARRAY == TRUE
     #define INIT_NAME __libc_init_array
   #else
