Browse Source

nptl: Use linker-defined symbol to find start of .tdata section.

phdr->p_vaddr of TLS segment is not a valid value for FDPIC so we can
either translate phdr->p_vaddr using loadmap (not easy here) or use a
new linker script defined symbol, whih this patch does.

	* libpthread/nptl/sysdeps/generic/libc-tls.c (__tdata_start): Declare.
	(__libc_setup_tls): Support __FDPIC__.

Signed-off-by: Mickaël Guêné <mickael.guene@st.com>
Signed-off-by: Christophe Lyon <christophe.lyon@st.com>
Christophe Lyon 5 years ago
parent
commit
7f07872b8a
1 changed files with 9 additions and 0 deletions
  1. 9 0
      libpthread/nptl/sysdeps/generic/libc-tls.c

+ 9 - 0
libpthread/nptl/sysdeps/generic/libc-tls.c

@@ -36,6 +36,11 @@
 extern ElfW(Phdr) *_dl_phdr;
 extern size_t _dl_phnum;
 
+#ifdef __FDPIC__
+/* phdr->p_vaddr is not valid in FDPIC mode. To find tdata start we
+   use the linker script defined symbol __tdata_start.  */
+extern int __tdata_start;
+#endif
 
 static dtv_t static_dtv[2 + TLS_SLOTINFO_SURPLUS];
 
@@ -130,7 +135,11 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)
 	  /* Remember the values we need.  */
 	  memsz = phdr->p_memsz;
 	  filesz = phdr->p_filesz;
+#ifdef __FDPIC__
+	  initimage = (void *) &__tdata_start;
+#else
 	  initimage = (void *) phdr->p_vaddr;
+#endif
 	  align = phdr->p_align;
 	  if (phdr->p_align > max_align)
 	    max_align = phdr->p_align;