(linenum→info "unix/slp.c:2238")

glibc/2.7/dlfcn/dlmopen.c

    1: /* Load a shared object at run time.
    2:    Copyright (C) 1995-2000,2003,2004,2006 Free Software Foundation, Inc.
    3:    This file is part of the GNU C Library.
    4: 
    5:    The GNU C Library is free software; you can redistribute it and/or
    6:    modify it under the terms of the GNU Lesser General Public
    7:    License as published by the Free Software Foundation; either
    8:    version 2.1 of the License, or (at your option) any later version.
    9: 
   10:    The GNU C Library is distributed in the hope that it will be useful,
   11:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   12:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13:    Lesser General Public License for more details.
   14: 
   15:    You should have received a copy of the GNU Lesser General Public
   16:    License along with the GNU C Library; if not, write to the Free
   17:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   18:    02111-1307 USA.  */
   19: 
   20: #include <dlfcn.h>
   21: #include <errno.h>
   22: #include <libintl.h>
   23: #include <stddef.h>
   24: #include <unistd.h>
   25: #include <ldsodefs.h>
   26: 
   27: #if !defined SHARED && defined IS_IN_libdl
   28: 
   29: void *
   30: dlmopen (Lmid_t nsid, const char *file, int mode)
   31: {
   32:   return __dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
   33: }
   34: static_link_warning (dlmopen)
   35: 
   36: #else
   37: 
   38: struct dlmopen_args
   39: {
   40:   /* Namespace ID.  */
   41:   Lmid_t nsid;
   42:   /* The arguments for dlopen_doit.  */
   43:   const char *file;
   44:   int mode;
   45:   /* The return value of dlopen_doit.  */
   46:   void *new;
   47:   /* Address of the caller.  */
   48:   const void *caller;
   49: };
   50: 
   51: static void
   52: dlmopen_doit (void *a)
   53: {
   54:   struct dlmopen_args *args = (struct dlmopen_args *) a;
   55: 
   56:   /* Non-shared code has no support for multiple namespaces.  */
   57:   if (args->nsid != LM_ID_BASE)
   58:     {
   59: # ifdef SHARED
   60:       /* If trying to open the link map for the main executable the namespace
   61:          must be the main one.  */
   62:       if (args->file == NULL)
   63: # endif
   64:         GLRO(dl_signal_error) (EINVAL, NULL, NULL, N_("invalid namespace"));
   65: 
   66:       /* It makes no sense to use RTLD_GLOBAL when loading a DSO into
   67:          a namespace other than the base namespace.  */
   68:       if (__builtin_expect (args->mode & RTLD_GLOBAL, 0))
   69:         GLRO(dl_signal_error) (EINVAL, NULL, NULL, N_("invalid mode"));
   70:     }
   71: 
   72:   args->new = GLRO(dl_open) (args->file ?: "", args->mode | __RTLD_DLOPEN,
   73:                              args->caller,
   74:                              args->nsid, __dlfcn_argc, __dlfcn_argv,
   75:                              __environ);
   76: }
   77: 
   78: 
   79: void *
   80: __dlmopen (Lmid_t nsid, const char *file, int mode DL_CALLER_DECL)
   81: {
   82: # ifdef SHARED
   83:   if (__builtin_expect (_dlfcn_hook != NULL, 0))
   84:     return _dlfcn_hook->dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
   85: # endif
   86: 
   87:   struct dlmopen_args args;
   88:   args.nsid = nsid;
   89:   args.file = file;
   90:   args.mode = mode;
   91:   args.caller = DL_CALLER;
   92: 
   93: # ifdef SHARED
   94:   return _dlerror_run (dlmopen_doit, &args) ? NULL : args.new;
   95: # else
   96:   if (_dlerror_run (dlmopen_doit, &args))
   97:     return NULL;
   98: 
   99:   __libc_register_dl_open_hook ((struct link_map *) args.new);
  100:   __libc_register_dlfcn_hook ((struct link_map *) args.new);
  101: 
  102:   return args.new;
  103: # endif
  104: }
  105: # ifdef SHARED
  106: strong_alias (__dlmopen, dlmopen)
  107: # endif
  108: #endif
Syntax (Markdown)