aboutsummaryrefslogtreecommitdiff
path: root/elf
diff options
context:
space:
mode:
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 aadd8f5..fcda376 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 52447f4..8c58b2b 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 c63405a..54e5688 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 bb243d8..7c25424 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")