about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-07-31 07:42:20 +0000
committerUlrich Drepper <drepper@redhat.com>2003-07-31 07:42:20 +0000
commitadc12574e555ec7d6ba3969eed4f829705c235ab (patch)
treecaff1741b560ff8258ace64120781354e62b56c2 /elf
parent9722e6f3e26822835542c1c49048d855a5881510 (diff)
downloadglibc-adc12574e555ec7d6ba3969eed4f829705c235ab.tar.gz
glibc-adc12574e555ec7d6ba3969eed4f829705c235ab.tar.xz
glibc-adc12574e555ec7d6ba3969eed4f829705c235ab.zip
Update.
2003-07-30  Jakub Jelinek  <jakub@redhat.com>

	* elf/dl-reloc.c (_dl_allocate_static_tls): Don't return any value,
	call dl_signal_error directly.  If already relocated, call
	GL(dl_init_static_tls) directly, otherwise queue it for later.
	(CHECK_STATIC_TLS): Undo 2003-07-24 change.
	* elf/rtld.c (dl_main): Initialize GL(dl_init_static_tls).
	* elf/dl-open.c (dl_open_worker): Call GL_dl_init_static_tls
	for all static TLS initializations delayed in _dl_allocate_static_tls.
	* elf/dl-support.c (_dl_init_static_tls): New variable.
	* include/link.h (struct link_map): Add l_need_tls_init.
	* sysdeps/generic/ldsodefs.h (_rtld_global): Add _dl_init_static_tls.
	(_dl_nothread_init_static_tls): New prototype.
	(_dl_allocate_static_tls): Adjust prototype.

	* elf/tls-macros.h (VAR_INT_DEF): Add alignment directive.

	elf_machine_rela_relative): Adjust.
	(CHECK_STATIC_TLS): _dl_allocate_static_tls can fail now.
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-open.c10
-rw-r--r--elf/dl-support.c4
-rw-r--r--elf/rtld.c4
-rw-r--r--elf/tls-macros.h1
4 files changed, 19 insertions, 0 deletions
diff --git a/elf/dl-open.c b/elf/dl-open.c
index aadd8f55f6..fcda37676d 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -303,6 +303,16 @@ dl_open_worker (void *a)
     }
 
 #ifdef USE_TLS
+  /* Do static TLS initialization now if it has been delayed because
+     the TLS template might not be fully relocated at _dl_allocate_static_tls
+     time.  */
+  for (l = new; l; l = l->l_next)
+    if (l->l_need_tls_init)
+      {
+	l->l_need_tls_init = 0;
+	GL(dl_init_static_tls) (l);
+      }
+
   /* We normally don't bump the TLS generation counter.  There must be
      actually a need to do this.  */
   any_tls = false;
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 52447f489a..8c58b2ba69 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -98,6 +98,10 @@ int _dl_starting_up = 1;
 hp_timing_t _dl_cpuclock_offset;
 #endif
 
+#ifdef USE_TLS
+void (*_dl_init_static_tls) (struct link_map *) = &_dl_nothread_init_static_tls;
+#endif
+
 /* This is zero at program start to signal that the global scope map is
    allocated by rtld.  Later it keeps the size of the map.  It might be
    reset if in _dl_close if the last global object is removed.  */
diff --git a/elf/rtld.c b/elf/rtld.c
index c63405ac99..54e568804d 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -622,6 +622,10 @@ dl_main (const ElfW(Phdr) *phdr,
   GL(dl_error_catch_tsd) = &_dl_initial_error_catch_tsd;
 #endif
 
+#ifdef USE_TLS
+  GL(dl_init_static_tls) = &_dl_nothread_init_static_tls;
+#endif
+
   /* Process the environment variable which control the behaviour.  */
   process_envvars (&mode);
 
diff --git a/elf/tls-macros.h b/elf/tls-macros.h
index bb243d819d..7c2542400a 100644
--- a/elf/tls-macros.h
+++ b/elf/tls-macros.h
@@ -9,6 +9,7 @@
 #define VAR_INT_DEF(x) \
   asm (".section .tdata\n\t"						      \
        ".globl " #x "\n"						      \
+       ".balign 4\n"							      \
        #x ":\t.long 0\n\t"						      \
        ".size " #x ",4\n\t"						      \
        ".previous")