Index: libexec/ld.elf_so/headers.c =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/headers.c,v retrieving revision 1.76 diff -u -p -r1.76 headers.c --- libexec/ld.elf_so/headers.c 15 Dec 2025 02:36:46 -0000 1.76 +++ libexec/ld.elf_so/headers.c 9 Feb 2026 10:40:10 -0000 @@ -345,6 +345,21 @@ _rtld_digest_dynamic(const char *execnam break; #endif +#ifdef HAVE_INITFINI_ARRAY + case DT_PREINIT_ARRAY: + obj->preinit_array = + (fptr_t *)(obj->relocbase + dynp->d_un.d_ptr); + dbg(("headers: DT_PREINIT_ARRAY at %p", + obj->preinit_array)); + break; + + case DT_PREINIT_ARRAYSZ: + obj->preinit_arraysz = dynp->d_un.d_val / sizeof(fptr_t); + dbg(("headers: DT_PREINIT_ARRAYZ %zu", + obj->preinit_arraysz)); + break; +#endif + /* * Don't process DT_DEBUG on MIPS as the dynamic * section is mapped read-only. DT_MIPS_RLD_MAP or Index: libexec/ld.elf_so/rtld.c =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/rtld.c,v retrieving revision 1.222 diff -u -p -r1.222 rtld.c --- libexec/ld.elf_so/rtld.c 6 Jan 2026 07:01:48 -0000 1.222 +++ libexec/ld.elf_so/rtld.c 9 Feb 2026 10:40:10 -0000 @@ -133,6 +133,7 @@ extern Elf_Dyn _DYNAMIC; static void _rtld_call_fini_functions(sigset_t *, int); static void _rtld_call_init_functions(sigset_t *); +static void _rtld_call_preinit_functions(sigset_t *); static void _rtld_initlist_visit(Objlist *, Obj_Entry *, int); static void _rtld_initlist_tsort(Objlist *, int); static Obj_Entry *_rtld_dlcheck(void *); @@ -286,6 +287,26 @@ _rtld_call_ifunc_functions(sigset_t *mas } static void +_rtld_call_preinit_functions(sigset_t *mask) +{ +#ifdef HAVE_INITFINI_ARRAY + Obj_Entry *obj = _rtld_objmain; + + /* + * Process the init_array if it exists. Simply go from start + * to end. + */ + while (obj->preinit_arraysz > 0) { + fptr_t preinit = *obj->preinit_array++; + obj->preinit_arraysz--; + dbg (("calling preinit_array function %s at %p", + obj->path, (void *)preinit)); + _rtld_call_initfini_function(preinit, mask); + } +#endif /* HAVE_INITFINI_ARRAY */ +} + +static void _rtld_call_init_functions(sigset_t *mask) { Objlist_Entry *elm; @@ -798,6 +819,9 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase) _rtld_exclusive_enter(&mask); + dbg(("calling main preinit array functions")); + _rtld_call_preinit_functions(&mask); + dbg(("calling _init functions")); _rtld_call_init_functions(&mask); Index: libexec/ld.elf_so/rtld.h =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/rtld.h,v retrieving revision 1.154 diff -u -p -r1.154 rtld.h --- libexec/ld.elf_so/rtld.h 18 Jan 2026 19:19:09 -0000 1.154 +++ libexec/ld.elf_so/rtld.h 9 Feb 2026 10:40:10 -0000 @@ -309,6 +309,8 @@ typedef struct Struct_Obj_Entry { size_t init_arraysz; /* # of entries in it */ fptr_t *fini_array; /* start of fini array */ size_t fini_arraysz; /* # of entries in it */ + fptr_t *preinit_array; /* start of preinit array */ + size_t preinit_arraysz;/* # of entries in it */ /* IRELATIVE relocations */ size_t ifunc_remaining; #if \