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
diff --git a/linker/linker_main.cpp b/linker/linker_main.cpp
index 3862d8c..a5ccd0f 100644
--- a/linker/linker_main.cpp
+++ b/linker/linker_main.cpp
@@ -154,6 +154,10 @@
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 @@
}
}
+ 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 @@
si->increment_ref_count();
}
- add_vdso(args);
-
if (!get_cfi_shadow()->InitialLinkDone(solist)) __linker_cannot_link(g_argv[0]);
si->call_pre_init_constructors();