reloc_type);
reloc_type, 0);
_dl_lookup_versioned_symbol (const char *undef_name,			     struct link_map *undef_map, const ElfW(Sym) **ref,			     struct r_scope_elem *symbol_scope[],			     const struct r_found_version *version,			     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)    {      int res = do_lookup_versioned (undef_name, undef_map, hash, *ref,				     &current_value, *scope, 0, version, NULL,				     noexec, noplt);      if (res > 0)	{	  /* 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_versioned_symbol (undef_name, undef_map, ref,						symbol_scope, version,						reloc_type);	  break;	}      if (__builtin_expect (res, 0) < 0)	{	  /* Oh, oh.  The file named in the relocation entry does not	     contain the needed symbol.  */	  /* XXX We cannot translate the message.  */	  _dl_signal_cerror (0, (reference_name && reference_name[0]				 ? reference_name				 : (_dl_argv[0] ?: "<main program>")),			     make_string ("symbol ", undef_name, ", version ",					  version->name,					  " not defined in file ",					  version->filename,					  " with link time reference",					  res == -2					  ? " (no version symbols)" : ""));	  *ref = NULL;	  return 0;	}    }  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 message.  */	_dl_signal_cerror (0, (reference_name && reference_name[0]			       ? reference_name			       : (_dl_argv[0] ?: "<main program>")),			   make_string (undefined_msg, undef_name,					", version ", version->name ?: NULL));      *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, "' [", version->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_versioned (undef_name, undef_map, hash, *ref,				 &protected_value, *scope, 0, version, 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);    }}