[RFC] killing remaining USE___THREAD use

Andreas Schwab schwab@suse.de
Tue May 6 08:35:00 GMT 2014


Ondřej Bílka <neleai@seznam.cz> writes:

> I checked how its bitrotten, it gives following error:
>
> In file included from rtld.c:376:0:
> dynamic-link.h: In function ‘_dl_start’:
> dynamic-link.h:179:8: warning: "ELF_MACHINE_NO_RELA" is not defined
> [-Wundef]
> rtld.c:481:21: error: incompatible types when assigning to type ‘struct
> <anonymous>’ from type ‘void *’
> rtld.c:489:2: error: incompatible type for argument 1 of
> ‘__builtin_mempcpy’
> rtld.c:489:2: note: expected ‘void *’ but argument is of type ‘struct
> <anonymous>’

This is easy to fix, but the question remains on what this is intented
to do.

Andreas.

diff --git a/elf/rtld.c b/elf/rtld.c
index 9d121dc..45d77e0 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -300,7 +300,6 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
   GL(dl_rtld_map).l_text_end = (ElfW(Addr)) _etext;
   /* Copy the TLS related data if necessary.  */
 #ifndef DONT_USE_BOOTSTRAP_MAP
-# if USE___THREAD
   assert (info->l.l_tls_modid != 0);
   GL(dl_rtld_map).l_tls_blocksize = info->l.l_tls_blocksize;
   GL(dl_rtld_map).l_tls_align = info->l.l_tls_align;
@@ -309,12 +308,6 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
   GL(dl_rtld_map).l_tls_initimage = info->l.l_tls_initimage;
   GL(dl_rtld_map).l_tls_offset = info->l.l_tls_offset;
   GL(dl_rtld_map).l_tls_modid = 1;
-# else
-#  if NO_TLS_OFFSET != 0
-  GL(dl_rtld_map).l_tls_offset = NO_TLS_OFFSET;
-#  endif
-# endif
-
 #endif
 
 #if HP_TIMING_AVAIL
@@ -396,9 +389,7 @@ _dl_start (void *arg)
        ++cnt)
     bootstrap_map.l_info[cnt] = 0;
 # endif
-# if USE___THREAD
   bootstrap_map.l_tls_modid = 0;
-# endif
 #endif
 
   /* Figure out the run-time load address of the dynamic linker itself.  */
