Record TLS modules and layout static TLS memory
Bug: http://b/78026329
Test: bionic unit tests
Change-Id: Ibf1bf5ec864c7830e4cd1cb882842b644e6182ae
diff --git a/libc/bionic/libc_init_static.cpp b/libc/bionic/libc_init_static.cpp
index 6ba6583..1920727 100644
--- a/libc/bionic/libc_init_static.cpp
+++ b/libc/bionic/libc_init_static.cpp
@@ -83,10 +83,25 @@
}
}
-static void layout_static_tls() {
+static void layout_static_tls(KernelArgumentBlock& args) {
StaticTlsLayout& layout = __libc_shared_globals()->static_tls_layout;
layout.reserve_bionic_tls();
- layout.reserve_exe_segment_and_tcb(nullptr);
+
+ const char* progname = args.argv[0];
+ ElfW(Phdr)* phdr_start = reinterpret_cast<ElfW(Phdr)*>(getauxval(AT_PHDR));
+ size_t phdr_ct = getauxval(AT_PHNUM);
+
+ static TlsModule module;
+ if (__bionic_get_tls_segment(phdr_start, phdr_ct, 0, progname, &module.segment)) {
+ module.static_offset = layout.reserve_exe_segment_and_tcb(&module.segment, progname);
+ module.first_generation = 1;
+ __libc_shared_globals()->tls_modules.generation = 1;
+ __libc_shared_globals()->tls_modules.module_count = 1;
+ __libc_shared_globals()->tls_modules.module_table = &module;
+ } else {
+ layout.reserve_exe_segment_and_tcb(nullptr, progname);
+ }
+
layout.finish_layout();
}
@@ -111,7 +126,7 @@
__libc_init_globals();
__libc_shared_globals()->init_progname = args.argv[0];
__libc_init_AT_SECURE(args.envp);
- layout_static_tls();
+ layout_static_tls(args);
__libc_init_main_thread_final();
__libc_init_common();