/* Load a shared object at run time.
- Copyright (C) 1995-2013 Free Software Foundation, Inc.
+ Copyright (C) 1995-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
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/>. */
+ <https://www.gnu.org/licenses/>. */
#include <dlfcn.h>
#include <errno.h>
#include <stddef.h>
#include <unistd.h>
#include <ldsodefs.h>
-
-#if !defined SHARED && defined IS_IN_libdl
-
-void *
-dlmopen (Lmid_t nsid, const char *file, int mode)
-{
- return __dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
-}
-static_link_warning (dlmopen)
-
-#else
+#include <shlib-compat.h>
struct dlmopen_args
{
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 (__builtin_expect (args->mode & RTLD_GLOBAL, 0))
- GLRO(dl_signal_error) (EINVAL, NULL, NULL, N_("invalid mode"));
+ if (__glibc_unlikely (args->mode & RTLD_GLOBAL))
+ _dl_signal_error (EINVAL, NULL, NULL, N_("invalid mode"));
}
args->new = GLRO(dl_open) (args->file ?: "", args->mode | __RTLD_DLOPEN,
args->caller,
- args->nsid, __dlfcn_argc, __dlfcn_argv,
- __environ);
+ args->nsid, __libc_argc, __libc_argv, __environ);
}
-
-void *
-__dlmopen (Lmid_t nsid, const char *file, int mode DL_CALLER_DECL)
+static void *
+dlmopen_implementation (Lmid_t nsid, const char *file, int mode,
+ void *dl_caller)
{
-# ifdef SHARED
- if (__builtin_expect (_dlfcn_hook != NULL, 0))
- return _dlfcn_hook->dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
-# endif
-
struct dlmopen_args args;
args.nsid = nsid;
args.file = file;
args.mode = mode;
- args.caller = DL_CALLER;
+ args.caller = dl_caller;
-# ifdef SHARED
return _dlerror_run (dlmopen_doit, &args) ? NULL : args.new;
-# else
- if (_dlerror_run (dlmopen_doit, &args))
- return NULL;
+}
- __libc_register_dl_open_hook ((struct link_map *) args.new);
- __libc_register_dlfcn_hook ((struct link_map *) args.new);
+#ifdef SHARED
+void *
+___dlmopen (Lmid_t nsid, const char *file, int mode)
+{
+ if (GLRO (dl_dlfcn_hook) != NULL)
+ return GLRO (dl_dlfcn_hook)->dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
+ else
+ return dlmopen_implementation (nsid, file, mode, RETURN_ADDRESS (0));
+}
+versioned_symbol (libc, ___dlmopen, dlmopen, GLIBC_2_34);
- return args.new;
+# if OTHER_SHLIB_COMPAT (libdl, GLIBC_2_3_4, GLIBC_2_34)
+compat_symbol (libdl, ___dlmopen, dlmopen, GLIBC_2_3_4);
# endif
+#else /* !SHARED */
+/* Also used with _dlfcn_hook. */
+void *
+__dlmopen (Lmid_t nsid, const char *file, int mode, void *dl_caller)
+{
+ return dlmopen_implementation (nsid, file, mode, RETURN_ADDRESS (0));
}
-# ifdef SHARED
-strong_alias (__dlmopen, dlmopen)
-# endif
-#endif
+
+void *
+___dlmopen (Lmid_t nsid, const char *file, int mode)
+{
+ return __dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
+}
+weak_alias (___dlmopen, dlmopen)
+static_link_warning (dlmopen)
+#endif /* !SHARED */