@@ -417,15 +408,13 @@ _dl_start (void *arg)
      to it.  When we have something like GOTOFF relocs, we can use a plain
      reference to find the runtime address.  Without that, we have to rely
      on the `l_addr' value, which is not the value we want when prelinked.  */
-#if USE___THREAD
   dtv_t initdtv[3];
   ElfW(Ehdr) *ehdr
-# ifdef DONT_USE_BOOTSTRAP_MAP
+#ifdef DONT_USE_BOOTSTRAP_MAP
     = (ElfW(Ehdr) *) &_begin;
-# else
-#  error This will not work with prelink.
+#else
     = (ElfW(Ehdr) *) bootstrap_map.l_addr;
-# endif
+#endif
   ElfW(Phdr) *phdr = (ElfW(Phdr) *) ((void *) ehdr + ehdr->e_phoff);
   size_t cnt = ehdr->e_phnum;	/* PT_TLS is usually the last phdr.  */
   while (cnt-- > 0)
@@ -451,21 +440,21 @@ _dl_start (void *arg)
 	   on the stack.  We'll get the final memory later when we
 	   know all about the various objects loaded at startup
 	   time.  */
-# if TLS_TCB_AT_TP
+#if TLS_TCB_AT_TP
 	tlsblock = alloca (roundup (bootstrap_map.l_tls_blocksize,
 				    TLS_INIT_TCB_ALIGN)
 			   + TLS_INIT_TCB_SIZE
 			   + max_align);
-# elif TLS_DTV_AT_TP
+#elif TLS_DTV_AT_TP
 	tlsblock = alloca (roundup (TLS_INIT_TCB_SIZE,
 				    bootstrap_map.l_tls_align)
 			   + bootstrap_map.l_tls_blocksize
 			   + max_align);
-# else
+#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
+# 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));
@@ -476,33 +465,34 @@ _dl_start (void *arg)
 	initdtv[1].counter = 0;
 
 	/* Initialize the TLS block.  */
-# if TLS_TCB_AT_TP
-	initdtv[2].pointer = tlsblock;
-# elif TLS_DTV_AT_TP
+#if TLS_TCB_AT_TP
+	initdtv[2].pointer.val = tlsblock;
+#elif TLS_DTV_AT_TP
 	bootstrap_map.l_tls_offset = roundup (TLS_INIT_TCB_SIZE,
 					      bootstrap_map.l_tls_align);
-	initdtv[2].pointer = (char *) tlsblock + bootstrap_map.l_tls_offset;
-# else
-#  error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-# endif
-	p = __mempcpy (initdtv[2].pointer, bootstrap_map.l_tls_initimage,
+	initdtv[2].pointer.val = (char *) tlsblock + bootstrap_map.l_tls_offset;
+#else
+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+#endif
+	initdtv[2].pointer.is_static = true;
+	p = __mempcpy (initdtv[2].pointer.val, bootstrap_map.l_tls_initimage,
 		       bootstrap_map.l_tls_initimage_size);
-# ifdef HAVE_BUILTIN_MEMSET
+#ifdef HAVE_BUILTIN_MEMSET
 	__builtin_memset (p, '\0', (bootstrap_map.l_tls_blocksize
 				    - bootstrap_map.l_tls_initimage_size));
-# else
+#else
 	{
 	  size_t remaining = (bootstrap_map.l_tls_blocksize
 			      - bootstrap_map.l_tls_initimage_size);
 	  while (remaining-- > 0)
 	    *p++ = '\0';
 	}
-# endif
+#endif
 
 	/* Install the pointer to the dtv.  */
 
 	/* Initialize the thread pointer.  */
-# if TLS_TCB_AT_TP
+#if TLS_TCB_AT_TP
 	bootstrap_map.l_tls_offset
 	  = roundup (bootstrap_map.l_tls_blocksize, TLS_INIT_TCB_ALIGN);
 
@@ -511,12 +501,12 @@ _dl_start (void *arg)
 
 	const char *lossage = TLS_INIT_TP ((char *) tlsblock
 					   + bootstrap_map.l_tls_offset, 0);
-# elif TLS_DTV_AT_TP
+#elif TLS_DTV_AT_TP
 	INSTALL_DTV (tlsblock, initdtv);
 	const char *lossage = TLS_INIT_TP (tlsblock, 0);
-# else
-#  error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-# endif
+#else
+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+#endif
 	if (__glibc_unlikely (lossage != NULL))
 	  _dl_fatal_printf ("cannot set up thread-local storage: %s\n",
 			    lossage);
@@ -527,7 +517,6 @@ _dl_start (void *arg)
 	/* There can only be one PT_TLS entry.  */
 	break;
       }
-#endif	/* USE___THREAD */
 
 #ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
   ELF_MACHINE_BEFORE_RTLD_RELOC (bootstrap_map.l_info);
@@ -774,12 +763,7 @@ cannot allocate TLS data structures for initial thread");
 
   /* And finally install it for the main thread.  If ld.so itself uses
      TLS we know the thread pointer was initialized earlier.  */
-  const char *lossage
-#ifdef USE___THREAD
-    = TLS_INIT_TP (tcbp, USE___THREAD);
-#else
-    = TLS_INIT_TP (tcbp, 0);
-#endif
+  const char *lossage = TLS_INIT_TP (tcbp, 1);
   if (__glibc_unlikely (lossage != NULL))
     _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage);
   tls_init_tp_called = true;
@@ -2253,12 +2237,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
      TLS we know the thread pointer was initialized earlier.  */
   if (! tls_init_tp_called)
     {
-      const char *lossage
-#ifdef USE___THREAD
-	= TLS_INIT_TP (tcbp, USE___THREAD);
-#else
-	= TLS_INIT_TP (tcbp, 0);
-#endif
+      const char *lossage = TLS_INIT_TP (tcbp, 1);
       if (__glibc_unlikely (lossage != NULL))
 	_dl_fatal_printf ("cannot set up thread-local storage: %s\n",
 			  lossage);
-- 
1.9.2

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."



More information about the Libc-alpha mailing list