if (do_lookup (undef_name, undef_map, hash, *ref, &current_value, *scope, 0, NULL, noexec, noplt))
if (do_lookup (undef_name, hash, *ref, &current_value, *scope, 0, NULL, noexec, noplt))
_dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,		   const ElfW(Sym) **ref, struct r_scope_elem *symbol_scope[],		   int reloc_type){  const char *reference_name = undef_map ? undef_map->l_name : NULL;  const unsigned long int hash = _dl_elf_hash (undef_name);  struct sym_val current_value = { NULL, NULL };  struct r_scope_elem **scope;  int protected;  int noexec = elf_machine_lookup_noexec_p (reloc_type);  int noplt = elf_machine_lookup_noplt_p (reloc_type);  ++_dl_num_relocations;  /* Search the relevant loaded objects for a definition.  */  for (scope = symbol_scope; *scope; ++scope)    if (do_lookup (undef_name, undef_map, hash, *ref, &current_value,		   *scope, 0, NULL, noexec, noplt))      {	/* We have to check whether this would bind UNDEF_MAP to an object	   in the global scope which was dynamically loaded.  In this case	   we have to prevent the latter from being unloaded unless the	   UNDEF_MAP object is also unloaded.  */	if (__builtin_expect (current_value.m->l_global, 0)	    && (__builtin_expect (current_value.m->l_type, lt_library)		== lt_loaded)	    && undef_map != current_value.m	    /* Add UNDEF_MAP to the dependencies.  */	    && add_dependency (undef_map, current_value.m) < 0)	  /* Something went wrong.  Perhaps the object we tried to reference	     was just removed.  Try finding another definition.  */	  return _dl_lookup_symbol (undef_name, undef_map, ref, symbol_scope,				    reloc_type);	break;      }  if (__builtin_expect (current_value.s == NULL, 0))    {      if (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK)	/* We could find no value for a strong reference.  */	/* XXX We cannot translate the messages.  */	_dl_signal_cerror (0, (reference_name && reference_name[0]			       ? reference_name			       : (_dl_argv[0] ?: "<main program>")),			   make_string (undefined_msg, undef_name));      *ref = NULL;      return 0;    }  protected = *ref && ELFW(ST_VISIBILITY) ((*ref)->st_other) == STV_PROTECTED;  if (__builtin_expect (_dl_debug_bindings, 0))    _dl_debug_message (1, "binding file ",		       (reference_name && reference_name[0]			? reference_name			: (_dl_argv[0] ?: "<main program>")),		       " to ", current_value.m->l_name[0]		       ? current_value.m->l_name : _dl_argv[0],		       ": ", protected ? "protected" : "normal",		       " symbol `", undef_name, "'\n", NULL);  if (__builtin_expect (protected == 0, 1))    {      *ref = current_value.s;      return LOOKUP_VALUE (current_value.m);    }  else    {      /* It is very tricky. We need to figure out what value to         return for the protected symbol */      struct sym_val protected_value = { NULL, NULL };      for (scope = symbol_scope; *scope; ++scope)	if (do_lookup (undef_name, undef_map, hash, *ref,		       &protected_value, *scope, 0, NULL, 0, 1))	  break;      if (protected_value.s == NULL || protected_value.m == undef_map)	{	  *ref = current_value.s;	  return LOOKUP_VALUE (current_value.m);	}      return LOOKUP_VALUE (undef_map);    }}