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

glibc/2.7/dlfcn/dlvsym.c

    1: /* Look up a versioned symbol in a shared object loaded by `dlopen'.
    2:    Copyright (C) 1995-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: 
   23: #include <ldsodefs.h>
   24: 
   25: #if !defined SHARED && defined IS_IN_libdl
   26: 
   27: void *
   28: weak_function
   29: dlvsym (void *handle, const char *name, const char *version_str)
   30: {
   31:   return __dlvsym (handle, name, version_str, RETURN_ADDRESS (0));
   32: }
   33: 
   34: #else
   35: 
   36: struct dlvsym_args
   37: {
   38:   /* The arguments to dlvsym_doit.  */
   39:   void *handle;
   40:   const char *name;
   41:   const char *version;
   42:   void *who;
   43: 
   44:   /* The return values of dlvsym_doit.  */
   45:   void *sym;
   46: };
   47: 
   48: 
   49: static void
   50: dlvsym_doit (void *a)
   51: {
   52:   struct dlvsym_args *args = (struct dlvsym_args *)a;
   53: 
   54:   args->sym = _dl_vsym (args->handle, args->name, args->version, args->who);
   55: }
   56: 
   57: void *
   58: __dlvsym (void *handle, const char *name, const char *version_str
   59:           DL_CALLER_DECL)
   60: {
   61: # ifdef SHARED
   62:   if (__builtin_expect (_dlfcn_hook != NULL, 0))
   63:     return _dlfcn_hook->dlvsym (handle, name, version_str, DL_CALLER);
   64: # endif
   65: 
   66:   struct dlvsym_args args;
   67:   args.handle = handle;
   68:   args.name = name;
   69:   args.who = DL_CALLER;
   70:   args.version = version_str;
   71: 
   72:   /* Protect against concurrent loads and unloads.  */
   73:   __rtld_lock_lock_recursive (GL(dl_load_lock));
   74: 
   75:   void *result = (_dlerror_run (dlvsym_doit, &args) ? NULL : args.sym);
   76: 
   77:   __rtld_lock_unlock_recursive (GL(dl_load_lock));
   78: 
   79:   return result;
   80: }
   81: # ifdef SHARED
   82: weak_alias (__dlvsym, dlvsym)
   83: # endif
   84: #endif
Syntax (Markdown)