((flags & DL_LOOKUP_NOPLT) != 0
(elf_machine_lookup_noplt_p (reloc_type)
do_lookup (const char *undef_name, unsigned long int hash,	   const ElfW(Sym) **ref, struct sym_val *result,	   struct link_map *list[], size_t i, size_t n,	   const char *reference_name, const struct r_found_version *version,	   struct link_map *skip, int flags){  struct link_map *map;  for (; i < n; ++i)    {      const ElfW(Sym) *symtab;      const char *strtab;      const ElfW(Half) *verstab;      ElfW(Symndx) symidx;      map = list[i];      /* Here come the extra test needed for `_dl_lookup_symbol_skip'.  */      if (skip != NULL && map == skip)	continue;      /* Don't search the executable when resolving a copy reloc.  */      if (flags & DL_LOOKUP_NOEXEC && map->l_type == lt_executable)	continue;      symtab = ((void *) map->l_addr + map->l_info[DT_SYMTAB]->d_un.d_ptr);      strtab = ((void *) map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr);      if (map->l_nversions > 0 && map->l_info[VERSTAG (DT_VERSYM)] != NULL)	verstab = ((void *) map->l_addr		   + map->l_info[VERSTAG (DT_VERSYM)]->d_un.d_ptr);      else	verstab = NULL;      /* Search the appropriate hash bucket in this object's symbol table	 for a definition for the same symbol name.  */      for (symidx = map->l_buckets[hash % map->l_nbuckets];	   symidx != STN_UNDEF;	   symidx = map->l_chain[symidx])	{	  const ElfW(Sym) *sym = &symtab[symidx];	  if (sym->st_value == 0 || /* No value.  */	      ((flags & DL_LOOKUP_NOPLT) != 0 /* Reject PLT entry.  */	       && sym->st_shndx == SHN_UNDEF))	    continue;	  switch (ELFW(ST_TYPE) (sym->st_info))	    {	    case STT_NOTYPE:	    case STT_FUNC:	    case STT_OBJECT:	      break;	    default:	      /* Not a code/data definition.  */	      continue;	    }	  if (sym != *ref && strcmp (strtab + sym->st_name, undef_name))	    /* Not the symbol we are looking for.  */	    continue;	  if (version == NULL)	    {	      /* No specific version is selected.  When the object		 file also does not define a version we have a match.		 Otherwise we only accept the default version, i.e.,		 the version which name is "".  */	      if (verstab != NULL)		{		  ElfW(Half) ndx = verstab[symidx] & 0x7fff;		  if (map->l_versions[ndx].hash != 0)		    continue;		}	    }	  else	    {	      if (verstab == NULL)		{		  /* We need a versioned system but haven't found any.		     If this is the object which is referenced in the		     verneed entry it is a bug in the library since a		     symbol must not simply disappear.  */		  if (version->filename != NULL		      && _dl_name_match_p (version->filename, map))		    return -1;		  /* Otherwise we accept the symbol.  */		}	      else		{		  /* We can match the version information.  */		  ElfW(Half) ndx = verstab[symidx] & 0x7fff;		  if (map->l_versions[ndx].hash != version->hash		      || strcmp (map->l_versions[ndx].name, version->name))		    /* It's not the version we want.  */		    continue;		}	    }	  switch (ELFW(ST_BIND) (sym->st_info))	    {	    case STB_GLOBAL:	      /* Global definition.  Just what we need.  */	      result->s = sym;	      result->a = map->l_addr;	      return 1;	    case STB_WEAK:	      /* Weak definition.  Use this value if we don't find		 another.  */	      if (! result->s)		{		  result->s = sym;		  result->a = map->l_addr;		}	      break;	    default:	      /* Local symbols are ignored.  */	      break;	    }	}      /* If this current is the one mentioned in the verneed entry it	 is a bug.  */      if (version != NULL && version->filename != NULL	  && _dl_name_match_p (version->filename, map))	return -1;    }  /* We have not found anything until now.  */  return 0;}