Blame include/dlfcn.h

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