summaryrefslogtreecommitdiff
path: root/linker/linker_main.cpp
diff options
context:
space:
mode:
authordimitry <dimitry@google.com>2017-09-26 14:31:35 +0200
committerdimitry <dimitry@google.com>2017-09-26 14:34:18 +0200
commitc18de1bd47a558c9a24c6a4645df27df2c4738b4 (patch)
tree12560d5f188699814f191c5221e5ccb177ae25a1 /linker/linker_main.cpp
parent9c172c86e719fc75a75e16d629c088d4aeb9a6cb (diff)
Link vdso before linking the main executable
Also set linked flag after it is linked and call constructors. Set RTLD_NODELETE flag to prevent accidental unloads. Test: bionic-unit-tests --gtest_filter=dl*:Dl* Test: bionic-unit-tests-glibc --gtest_filter=dl* Change-Id: Ib2178849b918cbefd6f8fcfe6d1f78889fe0bf76
Diffstat (limited to 'linker/linker_main.cpp')
-rw-r--r--linker/linker_main.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/linker/linker_main.cpp b/linker/linker_main.cpp
index 3862d8ca3..a5ccd0f27 100644
--- a/linker/linker_main.cpp
+++ b/linker/linker_main.cpp
@@ -154,6 +154,10 @@ static void add_vdso(KernelArgumentBlock& args) {
si->prelink_image();
si->link_image(g_empty_list, soinfo_list_t::make_list(si), nullptr);
+ // prevents accidental unloads...
+ si->set_dt_flags_1(si->get_dt_flags_1() | DF_1_NODELETE);
+ si->set_linked();
+ si->call_constructors();
}
/* gdb expects the linker to be in the debug shared object list.
@@ -352,6 +356,8 @@ static ElfW(Addr) __linker_init_post_relocation(KernelArgumentBlock& args) {
}
}
+ add_vdso(args);
+
// Load ld_preloads and dependencies.
std::vector<const char*> needed_library_name_list;
size_t ld_preloads_count = 0;
@@ -393,8 +399,6 @@ static ElfW(Addr) __linker_init_post_relocation(KernelArgumentBlock& args) {
si->increment_ref_count();
}
- add_vdso(args);
-
if (!get_cfi_shadow()->InitialLinkDone(solist)) __linker_cannot_link(g_argv[0]);
si->call_pre_init_constructors();