if (__builtin_expect (lossage != NULL, 0)) __libc_fatal (lossage);
__libc_setup_tls (size_t tcbsize, size_t tcbalign){  void *tlsblock;  size_t memsz = 0;  size_t filesz = 0;  void *initimage = NULL;  size_t align = 0;  size_t max_align = tcbalign;  size_t tcb_offset;  ElfW(Phdr) *phdr;  /* Look through the TLS segment if there is any.  */  if (_dl_phdr != NULL)    for (phdr = _dl_phdr; phdr < &_dl_phdr[_dl_phnum]; ++phdr)      if (phdr->p_type == PT_TLS)	{	  /* Remember the values we need.  */	  memsz = phdr->p_memsz;	  filesz = phdr->p_filesz;	  initimage = (void *) phdr->p_vaddr;	  align = phdr->p_align;	  if (phdr->p_align > max_align)	    max_align = phdr->p_align;	  break;	}  if (memsz == 0 && tcbsize <= TLS_INIT_TCB_SIZE)    /* We do not need a TLS block and no thread descriptor.  */    return;  /* We have to set up the TCB block which also (possibly) contains     'errno'.  Therefore we avoid 'malloc' which might touch 'errno'.     Instead we use 'sbrk' which would only uses 'errno' if it fails.     In this case we are right away out of memory and the user gets     what she/he deserves.     The initialized value of _dl_tls_static_size is provided by dl-open.c     to request some surplus that permits dynamic loading of modules with     IE-model TLS.  */# if TLS_TCB_AT_TP  tcb_offset = roundup (memsz + GL(dl_tls_static_size), tcbalign);  tlsblock = __sbrk (tcb_offset + tcbsize + max_align);# elif TLS_DTV_AT_TP  tlsblock = __sbrk (roundup (tcbsize, align) + memsz + max_align		     + GL(dl_tls_static_size));# else  /* In case a model with a different layout for the TCB and DTV     is defined add another #elif here and in the following #ifs.  */#  error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"# endif  /* Align the TLS block.  */  tlsblock = (void *) (((uintptr_t) tlsblock + max_align - 1)		       & ~(max_align - 1));  /* Initialize the dtv.  [0] is the length, [1] the generation counter.  */  static_dtv[0].counter = 1;  // static_dtv[1].counter = 0;		would be needed if not already done  /* Initialize the TLS block.  */# if TLS_TCB_AT_TP  static_dtv[2].pointer = ((char *) tlsblock + tcb_offset			   - roundup (memsz, align ?: 1));  static_map.l_tls_offset = roundup (memsz, align ?: 1);# elif TLS_DTV_AT_TP  tcb_offset = roundup (tcbsize, align);  static_dtv[2].pointer = (char *) tlsblock + tcb_offset;  static_map.l_tls_offset = tcb_offset;# else#  error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"# endif  /* sbrk gives us zero'd memory, so we don't need this.  memset (__mempcpy (static_dtv[2].pointer, initimage, filesz),	  '\0', memsz - filesz);  */  /* Install the pointer to the dtv.  */  /* Initialize the thread pointer.  */# if TLS_TCB_AT_TP  INSTALL_DTV ((char *) tlsblock + tcb_offset, static_dtv);  const char *lossage = TLS_INIT_TP ((char *) tlsblock + tcb_offset, 0);# elif TLS_DTV_AT_TP  INSTALL_DTV (tlsblock, static_dtv);  const char *lossage = TLS_INIT_TP (tlsblock, 0);# else#  error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"# endif  if (__builtin_expect (lossage != NULL, 0))    __libc_fatal (lossage);  /* We have to create a fake link map which normally would be created     by the dynamic linker.  It just has to have enough information to     make the TLS routines happy.  */  static_map.l_tls_align = align;  static_map.l_tls_blocksize = memsz;  static_map.l_tls_initimage = initimage;  static_map.l_tls_initimage_size = filesz;  static_map.l_type = lt_executable;  static_map.l_tls_modid = 1;  init_slotinfo ();  // static_slotinfo.si.slotinfo[1].gen = 0; already zero  static_slotinfo.si.slotinfo[1].map = &static_map;  memsz = roundup (memsz, align ?: 1);# if TLS_TCB_AT_TP  memsz += tcbsize;# endif  init_static_tls (memsz, MAX (TLS_TCB_ALIGN, max_align));}