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

glibc/2.7/dlfcn/dlopenold.c

    1: /* Load a shared object at run time.
    2:    Copyright (C) 1995-1999, 2000, 2004 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 <stddef.h>
   22: #include <unistd.h>
   23: #include <ldsodefs.h>
   24: 
   25: /* This file is for compatibility with glibc 2.0.  Compile it only if
   26:    versioning is used.  */
   27: #include <shlib-compat.h>
   28: #if SHLIB_COMPAT (libdl, GLIBC_2_0, GLIBC_2_1)
   29: 
   30: struct dlopen_args
   31: {
   32:   /* The arguments for dlopen_doit.  */
   33:   const char *file;
   34:   int mode;
   35:   /* The return value of dlopen_doit.  */
   36:   void *new;
   37:   /* Address of the caller.  */
   38:   const void *caller;
   39: };
   40: 
   41: 
   42: /* Non-shared code has no support for multiple namespaces.  */
   43: #ifdef SHARED
   44: # define NS __LM_ID_CALLER
   45: #else
   46: # define NS LM_ID_BASE
   47: #endif
   48: 
   49: 
   50: static void
   51: dlopen_doit (void *a)
   52: {
   53:   struct dlopen_args *args = (struct dlopen_args *) a;
   54: 
   55:   args->new = GLRO(dl_open) (args->file ?: "", args->mode | __RTLD_DLOPEN,
   56:                              args->caller,
   57:                              args->file == NULL ? LM_ID_BASE : NS,
   58:                              __dlfcn_argc, __dlfcn_argv, __environ);
   59: }
   60: 
   61: extern void *__dlopen_nocheck (const char *file, int mode);
   62: void *
   63: __dlopen_nocheck (const char *file, int mode)
   64: {
   65:   struct dlopen_args args;
   66:   args.file = file;
   67:   args.caller = RETURN_ADDRESS (0);
   68: 
   69:   if ((mode & RTLD_BINDING_MASK) == 0)
   70:     /* By default assume RTLD_LAZY.  */
   71:     mode |= RTLD_LAZY;
   72:   args.mode = mode;
   73: 
   74:   if (__builtin_expect (_dlfcn_hook != NULL, 0))
   75:     return _dlfcn_hook->dlopen (file, mode, RETURN_ADDRESS (0));
   76: 
   77:   return _dlerror_run (dlopen_doit, &args) ? NULL : args.new;
   78: }
   79: compat_symbol (libdl, __dlopen_nocheck, dlopen, GLIBC_2_0);
   80: #endif
Syntax (Markdown)