static ElfW(auxv_t) *_dl_auxv;
static ElfW(auxv_t) *_dl_auxv attribute_relro;
INTVARDEF(__libc_enable_secure)int __libc_multiple_libcs = 0;	/* Defining this here avoids the inclusion				   of init-first.  *//* This variable contains the lowest stack address ever used.  */void *__libc_stack_end __attribute__ ((section (".data.rel.ro")));rtld_hidden_data_def(__libc_stack_end)static ElfW(auxv_t) *_dl_auxv;#ifndef DL_FIND_ARG_COMPONENTS# define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp)	\  do {									      \    void **_tmp;							      \    (argc) = *(long int *) cookie;					      \    (argv) = (char **) ((long int *) cookie + 1);			      \    (envp) = (argv) + (argc) + 1;					      \    for (_tmp = (void **) (envp); *_tmp; ++_tmp)			      \      continue;								      \    (auxp) = (void *) ++_tmp;						      \  } while (0)#endif#ifndef DL_STACK_END# define DL_STACK_END(cookie) ((void *) (cookie))#endifElfW(Addr)_dl_sysdep_start (void **start_argptr,		  void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum,				   ElfW(Addr) *user_entry)){  const ElfW(Phdr) *phdr = NULL;  ElfW(Word) phnum = 0;  ElfW(Addr) user_entry;  ElfW(auxv_t) *av;#ifdef HAVE_AUX_SECURE# define set_seen(tag) (tag)	/* Evaluate for the side effects.  */# define set_seen_secure() ((void) 0)#else  uid_t uid = 0;  gid_t gid = 0;  unsigned int seen = 0;# define set_seen_secure() (seen = -1)# ifdef HAVE_AUX_XID#  define set_seen(tag) (tag)	/* Evaluate for the side effects.  */# else#  define M(type) (1 << (type))#  define set_seen(tag) seen |= M ((tag)->a_type)# endif#endif#ifdef NEED_DL_SYSINFO  ElfW(Word) new_sysinfo = 0;#endif  __libc_stack_end = DL_STACK_END (start_argptr);  DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, INTUSE(_dl_argv), _environ,			  _dl_auxv);  user_entry = (ElfW(Addr)) ENTRY_POINT;  GL(dl_platform) = NULL; /* Default to nothing known about the platform.  */  for (av = _dl_auxv; av->a_type != AT_NULL; set_seen (av++))    switch (av->a_type)      {      case AT_PHDR:	phdr = av->a_un.a_ptr;	break;      case AT_PHNUM:	phnum = av->a_un.a_val;	break;      case AT_PAGESZ:	GL(dl_pagesize) = av->a_un.a_val;	break;      case AT_ENTRY:	user_entry = av->a_un.a_val;	break;#ifdef NEED_DL_BASE_ADDR      case AT_BASE:	_dl_base_addr = av->a_un.a_val;	break;#endif#ifndef HAVE_AUX_SECURE      case AT_UID:      case AT_EUID:	uid ^= av->a_un.a_val;	break;      case AT_GID:      case AT_EGID:	gid ^= av->a_un.a_val;	break;#endif      case AT_SECURE:#ifndef HAVE_AUX_SECURE	seen = -1;#endif	INTUSE(__libc_enable_secure) = av->a_un.a_val;	break;      case AT_PLATFORM:	GL(dl_platform) = av->a_un.a_ptr;	break;      case AT_HWCAP:	GL(dl_hwcap) = av->a_un.a_val;	break;      case AT_CLKTCK:	GL(dl_clktck) = av->a_un.a_val;	break;      case AT_FPUCW:	GL(dl_fpu_control) = av->a_un.a_val;	break;#ifdef NEED_DL_SYSINFO      case AT_SYSINFO:	new_sysinfo = av->a_un.a_val;	break;      case AT_SYSINFO_EHDR:	GL(dl_sysinfo_dso) = av->a_un.a_ptr;	break;#endif#ifdef DL_PLATFORM_AUXV      DL_PLATFORM_AUXV#endif      }#ifdef DL_SYSDEP_OSCHECK  DL_SYSDEP_OSCHECK (dl_fatal);#endif#ifndef HAVE_AUX_SECURE  if (seen != -1)    {      /* Fill in the values we have not gotten from the kernel through the	 auxiliary vector.  */# ifndef HAVE_AUX_XID#  define SEE(UID, var, uid) \   if ((seen & M (AT_##UID)) == 0) var ^= __get##uid ()      SEE (UID, uid, uid);      SEE (EUID, uid, euid);      SEE (GID, gid, gid);      SEE (EGID, gid, egid);# endif      /* If one of the two pairs of IDs does not match this is a setuid	 or setgid run.  */      INTUSE(__libc_enable_secure) = uid | gid;    }#endif#ifndef HAVE_AUX_PAGESIZE  if (GL(dl_pagesize) == 0)    GL(dl_pagesize) = __getpagesize ();#endif#if defined NEED_DL_SYSINFO  /* Only set the sysinfo value if we also have the vsyscall DSO.  */  if (GL(dl_sysinfo_dso) != 0)    GL(dl_sysinfo) = new_sysinfo;#endif#ifdef DL_SYSDEP_INIT  DL_SYSDEP_INIT;#endif#ifdef DL_PLATFORM_INIT  DL_PLATFORM_INIT;#endif  /* Determine the length of the platform name.  */  if (GL(dl_platform) != NULL)    GL(dl_platformlen) = strlen (GL(dl_platform));  if (__sbrk (0) == &_end)    /* The dynamic linker was run as a program, and so the initial break       starts just after our bss, at &_end.  The malloc in dl-minimal.c       will consume the rest of this page, so tell the kernel to move the       break up that far.  When the user program examines its break, it       will see this new value and not clobber our data.  */    __sbrk (GL(dl_pagesize) - ((&_end - (void *) 0) & (GL(dl_pagesize) - 1)));  /* If this is a SUID program we make sure that FDs 0, 1, and 2 are     allocated.  If necessary we are doing it ourself.  If it is not     possible we stop the program.  */  if (__builtin_expect (INTUSE(__libc_enable_secure), 0))    __libc_check_standard_fds ();  (*dl_main) (phdr, phnum, &user_entry);  return user_entry;}