summaryrefslogtreecommitdiff
path: root/dlfcn
diff options
context:
space:
mode:
Diffstat (limited to 'dlfcn')
-rw-r--r--dlfcn/Makefile5
-rw-r--r--dlfcn/Versions1
-rw-r--r--dlfcn/bug-atexit1.c2
-rw-r--r--dlfcn/bug-atexit2.c2
-rw-r--r--dlfcn/bug-atexit3-lib.cc7
-rw-r--r--dlfcn/bug-dl-leaf-lib-cb.c2
-rw-r--r--dlfcn/bug-dl-leaf-lib.c4
-rw-r--r--dlfcn/bug-dl-leaf.c2
-rw-r--r--dlfcn/dladdr.c5
-rw-r--r--dlfcn/dladdr1.c5
-rw-r--r--dlfcn/dlclose.c4
-rw-r--r--dlfcn/dlerror.c23
-rw-r--r--dlfcn/dlfcn.c2
-rw-r--r--dlfcn/dlfcn.h2
-rw-r--r--dlfcn/dlfreeres.c29
-rw-r--r--dlfcn/dlinfo.c8
-rw-r--r--dlfcn/dlmopen.c8
-rw-r--r--dlfcn/dlopen.c6
-rw-r--r--dlfcn/dlopenold.c4
-rw-r--r--dlfcn/dlsym.c4
-rw-r--r--dlfcn/dlvsym.c4
-rw-r--r--dlfcn/errmsg1.c2
-rw-r--r--dlfcn/errmsg1mod.c2
-rw-r--r--dlfcn/glreflib1.c2
-rw-r--r--dlfcn/glreflib2.c2
-rw-r--r--dlfcn/glrefmain.c2
-rw-r--r--dlfcn/modatexit.c4
-rw-r--r--dlfcn/modcxaatexit.c4
-rw-r--r--dlfcn/modstatic3.c2
-rw-r--r--dlfcn/modstatic5.c2
-rw-r--r--dlfcn/sdlfreeres.c1
-rw-r--r--dlfcn/tst-dladdr.c6
-rw-r--r--dlfcn/tst-dlinfo.c2
-rw-r--r--dlfcn/tst-rec-dlopen.c87
-rw-r--r--dlfcn/tstatexit.c10
-rw-r--r--dlfcn/tstcxaatexit.c10
-rw-r--r--dlfcn/tststatic3.c2
-rw-r--r--dlfcn/tststatic4.c2
-rw-r--r--dlfcn/tststatic5.c2
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