diff --git a/elf/Makefile b/elf/Makefile index 9cfe738919..fda796f6d5 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -415,7 +415,6 @@ tests += \ tst-dlmopen3 \ tst-dlmopen4 \ tst-dlopen-auditdup \ - tst-dlopen-recurse \ tst-dlopen-self \ tst-dlopen-tlsmodid \ tst-dlopen-tlsreinit1 \ @@ -869,8 +868,6 @@ modules-names += \ tst-dlmopen1mod \ tst-dlopen-auditdup-auditmod \ tst-dlopen-auditdupmod \ - tst-dlopen-recursemod1 \ - tst-dlopen-recursemod2 \ tst-dlopen-tlsreinitmod1 \ tst-dlopen-tlsreinitmod2 \ tst-dlopen-tlsreinitmod3 \ @@ -3160,8 +3157,6 @@ tst-dlopen-tlsreinit3-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so $(objpfx)tst-dlopen-tlsreinit4.out: $(objpfx)tst-auditmod1.so tst-dlopen-tlsreinit4-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so -$(objpfx)tst-dlopen-recurse.out: $(objpfx)tst-dlopen-recursemod1.so -$(objpfx)tst-dlopen-recursemod1.so: $(objpfx)tst-dlopen-recursemod2.so tst-dlopen-auditdup-ENV = LD_AUDIT=$(objpfx)tst-dlopen-auditdup-auditmod.so $(objpfx)tst-dlopen-auditdup.out: \ $(objpfx)tst-dlopen-auditdupmod.so $(objpfx)tst-dlopen-auditdup-auditmod.so diff --git a/elf/dl-open.c b/elf/dl-open.c index 1d943dfbc3..ba3c266e6a 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -594,14 +594,6 @@ dl_open_worker_begin (void *a) if ((mode & RTLD_GLOBAL) && new->l_global == 0) add_to_global_update (new); - /* Do not return without calling the (supposedly new) map's - constructor. This case occurs if a dependency of a directly - opened map has a constructor that calls dlopen again on the - initially opened map. The new map is initialized last, so - checking only it is enough. */ - if (!new->l_init_called) - _dl_catch_exception (NULL, call_dl_init, args); - return; } diff --git a/elf/dl-support.c b/elf/dl-support.c index 94e8197c63..451932dd03 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -99,7 +99,6 @@ static struct link_map _dl_main_map = .l_used = 1, .l_tls_offset = NO_TLS_OFFSET, .l_serial = 1, - .l_init_called = 1, }; /* Namespace information. */ diff --git a/elf/tst-dlopen-auditdup-auditmod.c b/elf/tst-dlopen-auditdup-auditmod.c index 9b67295e94..270a595ec4 100644 --- a/elf/tst-dlopen-auditdup-auditmod.c +++ b/elf/tst-dlopen-auditdup-auditmod.c @@ -66,7 +66,11 @@ la_activity (uintptr_t *cookie, unsigned int flag) _exit (1); } - /* Check that the constructor has run. */ + /* Check that the constructor has not run. Running the + constructor would require constructing its dependencies, but + the constructor call that triggered this auditing activity + has not completed, and constructors among the dependencies + may not be able to deal with that. */ int *status = dlsym (handle, "auditdupmod_status"); if (status == NULL) { @@ -75,9 +79,9 @@ la_activity (uintptr_t *cookie, unsigned int flag) _exit (1); } printf ("info: auditdupmod_status == %d\n", *status); - if (*status != 1) + if (*status != 0) { - puts ("error: auditdupmod_status == 1 expected"); + puts ("error: auditdupmod_status == 0 expected"); fflush (stdout); _exit (1); } diff --git a/elf/tst-dlopen-recurse.c b/elf/tst-dlopen-recurse.c deleted file mode 100644 index c7fb379d37..0000000000 --- a/elf/tst-dlopen-recurse.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Test that recursive dlopen runs constructors before return (bug 31986). - Copyright (C) 2024 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include - -static int -do_test (void) -{ - void *handle = xdlopen ("tst-dlopen-recursemod1.so", RTLD_NOW); - int *status = dlsym (handle, "recursemod1_status"); - printf ("info: recursemod1_status == %d (from main)\n", *status); - TEST_COMPARE (*status, 2); - xdlclose (handle); - return 0; -} - -#include diff --git a/elf/tst-dlopen-recursemod1.c b/elf/tst-dlopen-recursemod1.c deleted file mode 100644 index 5e0cc0eb8c..0000000000 --- a/elf/tst-dlopen-recursemod1.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Directly opened test module that gets recursively opened again. - Copyright (C) 2024 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include - -int recursemod1_status; - -/* Force linking against st-dlopen-recursemod2.so. Also allows - checking for relocation. */ -extern int recursemod2_status; -int *force_recursemod2_reference = &recursemod2_status; - -static void __attribute__ ((constructor)) -init (void) -{ - ++recursemod1_status; - printf ("info: tst-dlopen-recursemod1.so constructor called (status %d)\n", - recursemod1_status); -} - -static void __attribute__ ((destructor)) -fini (void) -{ - /* The recursemod1_status variable was incremented in the - tst-dlopen-recursemod2.so constructor. */ - printf ("info: tst-dlopen-recursemod1.so destructor called (status %d)\n", - recursemod1_status); - if (recursemod1_status != 2) - { - puts ("error: recursemod1_status == 2 expected"); - exit (1); - } -} diff --git a/elf/tst-dlopen-recursemod2.c b/elf/tst-dlopen-recursemod2.c deleted file mode 100644 index edd2f2526b..0000000000 --- a/elf/tst-dlopen-recursemod2.c +++ /dev/null @@ -1,66 +0,0 @@ -/* Indirectly opened module that recursively opens the directly opened module. - Copyright (C) 2024 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include - -int recursemod2_status; - -static void __attribute__ ((constructor)) -init (void) -{ - ++recursemod2_status; - printf ("info: tst-dlopen-recursemod2.so constructor called (status %d)\n", - recursemod2_status); - void *handle = dlopen ("tst-dlopen-recursemod1.so", RTLD_NOW); - if (handle == NULL) - { - printf ("error: dlopen: %s\n", dlerror ()); - exit (1); - } - int *status = dlsym (handle, "recursemod1_status"); - if (status == NULL) - { - printf ("error: dlsym: %s\n", dlerror ()); - exit (1); - } - printf ("info: recursemod1_status == %d\n", *status); - if (*status != 1) - { - puts ("error: recursemod1_status == 1 expected"); - exit (1); - } - ++*status; - printf ("info: recursemod1_status == %d\n", *status); - - int **mod2_status = dlsym (handle, "force_recursemod2_reference"); - if (mod2_status == NULL || *mod2_status != &recursemod2_status) - { - puts ("error: invalid recursemod2_status address in" - " tst-dlopen-recursemod1.so"); - exit (1); - } -} - -static void __attribute__ ((destructor)) -fini (void) -{ - printf ("info: tst-dlopen-recursemod2.so destructor called (status %d)\n", - recursemod2_status); -}