diff options
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(); |