diff options
author | dimitry <dimitry@google.com> | 2017-09-26 14:31:35 +0200 |
---|---|---|
committer | dimitry <dimitry@google.com> | 2017-09-26 14:34:18 +0200 |
commit | c18de1bd47a558c9a24c6a4645df27df2c4738b4 (patch) | |
tree | 12560d5f188699814f191c5221e5ccb177ae25a1 /linker/linker_main.cpp | |
parent | 9c172c86e719fc75a75e16d629c088d4aeb9a6cb (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.cpp | 8 |
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(); |