Move the abort message to libc_shared_globals
__libc_shared_globals() is available in dynamic modules as soon as
relocation has finished (i.e. after ifuncs run). Before ifuncs have run,
the android_set_abort_message() function already doesn't work because it
calls public APIs via the PLT. (If this matters, we can use a static
bool variable to enable android_set_abort_message after libc
initialization).
__libc_shared_globals() is hidden, so it's available in the linker
immediately (i.e. before relocation). TLS memory (e.g. errno) currently
isn't accessible until after relocation, but a later patch fixes that.
Bug: none
Test: bionic unit tests
Change-Id: Ied4433758ed2da9ee404c6158e319cf502d05a53
diff --git a/linker/linker_main.cpp b/linker/linker_main.cpp
index 963e82c..442ecd9 100644
--- a/linker/linker_main.cpp
+++ b/linker/linker_main.cpp
@@ -116,7 +116,6 @@
}
int g_ld_debug_verbosity;
-abort_msg_t* g_abort_message = nullptr; // For debuggerd.
static std::vector<std::string> g_ld_preload_names;
@@ -300,7 +299,7 @@
#ifdef __ANDROID__
debuggerd_callbacks_t callbacks = {
.get_abort_message = []() {
- return g_abort_message;
+ return __libc_shared_globals()->abort_msg;
},
.post_dump = ¬ify_gdb_of_libraries,
};
@@ -664,7 +663,6 @@
g_default_namespace.add_soinfo(solinker);
init_link_map_head(*solinker, kLinkerPath);
- args.abort_message_ptr = &g_abort_message;
ElfW(Addr) start_address = linker_main(args, exe_to_load);
INFO("[ Jumping to _start (%p)... ]", reinterpret_cast<void*>(start_address));