Expose libc_shared_globals to libc.so with symbol
Previously, the address of the global variable was communicated from the
dynamic linker to libc.so using a field of KernelArgumentBlock, which is
communicated using the TLS_SLOT_BIONIC_PREINIT slot.
As long as this function isn't called during relocations (i.e. while
executing an ifunc), it always return a non-NULL value. If it's called
before its PLT entry is relocated, I expect a crash.
I removed the __libc_init_shared_globals function. It's currently empty,
and I don't think there's one point in libc's initialization where
shared globals should be initialized.
Bug: http://b/25751302
Test: bionic unit tests
Change-Id: I614d25e7ef5e0d2ccc40d5c821dee10f1ec61c2e
diff --git a/libc/bionic/libc_init_dynamic.cpp b/libc/bionic/libc_init_dynamic.cpp
index 08d3df4..24f40ba 100644
--- a/libc/bionic/libc_init_dynamic.cpp
+++ b/libc/bionic/libc_init_dynamic.cpp
@@ -84,7 +84,6 @@
__libc_init_sysinfo(args);
#endif
- __libc_shared_globals = args.shared_globals;
__libc_init_globals(args);
__libc_init_common(args);
@@ -138,7 +137,13 @@
__cxa_atexit(__libc_fini,structors->fini_array,nullptr);
}
- exit(slingshot(args.argc - __libc_shared_globals->initial_linker_arg_count,
- args.argv + __libc_shared_globals->initial_linker_arg_count,
+ exit(slingshot(args.argc - __libc_shared_globals()->initial_linker_arg_count,
+ args.argv + __libc_shared_globals()->initial_linker_arg_count,
args.envp));
}
+
+extern "C" libc_shared_globals* __loader_shared_globals();
+
+__LIBC_HIDDEN__ libc_shared_globals* __libc_shared_globals() {
+ return __loader_shared_globals();
+}