Blame include/dlfcn.h

Packit Service 82fcde
#ifndef _DLFCN_H
Packit Service 82fcde
#include <dlfcn/dlfcn.h>
Packit Service 82fcde
#ifndef _ISOMAC
Packit Service 82fcde
#include <link.h>		/* For ElfW.  */
Packit Service 82fcde
#include <stdbool.h>
Packit Service 82fcde
Packit Service 82fcde
/* Internally used flag.  */
Packit Service 82fcde
#define __RTLD_DLOPEN	0x80000000
Packit Service 82fcde
#define __RTLD_SPROF	0x40000000
Packit Service 82fcde
#define __RTLD_OPENEXEC	0x20000000
Packit Service 82fcde
#define __RTLD_CALLMAP	0x10000000
Packit Service 82fcde
#define __RTLD_AUDIT	0x08000000
Packit Service 82fcde
#define __RTLD_SECURE	0x04000000 /* Apply additional security checks.  */
Packit Service 82fcde
#define __RTLD_NOIFUNC	0x02000000 /* Suppress calling ifunc functions.  */
Packit Service 82fcde
Packit Service 82fcde
#define __LM_ID_CALLER	-2
Packit Service 82fcde
Packit Service 82fcde
#ifdef SHARED
Packit Service 82fcde
/* Locally stored program arguments.  */
Packit Service 82fcde
extern int __dlfcn_argc attribute_hidden;
Packit Service 82fcde
extern char **__dlfcn_argv attribute_hidden;
Packit Service 82fcde
#else
Packit Service 82fcde
/* These variables are defined and initialized in the startup code.  */
Packit Service 82fcde
extern int __libc_argc attribute_hidden;
Packit Service 82fcde
extern char **__libc_argv attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
# define __dlfcn_argc __libc_argc
Packit Service 82fcde
# define __dlfcn_argv __libc_argv
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Now define the internal interfaces.  */
Packit Service 82fcde
Packit Service 82fcde
/* Use RTLD_NOW here because:
Packit Service 82fcde
   1. In pthread_cancel_init we want to use RTLD_NOW to reduce the stack usage
Packit Service 82fcde
      of future cancellation operations, particularly when the target thread
Packit Service 82fcde
      is running with a small stack.  Likewise for consistency we do the same
Packit Service 82fcde
      thing in __libgcc_s_init.  RTLD_NOW will rarely make a difference for
Packit Service 82fcde
      __libgcc_s_init because unwinding is already in progress, so libgcc_s.so
Packit Service 82fcde
      has already been loaded if its unwinder is used (Bug 22636).
Packit Service 82fcde
   2. It allows us to provide robust fallback code at dlopen time for
Packit Service 82fcde
      incorrectly configured systems that mix old libnss_* modules with newly
Packit Service 82fcde
      installed libraries e.g. old libnss_nis.so.2 with new libnsl.so.1.  Using
Packit Service 82fcde
      RTLD_LAZY here causes a failure at the time the symbol is called and at
Packit Service 82fcde
      that point it is much harder to safely return an error (Bug 22766).
Packit Service 82fcde
Packit Service 82fcde
   The use of RTLD_NOW also impacts gconv module loading, backtracing
Packit Service 82fcde
   (where the unwinder form libgcc_s.so is used), and IDNA functions
Packit Service 82fcde
   (which load libidn2), all of which load their respective DSOs on
Packit Service 82fcde
   demand, and so should not impact program startup.  That is to say
Packit Service 82fcde
   that the DSOs are loaded as part of an API call and therefore we
Packit Service 82fcde
   will be calling that family of API functions shortly so RTLD_NOW or
Packit Service 82fcde
   RTLD_LAZY is not a big difference in performance, but RTLD_NOW has
Packit Service 82fcde
   better error handling semantics for the library.  */
Packit Service 82fcde
#define __libc_dlopen(name) \
Packit Service 82fcde
  __libc_dlopen_mode (name, RTLD_NOW | __RTLD_DLOPEN)
Packit Service 82fcde
extern void *__libc_dlopen_mode  (const char *__name, int __mode);
Packit Service 82fcde
extern void *__libc_dlsym   (void *__map, const char *__name);
Packit Service 82fcde
extern void *__libc_dlvsym (void *map, const char *name, const char *version);
Packit Service 82fcde
extern int   __libc_dlclose (void *__map);
Packit Service 82fcde
libc_hidden_proto (__libc_dlopen_mode)
Packit Service 82fcde
libc_hidden_proto (__libc_dlsym)
Packit Service 82fcde
libc_hidden_proto (__libc_dlvsym)
Packit Service 82fcde
libc_hidden_proto (__libc_dlclose)
Packit Service 82fcde
Packit Service 82fcde
/* Locate shared object containing the given address.  */
Packit Service 82fcde
#ifdef ElfW
Packit Service 82fcde
extern int _dl_addr (const void *address, Dl_info *info,
Packit Service 82fcde
		     struct link_map **mapp, const ElfW(Sym) **symbolp);
Packit Service 82fcde
libc_hidden_proto (_dl_addr)
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
struct link_map;
Packit Service 82fcde
Packit Service 82fcde
/* Close an object previously opened by _dl_open.  */
Packit Service 82fcde
extern void _dl_close (void *map) attribute_hidden;
Packit Service 82fcde
/* Same as above, but without locking and safety checks for user
Packit Service 82fcde
   provided map arguments.  */
