diff options
Diffstat (limited to 'dlfcn')
39 files changed, 168 insertions, 105 deletions
diff --git a/dlfcn/Makefile b/dlfcn/Makefile index deab96e6a7..34f9923334 100644 --- a/dlfcn/Makefile +++ b/dlfcn/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1995-2016 Free Software Foundation, Inc. +# Copyright (C) 1995-2018 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 @@ -22,7 +22,7 @@ include ../Makeconfig headers := bits/dlfcn.h dlfcn.h extra-libs := libdl libdl-routines := dlopen dlclose dlsym dlvsym dlerror dladdr dladdr1 dlinfo \ - dlmopen dlfcn + dlmopen dlfcn dlfreeres routines := $(patsubst %,s%,$(filter-out dlfcn,$(libdl-routines))) elide-routines.os := $(routines) @@ -139,6 +139,7 @@ $(objpfx)bug-atexit2.out: $(objpfx)bug-atexit2-lib.so ifneq (,$(CXX)) LDLIBS-bug-atexit3-lib.so = -lstdc++ -lgcc_eh +$(objpfx)bug-atexit3-lib.so: $(libsupport) $(objpfx)bug-atexit3: $(libdl) $(objpfx)bug-atexit3.out: $(objpfx)bug-atexit3-lib.so endif diff --git a/dlfcn/Versions b/dlfcn/Versions index 97902f0dfd..1df6925a92 100644 --- a/dlfcn/Versions +++ b/dlfcn/Versions @@ -13,5 +13,6 @@ libdl { } GLIBC_PRIVATE { _dlfcn_hook; + __libdl_freeres; } } diff --git a/dlfcn/bug-atexit1.c b/dlfcn/bug-atexit1.c index e2d1d2f776..fdfb6bc0b7 100644 --- a/dlfcn/bug-atexit1.c +++ b/dlfcn/bug-atexit1.c @@ -1,5 +1,5 @@ /* Derived from a test case in - http://sourceware.org/bugzilla/show_bug.cgi?id=1158. */ + https://sourceware.org/bugzilla/show_bug.cgi?id=1158. */ #include <dlfcn.h> #include <stdio.h> #include <stdlib.h> diff --git a/dlfcn/bug-atexit2.c b/dlfcn/bug-atexit2.c index 15e9f7aa01..279804dcf2 100644 --- a/dlfcn/bug-atexit2.c +++ b/dlfcn/bug-atexit2.c @@ -1,5 +1,5 @@ /* Derived from a test case in - http://sourceware.org/bugzilla/show_bug.cgi?id=1158. */ + https://sourceware.org/bugzilla/show_bug.cgi?id=1158. */ #include <dlfcn.h> #include <stdlib.h> #include <stdio.h> diff --git a/dlfcn/bug-atexit3-lib.cc b/dlfcn/bug-atexit3-lib.cc index 3d01ea81d2..ed3334709a 100644 --- a/dlfcn/bug-atexit3-lib.cc +++ b/dlfcn/bug-atexit3-lib.cc @@ -1,14 +1,17 @@ #include <unistd.h> +#include <string.h> + +#include <support/support.h> struct statclass { statclass() { - write (1, "statclass\n", 10); + write_message ("statclass\n"); } ~statclass() { - write (1, "~statclass\n", 11); + write_message ("~statclass\n"); } }; diff --git a/dlfcn/bug-dl-leaf-lib-cb.c b/dlfcn/bug-dl-leaf-lib-cb.c index 462c3c6d26..5e3bb073b4 100644 --- a/dlfcn/bug-dl-leaf-lib-cb.c +++ b/dlfcn/bug-dl-leaf-lib-cb.c @@ -1,7 +1,7 @@ /* Make sure dlopen/dlclose are not marked as leaf functions. See bug-dl-leaf-lib.c for details. - Copyright (C) 2013-2016 Free Software Foundation, Inc. + Copyright (C) 2013-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Mike Frysinger <vapier@gentoo.org> diff --git a/dlfcn/bug-dl-leaf-lib.c b/dlfcn/bug-dl-leaf-lib.c index d5a3460c2b..016a393df2 100644 --- a/dlfcn/bug-dl-leaf-lib.c +++ b/dlfcn/bug-dl-leaf-lib.c @@ -1,6 +1,6 @@ /* Make sure dlopen/dlclose are not marked as leaf functions. - Copyright (C) 2013-2016 Free Software Foundation, Inc. + Copyright (C) 2013-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Mike Frysinger <vapier@gentoo.org> @@ -50,7 +50,7 @@ void check_val_fini (void) int lib_main (void) { - int ret; + int ret __attribute__ ((unused)); void *hdl; /* Make sure the constructor sees the updated val. */ diff --git a/dlfcn/bug-dl-leaf.c b/dlfcn/bug-dl-leaf.c index 60b26f3e4f..f8745b810e 100644 --- a/dlfcn/bug-dl-leaf.c +++ b/dlfcn/bug-dl-leaf.c @@ -1,7 +1,7 @@ /* Make sure dlopen/dlclose are not marked as leaf functions. See bug-dl-leaf-lib.c for details. - Copyright (C) 2013-2016 Free Software Foundation, Inc. + Copyright (C) 2013-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Mike Frysinger <vapier@gentoo.org> diff --git a/dlfcn/dladdr.c b/dlfcn/dladdr.c index 28137f62f8..97f811f801 100644 --- a/dlfcn/dladdr.c +++ b/dlfcn/dladdr.c @@ -1,5 +1,5 @@ /* Locate the shared object symbol nearest a given address. - Copyright (C) 1996-2016 Free Software Foundation, Inc. + Copyright (C) 1996-2018 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 @@ -17,6 +17,7 @@ <http://www.gnu.org/licenses/>. */ #include <dlfcn.h> +#include <ldsodefs.h> #if !defined SHARED && IS_IN (libdl) @@ -32,7 +33,7 @@ int __dladdr (const void *address, Dl_info *info) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dladdr (address, info); # endif return _dl_addr (address, info, NULL, NULL); diff --git a/dlfcn/dladdr1.c b/dlfcn/dladdr1.c index 4c12506f8b..9b39d487ff 100644 --- a/dlfcn/dladdr1.c +++ b/dlfcn/dladdr1.c @@ -1,5 +1,5 @@ /* Locate the shared object symbol nearest a given address. - Copyright (C) 2003-2016 Free Software Foundation, Inc. + Copyright (C) 2003-2018 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 @@ -17,6 +17,7 @@ <http://www.gnu.org/licenses/>. */ #include <dlfcn.h> +#include <ldsodefs.h> #if !defined SHARED && IS_IN (libdl) @@ -32,7 +33,7 @@ int __dladdr1 (const void *address, Dl_info *info, void **extra, int flags) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dladdr1 (address, info, extra, flags); # endif diff --git a/dlfcn/dlclose.c b/dlfcn/dlclose.c index 9fb5090723..6afe6c8af2 100644 --- a/dlfcn/dlclose.c +++ b/dlfcn/dlclose.c @@ -1,5 +1,5 @@ /* Close a handle opened by `dlopen'. - Copyright (C) 1995-2016 Free Software Foundation, Inc. + Copyright (C) 1995-2018 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 @@ -39,7 +39,7 @@ int __dlclose (void *handle) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlclose (handle); # endif diff --git a/dlfcn/dlerror.c b/dlfcn/dlerror.c index 41b2bd6bf2..33574faab6 100644 --- a/dlfcn/dlerror.c +++ b/dlfcn/dlerror.c @@ -1,5 +1,5 @@ /* Return error detail for failing <dlfcn.h> functions. - Copyright (C) 1995-2016 Free Software Foundation, Inc. + Copyright (C) 1995-2018 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 @@ -24,6 +24,7 @@ #include <string.h> #include <libc-lock.h> #include <ldsodefs.h> +#include <libc-symbols.h> #if !defined SHARED && IS_IN (libdl) @@ -63,7 +64,7 @@ __dlerror (void) struct dl_action_result *result; # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlerror (); # endif @@ -120,7 +121,6 @@ strong_alias (__dlerror, dlerror) # endif int -internal_function _dlerror_run (void (*operate) (void *), void *args) { struct dl_action_result *result; @@ -160,8 +160,8 @@ _dlerror_run (void (*operate) (void *), void *args) result->errstring = NULL; } - result->errcode = GLRO(dl_catch_error) (&result->objname, &result->errstring, - &result->malloced, operate, args); + result->errcode = _dl_catch_error (&result->objname, &result->errstring, + &result->malloced, operate, args); /* If no error we mark that no error string is available. */ result->returned = result->errstring == NULL; @@ -223,6 +223,19 @@ free_key_mem (void *mem) # ifdef SHARED +/* Free the dlerror-related resources. */ +void +__dlerror_main_freeres (void) +{ + void *mem; + /* Free the global memory if used. */ + check_free (&last_result); + /* Free the TSD memory if used. */ + mem = __libc_getspecific (key); + if (mem != NULL) + free_key_mem (mem); +} + struct dlfcn_hook *_dlfcn_hook __attribute__((nocommon)); libdl_hidden_data_def (_dlfcn_hook) diff --git a/dlfcn/dlfcn.c b/dlfcn/dlfcn.c index 138b8405fb..7f83cd2f06 100644 --- a/dlfcn/dlfcn.c +++ b/dlfcn/dlfcn.c @@ -1,5 +1,5 @@ /* Load a shared object at run time. - Copyright (C) 2005-2016 Free Software Foundation, Inc. + Copyright (C) 2005-2018 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 diff --git a/dlfcn/dlfcn.h b/dlfcn/dlfcn.h index 5d16dcdc11..0921fd724c 100644 --- a/dlfcn/dlfcn.h +++ b/dlfcn/dlfcn.h @@ -1,5 +1,5 @@ /* User functions for run-time dynamic loading. - Copyright (C) 1995-2016 Free Software Foundation, Inc. + Copyright (C) 1995-2018 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 diff --git a/dlfcn/dlfreeres.c b/dlfcn/dlfreeres.c new file mode 100644 index 0000000000..4004db0edb --- /dev/null +++ b/dlfcn/dlfreeres.c @@ -0,0 +1,29 @@ +/* Clean up allocated libdl memory on demand. + Copyright (C) 2018 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 + <http://www.gnu.org/licenses/>. */ + +#include <set-hooks.h> +#include <libc-symbols.h> +#include <dlfcn.h> + +/* Free libdl.so resources. + Note: Caller ensures we are called only once. */ +void +__libdl_freeres (void) +{ + call_function_static_weak (__dlerror_main_freeres); +} diff --git a/dlfcn/dlinfo.c b/dlfcn/dlinfo.c index eeba8da408..964572cc67 100644 --- a/dlfcn/dlinfo.c +++ b/dlfcn/dlinfo.c @@ -1,5 +1,5 @@ /* dlinfo -- Get information from the dynamic linker. - Copyright (C) 2003-2016 Free Software Foundation, Inc. + Copyright (C) 2003-2018 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 @@ -60,7 +60,7 @@ dlinfo_doit (void *argsblock) break; if (l == NULL) - GLRO(dl_signal_error) (0, NULL, NULL, N_("\ + _dl_signal_error (0, NULL, NULL, N_("\ RTLD_SELF used in code not dynamically loaded")); } # endif @@ -69,7 +69,7 @@ RTLD_SELF used in code not dynamically loaded")); { case RTLD_DI_CONFIGADDR: default: - GLRO(dl_signal_error) (0, NULL, NULL, N_("unsupported dlinfo request")); + _dl_signal_error (0, NULL, NULL, N_("unsupported dlinfo request")); break; case RTLD_DI_LMID: @@ -111,7 +111,7 @@ int __dlinfo (void *handle, int request, void *arg DL_CALLER_DECL) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlinfo (handle, request, arg, DL_CALLER); # endif diff --git a/dlfcn/dlmopen.c b/dlfcn/dlmopen.c index 6da0d0d691..87ba290464 100644 --- a/dlfcn/dlmopen.c +++ b/dlfcn/dlmopen.c @@ -1,5 +1,5 @@ /* Load a shared object at run time. - Copyright (C) 1995-2016 Free Software Foundation, Inc. + Copyright (C) 1995-2018 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 @@ -60,12 +60,12 @@ dlmopen_doit (void *a) must be the main one. */ if (args->file == NULL) # endif - GLRO(dl_signal_error) (EINVAL, NULL, NULL, N_("invalid namespace")); + _dl_signal_error (EINVAL, NULL, NULL, N_("invalid namespace")); /* It makes no sense to use RTLD_GLOBAL when loading a DSO into a namespace other than the base namespace. */ if (__glibc_unlikely (args->mode & RTLD_GLOBAL)) - GLRO(dl_signal_error) (EINVAL, NULL, NULL, N_("invalid mode")); + _dl_signal_error (EINVAL, NULL, NULL, N_("invalid mode")); } args->new = GLRO(dl_open) (args->file ?: "", args->mode | __RTLD_DLOPEN, @@ -79,7 +79,7 @@ void * __dlmopen (Lmid_t nsid, const char *file, int mode DL_CALLER_DECL) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlmopen (nsid, file, mode, RETURN_ADDRESS (0)); # endif diff --git a/dlfcn/dlopen.c b/dlfcn/dlopen.c index 453efbd1c0..95bc62b6b5 100644 --- a/dlfcn/dlopen.c +++ b/dlfcn/dlopen.c @@ -1,5 +1,5 @@ /* Load a shared object at run time. - Copyright (C) 1995-2016 Free Software Foundation, Inc. + Copyright (C) 1995-2018 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 @@ -61,7 +61,7 @@ dlopen_doit (void *a) if (args->mode & ~(RTLD_BINDING_MASK | RTLD_NOLOAD | RTLD_DEEPBIND | RTLD_GLOBAL | RTLD_LOCAL | RTLD_NODELETE | __RTLD_SPROF)) - GLRO(dl_signal_error) (0, NULL, NULL, _("invalid mode parameter")); + _dl_signal_error (0, NULL, NULL, _("invalid mode parameter")); args->new = GLRO(dl_open) (args->file ?: "", args->mode | __RTLD_DLOPEN, args->caller, @@ -74,7 +74,7 @@ void * __dlopen (const char *file, int mode DL_CALLER_DECL) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlopen (file, mode, DL_CALLER); # endif diff --git a/dlfcn/dlopenold.c b/dlfcn/dlopenold.c index 79d46ff603..d3b6a6cff5 100644 --- a/dlfcn/dlopenold.c +++ b/dlfcn/dlopenold.c @@ -1,5 +1,5 @@ /* Load a shared object at run time. - Copyright (C) 1995-2016 Free Software Foundation, Inc. + Copyright (C) 1995-2018 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 @@ -70,7 +70,7 @@ __dlopen_nocheck (const char *file, int mode) mode |= RTLD_LAZY; args.mode = mode; - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlopen (file, mode, RETURN_ADDRESS (0)); return _dlerror_run (dlopen_doit, &args) ? NULL : args.new; diff --git a/dlfcn/dlsym.c b/dlfcn/dlsym.c index e72202e68f..285abaaa4e 100644 --- a/dlfcn/dlsym.c +++ b/dlfcn/dlsym.c @@ -1,5 +1,5 @@ /* Look up a symbol in a shared object loaded by `dlopen'. - Copyright (C) 1995-2016 Free Software Foundation, Inc. + Copyright (C) 1995-2018 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 @@ -55,7 +55,7 @@ void * __dlsym (void *handle, const char *name DL_CALLER_DECL) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlsym (handle, name, DL_CALLER); # endif diff --git a/dlfcn/dlvsym.c b/dlfcn/dlvsym.c index 8daec67dbb..7fac2e4461 100644 --- a/dlfcn/dlvsym.c +++ b/dlfcn/dlvsym.c @@ -1,5 +1,5 @@ /* Look up a versioned symbol in a shared object loaded by `dlopen'. - Copyright (C) 1995-2016 Free Software Foundation, Inc. + Copyright (C) 1995-2018 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 @@ -58,7 +58,7 @@ __dlvsym (void *handle, const char *name, const char *version_str DL_CALLER_DECL) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlvsym (handle, name, version_str, DL_CALLER); # endif diff --git a/dlfcn/errmsg1.c b/dlfcn/errmsg1.c index 5f87888740..961296a2b2 100644 --- a/dlfcn/errmsg1.c +++ b/dlfcn/errmsg1.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2016 Free Software Foundation, Inc. +/* Copyright (C) 2000-2018 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 diff --git a/dlfcn/errmsg1mod.c b/dlfcn/errmsg1mod.c index 6bb1399ead..a9ce0735f3 100644 --- a/dlfcn/errmsg1mod.c +++ b/dlfcn/errmsg1mod.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2016 Free Software Foundation, Inc. +/* Copyright (C) 2000-2018 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 diff --git a/dlfcn/glreflib1.c b/dlfcn/glreflib1.c index 3732e03410..1a444e413a 100644 --- a/dlfcn/glreflib1.c +++ b/dlfcn/glreflib1.c @@ -1,5 +1,5 @@ /* Test for dependency tracking added by relocations. - Copyright (C) 2000-2016 Free Software Foundation, Inc. + Copyright (C) 2000-2018 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 diff --git a/dlfcn/glreflib2.c b/dlfcn/glreflib2.c index 94fcb3948e..aade6dcd80 100644 --- a/dlfcn/glreflib2.c +++ b/dlfcn/glreflib2.c @@ -1,5 +1,5 @@ /* Test for dependency tracking added by relocations. - Copyright (C) 2000-2016 Free Software Foundation, Inc. + Copyright (C) 2000-2018 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 diff --git a/dlfcn/glrefmain.c b/dlfcn/glrefmain.c index aa4503f102..f0a3995f79 100644 --- a/dlfcn/glrefmain.c +++ b/dlfcn/glrefmain.c @@ -1,5 +1,5 @@ /* Test for dependency tracking added by relocations. - Copyright (C) 2000-2016 Free Software Foundation, Inc. + Copyright (C) 2000-2018 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 diff --git a/dlfcn/modatexit.c b/dlfcn/modatexit.c index d877fce001..b424ac7546 100644 --- a/dlfcn/modatexit.c +++ b/dlfcn/modatexit.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001-2016 Free Software Foundation, Inc. +/* Copyright (C) 2001-2018 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 @@ -35,9 +35,7 @@ dummy (void) void foo (void *p) { - extern void *__dso_handle __attribute__ ((__weak__)); printf ("This is %s\n", __FUNCTION__); atexit (dummy); - if (&__dso_handle) puts ("have dso handle"); else puts ("no dso handle"); ip = p; } diff --git a/dlfcn/modcxaatexit.c b/dlfcn/modcxaatexit.c index 3401de6bcd..d72ce9860b 100644 --- a/dlfcn/modcxaatexit.c +++ b/dlfcn/modcxaatexit.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001-2016 Free Software Foundation, Inc. +/* Copyright (C) 2001-2018 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 @@ -17,6 +17,7 @@ #include <stdio.h> #include <stdlib.h> +#include <dso_handle.h> extern void fluffy (void *p); extern void bar (void *p); @@ -34,7 +35,6 @@ fluffy (void *p) void bar (void *p) { - extern void *__dso_handle; printf ("This is %s\n", __FUNCTION__); __cxa_atexit (fluffy, p, __dso_handle); } diff --git a/dlfcn/modstatic3.c b/dlfcn/modstatic3.c index 3026bafd48..b9a1224872 100644 --- a/dlfcn/modstatic3.c +++ b/dlfcn/modstatic3.c @@ -1,5 +1,5 @@ /* DSO used for dlopen testing with a static executable. - Copyright (C) 2013-2016 Free Software Foundation, Inc. + Copyright (C) 2013-2018 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 diff --git a/dlfcn/modstatic5.c b/dlfcn/modstatic5.c index 86a22d5ba4..13de8e7666 100644 --- a/dlfcn/modstatic5.c +++ b/dlfcn/modstatic5.c @@ -1,6 +1,6 @@ /* DSO used for GLRO(dl_pagesize) initialization testing with a static executable. - Copyright (C) 2013-2016 Free Software Foundation, Inc. + Copyright (C) 2013-2018 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 diff --git a/dlfcn/sdlfreeres.c b/dlfcn/sdlfreeres.c new file mode 100644 index 0000000000..7347672990 --- /dev/null +++ b/dlfcn/sdlfreeres.c @@ -0,0 +1 @@ +#include "dlfreeres.c" diff --git a/dlfcn/tst-dladdr.c b/dlfcn/tst-dladdr.c index c61ffe9751..186c9cf54e 100644 --- a/dlfcn/tst-dladdr.c +++ b/dlfcn/tst-dladdr.c @@ -1,5 +1,5 @@ /* Test for dladdr. - Copyright (C) 2000-2016 Free Software Foundation, Inc. + Copyright (C) 2000-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Volkmar Sieh <vs@caldera.de> and Andreas Jaeger <aj@suse.de>. @@ -24,8 +24,6 @@ #include <stdlib.h> #include <string.h> -#include <ldsodefs.h> - #define TEST_FUNCTION do_test () extern int do_test (void); @@ -53,8 +51,6 @@ do_test (void) if (ret == 0) error (EXIT_FAILURE, 0, "dladdr failed"); - printf ("address of ref1 = %lx\n", - (unsigned long int) DL_LOOKUP_ADDRESS (sym)); printf ("ret = %d\n", ret); printf ("info.dli_fname = %p (\"%s\")\n", info.dli_fname, info.dli_fname); printf ("info.dli_fbase = %p\n", info.dli_fbase); diff --git a/dlfcn/tst-dlinfo.c b/dlfcn/tst-dlinfo.c index a759792b95..34aab1256b 100644 --- a/dlfcn/tst-dlinfo.c +++ b/dlfcn/tst-dlinfo.c @@ -1,5 +1,5 @@ /* Test for dlinfo. - Copyright (C) 2003-2016 Free Software Foundation, Inc. + Copyright (C) 2003-2018 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 diff --git a/dlfcn/tst-rec-dlopen.c b/dlfcn/tst-rec-dlopen.c index b2a35a7e20..20dc23850e 100644 --- a/dlfcn/tst-rec-dlopen.c +++ b/dlfcn/tst-rec-dlopen.c @@ -1,5 +1,5 @@ /* Test recursive dlopen using malloc hooks. - Copyright (C) 2015-2016 Free Software Foundation, Inc. + Copyright (C) 2015-2018 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 @@ -18,8 +18,12 @@ #include <stdio.h> #include <stdlib.h> -#include <malloc.h> #include <dlfcn.h> +#include <stdbool.h> +#include <stdalign.h> +#include <sys/mman.h> +#include <unistd.h> +#include <string.h> #define DSO "moddummy1.so" #define FUNC "dummy1" @@ -30,12 +34,6 @@ /* Result of the called function. */ int func_result; -/* Prototype for my hook. */ -void *custom_malloc_hook (size_t, const void *); - -/* Pointer to old malloc hooks. */ -void *(*old_malloc_hook) (size_t, const void *); - /* Call function func_name in DSO dso_name via dlopen. */ void call_func (const char *dso_name, const char *func_name) @@ -81,29 +79,67 @@ call_func (const char *dso_name, const char *func_name) } -/* Empty hook that does nothing. */ +/* If true, call another function from malloc. */ +static bool call_function; + +/* Set to true to indicate that the interposed malloc was called. */ +static bool interposed_malloc_called; + +/* Interposed malloc which optionally calls another function. */ void * -custom_malloc_hook (size_t size, const void *caller) +malloc (size_t size) { - void *result; - /* Restore old hooks. */ - __malloc_hook = old_malloc_hook; - /* First call a function in another library via dlopen. */ - call_func (DSO1, FUNC1); - /* Called recursively. */ - result = malloc (size); - /* Restore new hooks. */ - __malloc_hook = custom_malloc_hook; - return result; + interposed_malloc_called = true; + static void *(*original_malloc) (size_t); + + if (original_malloc == NULL) + { + static bool in_initialization; + if (in_initialization) + { + const char *message + = "error: malloc called recursively during initialization\n"; + (void) write (STDOUT_FILENO, message, strlen (message)); + _exit (2); + } + in_initialization = true; + + original_malloc + = (__typeof (original_malloc)) dlsym (RTLD_NEXT, "malloc"); + if (original_malloc == NULL) + { + const char *message + = "error: dlsym for malloc failed\n"; + (void) write (STDOUT_FILENO, message, strlen (message)); + _exit (2); + } + } + + if (call_function) + { + call_function = false; + call_func (DSO1, FUNC1); + call_function = true; + } + return original_malloc (size); } static int do_test (void) { - /* Save old hook. */ - old_malloc_hook = __malloc_hook; - /* Install new hook. */ - __malloc_hook = custom_malloc_hook; + /* Ensure initialization. */ + { + void *volatile ptr = malloc (1); + free (ptr); + } + + if (!interposed_malloc_called) + { + printf ("error: interposed malloc not called during initialization\n"); + return 1; + } + + call_function = true; /* Bug 17702 fixes two things: * A recursive dlopen unmapping the ld.so.cache. @@ -116,8 +152,7 @@ do_test (void) will abort because of the assert described in detail below. */ call_func (DSO, FUNC); - /* Restore old hook. */ - __malloc_hook = old_malloc_hook; + call_function = false; /* The function dummy2() is called by the malloc hook. Check to see that it was called. This ensures the second recursive diff --git a/dlfcn/tstatexit.c b/dlfcn/tstatexit.c index e5850564e8..e1d93df54d 100644 --- a/dlfcn/tstatexit.c +++ b/dlfcn/tstatexit.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001-2016 Free Software Foundation, Inc. +/* Copyright (C) 2001-2018 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 @@ -20,8 +20,6 @@ #include <stdlib.h> -extern void *__dso_handle __attribute__ ((__weak__)); - int main (void) { @@ -30,12 +28,6 @@ main (void) void (*fp) (void *); int v = 0; - if (&__dso_handle == NULL) - { - puts ("__dso_handle not available, cannot perform the test"); - exit (0); - } - h = dlopen (fname, RTLD_NOW); if (h == NULL) { diff --git a/dlfcn/tstcxaatexit.c b/dlfcn/tstcxaatexit.c index 17c9a1c94d..64ce29ef91 100644 --- a/dlfcn/tstcxaatexit.c +++ b/dlfcn/tstcxaatexit.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001-2016 Free Software Foundation, Inc. +/* Copyright (C) 2001-2018 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 @@ -19,8 +19,6 @@ #include <stdio.h> #include <stdlib.h> -extern void *__dso_handle __attribute__ ((__weak__)); - int main (void) { @@ -29,12 +27,6 @@ main (void) void (*fp) (void *); int v = 0; - if (&__dso_handle == NULL) - { - puts ("__dso_handle not available, cannot perform the test"); - exit (0); - } - h = dlopen (fname, RTLD_LAZY); if (h == NULL) { diff --git a/dlfcn/tststatic3.c b/dlfcn/tststatic3.c index c6cb373ffa..cf90be8a49 100644 --- a/dlfcn/tststatic3.c +++ b/dlfcn/tststatic3.c @@ -1,5 +1,5 @@ /* Global-scope DSO mapping test with a static executable (BZ #15022). - Copyright (C) 2013-2016 Free Software Foundation, Inc. + Copyright (C) 2013-2018 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 diff --git a/dlfcn/tststatic4.c b/dlfcn/tststatic4.c index 79c0db78d8..e91b91b817 100644 --- a/dlfcn/tststatic4.c +++ b/dlfcn/tststatic4.c @@ -1,5 +1,5 @@ /* Global object symbol access tests with a static executable (BZ #15022). - Copyright (C) 2013-2016 Free Software Foundation, Inc. + Copyright (C) 2013-2018 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 diff --git a/dlfcn/tststatic5.c b/dlfcn/tststatic5.c index 20bd4639b2..10cb0bd535 100644 --- a/dlfcn/tststatic5.c +++ b/dlfcn/tststatic5.c @@ -1,5 +1,5 @@ /* GLRO(dl_pagesize) initialization DSO test with a static executable. - Copyright (C) 2013-2016 Free Software Foundation, Inc. + Copyright (C) 2013-2018 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 |