aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/gen/elf_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/gen/elf_utils.c')
-rw-r--r--lib/libc/gen/elf_utils.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/libc/gen/elf_utils.c b/lib/libc/gen/elf_utils.c
index 417f1842aadd..819620c1e19e 100644
--- a/lib/libc/gen/elf_utils.c
+++ b/lib/libc/gen/elf_utils.c
@@ -34,10 +34,13 @@
#include <sys/sysctl.h>
#include <link.h>
#include <stddef.h>
+#include <string.h>
#include "libc_private.h"
+#include "static_tls.h"
int __elf_phdr_match_addr(struct dl_phdr_info *, void *);
void __pthread_map_stacks_exec(void);
+void __pthread_distribute_static_tls(size_t, void *, size_t, size_t);
int
__elf_phdr_match_addr(struct dl_phdr_info *phdr_info, void *addr)
@@ -97,3 +100,24 @@ __pthread_map_stacks_exec(void)
((void (*)(void))__libc_interposing[INTERPOS_map_stacks_exec])();
}
+
+void
+__libc_distribute_static_tls(size_t offset, void *src, size_t len,
+ size_t total_len)
+{
+ uintptr_t tlsbase;
+
+ tlsbase = _libc_get_static_tls_base(offset);
+ memcpy((void *)tlsbase, src, len);
+ memset((char *)tlsbase + len, 0, total_len - len);
+}
+
+#pragma weak __pthread_distribute_static_tls
+void
+__pthread_distribute_static_tls(size_t offset, void *src, size_t len,
+ size_t total_len)
+{
+
+ ((void (*)(size_t, void *, size_t, size_t))__libc_interposing[
+ INTERPOS_distribute_static_tls])(offset, src, len, total_len);
+}