Packit Service 82fcde
extern void _dl_close_worker (struct link_map *map, bool force)
Packit Service 82fcde
    attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
/* Look up NAME in shared object HANDLE (which may be RTLD_DEFAULT or
Packit Service 82fcde
   RTLD_NEXT).  WHO is the calling function, for RTLD_NEXT.  Returns
Packit Service 82fcde
   the symbol value, which may be NULL.  */
Packit Service 82fcde
extern void *_dl_sym (void *handle, const char *name, void *who);
Packit Service 82fcde
Packit Service 82fcde
/* Look up version VERSION of symbol NAME in shared object HANDLE
Packit Service 82fcde
   (which may be RTLD_DEFAULT or RTLD_NEXT).  WHO is the calling
Packit Service 82fcde
   function, for RTLD_NEXT.  Returns the symbol value, which may be
Packit Service 82fcde
   NULL.  */
Packit Service 82fcde
extern void *_dl_vsym (void *handle, const char *name, const char *version,
Packit Service 82fcde
		       void *who);
Packit Service 82fcde
Packit Service 82fcde
/* Helper function for <dlfcn.h> functions.  Runs the OPERATE function via
Packit Service 82fcde
   _dl_catch_error.  Returns zero for success, nonzero for failure; and
Packit Service 82fcde
   arranges for `dlerror' to return the error details.
Packit Service 82fcde
   ARGS is passed as argument to OPERATE.  */
Packit Service 82fcde
extern int _dlerror_run (void (*operate) (void *), void *args)
Packit Service 82fcde
    attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
#ifdef SHARED
Packit Service 82fcde
# define DL_CALLER_DECL /* Nothing */
Packit Service 82fcde
# define DL_CALLER RETURN_ADDRESS (0)
Packit Service 82fcde
#else
Packit Service 82fcde
# define DL_CALLER_DECL , void *dl_caller
Packit Service 82fcde
# define DL_CALLER dl_caller
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
struct dlfcn_hook
Packit Service 82fcde
{
Packit Service 82fcde
  void *(*dlopen) (const char *file, int mode, void *dl_caller);
Packit Service 82fcde
  int (*dlclose) (void *handle);
Packit Service 82fcde
  void *(*dlsym) (void *handle, const char *name, void *dl_caller);
Packit Service 82fcde
  void *(*dlvsym) (void *handle, const char *name, const char *version,
Packit Service 82fcde
		   void *dl_caller);
Packit Service 82fcde
  char *(*dlerror) (void);
Packit Service 82fcde
  int (*dladdr) (const void *address, Dl_info *info);
Packit Service 82fcde
  int (*dladdr1) (const void *address, Dl_info *info,
Packit Service 82fcde
		  void **extra_info, int flags);
Packit Service 82fcde
  int (*dlinfo) (void *handle, int request, void *arg, void *dl_caller);
Packit Service 82fcde
  void *(*dlmopen) (Lmid_t nsid, const char *file, int mode, void *dl_caller);
Packit Service 82fcde
  void *pad[4];
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
extern struct dlfcn_hook *_dlfcn_hook;
Packit Service 82fcde
libdl_hidden_proto (_dlfcn_hook)
Packit Service 82fcde
Packit Service 82fcde
extern void *__dlopen (const char *file, int mode DL_CALLER_DECL)
Packit Service 82fcde
     attribute_hidden;
Packit Service 82fcde
extern void *__dlmopen (Lmid_t nsid, const char *file, int mode DL_CALLER_DECL)
Packit Service 82fcde
     attribute_hidden;
Packit Service 82fcde
extern int __dlclose (void *handle)
Packit Service 82fcde
     attribute_hidden;
Packit Service 82fcde
extern void *__dlsym (void *handle, const char *name DL_CALLER_DECL)
Packit Service 82fcde
     attribute_hidden;
Packit Service 82fcde
extern void *__dlvsym (void *handle, const char *name, const char *version
Packit Service 82fcde
		       DL_CALLER_DECL)
Packit Service 82fcde
     attribute_hidden;
Packit Service 82fcde
extern char *__dlerror (void)
Packit Service 82fcde
     attribute_hidden;
Packit Service 82fcde
extern int __dladdr (const void *address, Dl_info *info)
Packit Service 82fcde
     attribute_hidden;
Packit Service 82fcde
extern int __dladdr1 (const void *address, Dl_info *info,
Packit Service 82fcde
		      void **extra_info, int flags)
Packit Service 82fcde
     attribute_hidden;
Packit Service 82fcde
extern int __dlinfo (void *handle, int request, void *arg DL_CALLER_DECL)
Packit Service 82fcde
     attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
#ifndef SHARED
Packit Service 82fcde
struct link_map;
Packit Service 82fcde
extern void * __libc_dlsym_private (struct link_map *map, const char *name)
Packit Service 82fcde
     attribute_hidden;
Packit Service 82fcde
extern void __libc_register_dl_open_hook (struct link_map *map)
Packit Service 82fcde
     attribute_hidden;
Packit Service 82fcde
extern void __libc_register_dlfcn_hook (struct link_map *map)
Packit Service 82fcde
     attribute_hidden;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
extern void __dlerror_main_freeres (void) attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
#endif
Packit Service 82fcde
#endif