void * dlsym (void *handle, const char *name) { struct dlsym_args args; args.caller = (ElfW(Addr)) __builtin_return_address (0); args.handle = handle; args.name = name;  return (_dlerror_run (dlsym_doit, &args) ? NULL : (void *) (args.loadbase + args.ref->st_value)); }
dlsym_doit (void *a){  struct dlsym_args *args = (struct dlsym_args *) a;  args->ref = NULL;  if (args->handle == NULL)    /* Search the global scope.  */    args->loadbase = _dl_lookup_symbol (args->name, &args->ref,					&(_dl_global_scope					  ?: _dl_default_scope)[2],					NULL, 0);  else if (args->handle == RTLD_NEXT)    {      struct link_map *l, *match;      /* Find the highest-addressed object that CALLER is not below.  */      match = NULL;      for (l = _dl_loaded; l; l = l->l_next)	if (args->caller >= l->l_addr && (!match || match->l_addr < l->l_addr))	  match = l;      if (! match)	_dl_signal_error (0, NULL, _("\RTLD_NEXT used in code not dynamically loaded"));      l = match;      while (l->l_loader)	l = l->l_loader;      {	struct link_map *map = l;	struct link_map *mapscope[2] = { map, NULL };	args->loadbase = _dl_lookup_symbol_skip (args->name, &args->ref,						 mapscope, NULL, match);    }  else    {      /* Search the scope of the given object.  */      struct link_map *map = args->handle;      struct link_map *mapscope[2] = { map, NULL };      args->loadbase = _dl_lookup_symbol (args->name, &args->ref, mapscope,					  map->l_name, 0);    }}void *dlsym (void *handle, const char *name){  struct dlsym_args args;  args.caller = (ElfW(Addr)) __builtin_return_address (0);  args.handle = handle;  args.name = name;  return (_dlerror_run (dlsym_doit, &args)	  ? NULL : (void *) (args.loadbase + args.ref->st_value));}