diff --git a/Userland/Libraries/LibELF/DynamicLoader.cpp b/Userland/Libraries/LibELF/DynamicLoader.cpp index 47705df36e0..8694d9923a9 100644 --- a/Userland/Libraries/LibELF/DynamicLoader.cpp +++ b/Userland/Libraries/LibELF/DynamicLoader.cpp @@ -219,7 +219,8 @@ RefPtr DynamicLoader::load_stage_3(unsigned flags, size_t total_t { do_lazy_relocations(total_tls_size); if (flags & RTLD_LAZY) { - setup_plt_trampoline(); + if (m_dynamic_object->has_plt()) + setup_plt_trampoline(); } if (mprotect(m_text_segment_load_address.as_ptr(), m_text_segment_size, PROT_READ | PROT_EXEC) < 0) { @@ -491,6 +492,7 @@ extern "C" void _plt_trampoline(void) __attribute__((visibility("hidden"))); void DynamicLoader::setup_plt_trampoline() { ASSERT(m_dynamic_object); + ASSERT(m_dynamic_object->has_plt()); VirtualAddress got_address = m_dynamic_object->plt_got_base_address(); FlatPtr* got_ptr = (FlatPtr*)got_address.as_ptr(); diff --git a/Userland/Libraries/LibELF/DynamicObject.h b/Userland/Libraries/LibELF/DynamicObject.h index 75e9c5bf521..58dab9137b6 100644 --- a/Userland/Libraries/LibELF/DynamicObject.h +++ b/Userland/Libraries/LibELF/DynamicObject.h @@ -259,7 +259,8 @@ public: bool must_bind_now() const { return m_dt_flags & DF_BIND_NOW; } bool has_static_thread_local_storage() const { return m_dt_flags & DF_STATIC_TLS; } - VirtualAddress plt_got_base_address() const { return m_base_address.offset(m_procedure_linkage_table_offset); } + bool has_plt() const { return m_procedure_linkage_table_offset.has_value(); } + VirtualAddress plt_got_base_address() const { return m_base_address.offset(m_procedure_linkage_table_offset.value()); } VirtualAddress base_address() const { return m_base_address; } const char* soname() const { return m_has_soname ? symbol_string_table_string(m_soname_index) : nullptr; } @@ -328,7 +329,7 @@ private: Elf32_Sword m_procedure_linkage_table_relocation_type { -1 }; FlatPtr m_plt_relocation_offset_location { 0 }; // offset of PLT relocations, at end of relocations size_t m_size_of_plt_relocation_entry_list { 0 }; - FlatPtr m_procedure_linkage_table_offset { 0 }; + Optional m_procedure_linkage_table_offset; // NOTE: We'll only ever either RELA or REL entries, not both (thank god) // NOTE: The x86 ABI will only ever genrerate REL entries.