summaryrefslogtreecommitdiff
path: root/Userland/Libraries
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-02-05 12:10:45 +0100
committerAndreas Kling <kling@serenityos.org>2021-02-05 12:10:45 +0100
commit4df3a34bc29a4fde57bd0d1ae408a3d094c10b62 (patch)
tree6b1b7b8668ff6a79315957e6f94b9b2eede493bc /Userland/Libraries
parent9d471ea923c10edac6dae16558c640b0f4ff1450 (diff)
downloadserenity-4df3a34bc29a4fde57bd0d1ae408a3d094c10b62.zip
LibELF: Only set up PLT trampoline for objects with a PLT
Diffstat (limited to 'Userland/Libraries')
-rw-r--r--Userland/Libraries/LibELF/DynamicLoader.cpp4
-rw-r--r--Userland/Libraries/LibELF/DynamicObject.h5
2 files changed, 6 insertions, 3 deletions
diff --git a/Userland/Libraries/LibELF/DynamicLoader.cpp b/Userland/Libraries/LibELF/DynamicLoader.cpp
index 47705df36e..8694d9923a 100644
--- a/Userland/Libraries/LibELF/DynamicLoader.cpp
+++ b/Userland/Libraries/LibELF/DynamicLoader.cpp
@@ -219,7 +219,8 @@ RefPtr<DynamicObject> 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 75e9c5bf52..58dab9137b 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<FlatPtr> 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.