From: Alexander Bluhm Subject: Re: ld.so not calling destructor To: ASOU Masato Cc: tech@openbsd.org, Philip Guenther Date: Wed, 12 Feb 2025 13:55:58 +0100 On Fri, Jan 17, 2025 at 02:24:12PM +0900, ASOU Masato wrote: > On Fri, Jan 17, 2025 at 2:19???PM ASOU Masato wrote: > > I applied your patch and following diff: With a slightly different patch for ld.so, only run-regress-prog1 of regress is failing. I moved down the call to _dl_unlink_children() a bit. Also with this fix, a workaround a patch for llvm-openmp can be removed. It seems that the callbacks are called in the right order now. Nevertheless, the failing regress looks relevant regarding ordering of destructors and needs more thoughts. bluhm Index: libexec/ld.so/library_subr.c =================================================================== RCS file: /mount/openbsd/cvs/src/libexec/ld.so/library_subr.c,v diff -u -p -r1.55 library_subr.c --- libexec/ld.so/library_subr.c 27 Apr 2023 12:27:56 -0000 1.55 +++ libexec/ld.so/library_subr.c 12 Feb 2025 12:21:32 -0000 @@ -533,6 +533,17 @@ _dl_link_child(elf_object_t *dep, elf_ob } void +_dl_unlink_children(void) +{ + elf_object_t *node; + + for (node = _dl_objects; node != NULL; node = node->next) { + if (node->refcount > 0) + _dl_child_refcnt_decrement(node); + } +} + +void object_vec_grow(struct object_vector *vec, int more) { vec->alloc += more; Index: libexec/ld.so/loader.c =================================================================== RCS file: /mount/openbsd/cvs/src/libexec/ld.so/loader.c,v diff -u -p -r1.223 loader.c --- libexec/ld.so/loader.c 22 Jan 2024 02:08:31 -0000 1.223 +++ libexec/ld.so/loader.c 12 Feb 2025 12:21:55 -0000 @@ -208,6 +208,7 @@ _dl_dtors(void) _dl_objects->opencount--; _dl_notify_unload_shlib(_dl_objects); + _dl_unlink_children(); _dl_run_all_dtors(); } Index: libexec/ld.so/resolve.h =================================================================== RCS file: /mount/openbsd/cvs/src/libexec/ld.so/resolve.h,v diff -u -p -r1.108 resolve.h --- libexec/ld.so/resolve.h 21 May 2024 05:00:47 -0000 1.108 +++ libexec/ld.so/resolve.h 12 Feb 2025 12:21:32 -0000 @@ -318,6 +318,7 @@ int _dl_load_dep_libs(elf_object_t *obje int _dl_rtld(elf_object_t *object); void _dl_call_init(elf_object_t *object); void _dl_link_child(elf_object_t *dep, elf_object_t *p); +void _dl_unlink_children(void); void _dl_link_grpsym(elf_object_t *object); void _dl_cache_grpsym_list_setup(elf_object_t *_object); void _dl_link_grpref(elf_object_t *load_group, elf_object_t *load_object);