__libc_once (once, init);
dlerror (void){  char *buf = NULL;  struct dl_action_result *result;  /* Get error string.  */  result = (struct dl_action_result *) __libc_getspecific (key);  if (result == NULL)    result = &last_result;  /* Test whether we already returned the string.  */  if (result->returned != 0)    {      /* We can now free the string.  */      if (result->errstring != NULL)	{	  if (strcmp (result->errstring, "out of memory") != 0)	    free ((char *) result->errstring);	  result->errstring = NULL;	}    }  else if (result->errstring != NULL)    {      buf = (char *) result->errstring;      int n;      if (result->errcode == 0)	n = __asprintf (&buf, "%s%s%s",			result->objname,			result->objname[0] == '\0' ? "" : ": ",			_(result->errstring));      else	n = __asprintf (&buf, "%s%s%s: %s",			result->objname,			result->objname[0] == '\0' ? "" : ": ",			_(result->errstring),			strerror (result->errcode));      if (n != -1)	{	  /* We don't need the error string anymore.  */	  if (strcmp (result->errstring, "out of memory") != 0)	    free ((char *) result->errstring);	  result->errstring = buf;	}      /* Mark the error as returned.  */      result->returned = 1;    }  return buf;}