From f23b29f60581667597fc7db27abd6f1d5911b5b0 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 21 Feb 2021 00:29:08 +0100 Subject: [PATCH] LibELF: Move DynamicObject::lookup_symbol() to DynamicLoader Also simplify it by removing an unreachable code path. --- Userland/Libraries/LibELF/DynamicLoader.cpp | 11 +++++++++-- Userland/Libraries/LibELF/DynamicLoader.h | 4 ++-- Userland/Libraries/LibELF/DynamicObject.cpp | 19 +++---------------- Userland/Libraries/LibELF/DynamicObject.h | 2 -- 4 files changed, 14 insertions(+), 22 deletions(-) diff --git a/Userland/Libraries/LibELF/DynamicLoader.cpp b/Userland/Libraries/LibELF/DynamicLoader.cpp index ead38bee73b..63be9b4548c 100644 --- a/Userland/Libraries/LibELF/DynamicLoader.cpp +++ b/Userland/Libraries/LibELF/DynamicLoader.cpp @@ -1,6 +1,7 @@ /* * Copyright (c) 2019-2020, Andrew Kaster * Copyright (c) 2020, Itamar S. + * Copyright (c) 2021, Andreas Kling * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -28,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -570,9 +572,14 @@ void DynamicLoader::call_object_init_functions() } } -Optional DynamicLoader::lookup_symbol(const ELF::DynamicObject::Symbol& symbol) const +Optional DynamicLoader::lookup_symbol(const ELF::DynamicObject::Symbol& symbol) { - return m_dynamic_object->lookup_symbol(symbol); + dbgln_if(DYNAMIC_LOAD_DEBUG, "looking up symbol: {}", symbol.name()); + if (symbol.is_undefined() || symbol.bind() == STB_WEAK) + return DynamicLinker::lookup_global_symbol(symbol.name()); + + dbgln_if(DYNAMIC_LOAD_DEBUG, "symbol is defined in its object"); + return DynamicObject::SymbolLookupResult { symbol.value(), symbol.address(), symbol.bind(), &symbol.object() }; } } // end namespace ELF diff --git a/Userland/Libraries/LibELF/DynamicLoader.h b/Userland/Libraries/LibELF/DynamicLoader.h index 54dac908846..cc85270c2b0 100644 --- a/Userland/Libraries/LibELF/DynamicLoader.h +++ b/Userland/Libraries/LibELF/DynamicLoader.h @@ -71,6 +71,8 @@ public: VirtualAddress text_segment_load_address() const { return m_text_segment_load_address; } bool is_dynamic() const { return m_elf_image.is_dynamic(); } + static Optional lookup_symbol(const ELF::DynamicObject::Symbol&); + private: DynamicLoader(int fd, String filename, void* file_data, size_t file_size); @@ -121,8 +123,6 @@ private: RelocationResult do_relocation(size_t total_tls_size, const DynamicObject::Relocation&); size_t calculate_tls_size() const; - Optional lookup_symbol(const ELF::DynamicObject::Symbol&) const; - String m_filename; String m_program_interpreter; size_t m_file_size { 0 }; diff --git a/Userland/Libraries/LibELF/DynamicObject.cpp b/Userland/Libraries/LibELF/DynamicObject.cpp index 7de32583f64..a238f731cfa 100644 --- a/Userland/Libraries/LibELF/DynamicObject.cpp +++ b/Userland/Libraries/LibELF/DynamicObject.cpp @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include #include @@ -458,7 +458,7 @@ static const char* name_for_dtag(Elf32_Sword d_tag) } } -Optional DynamicObject::lookup_symbol(const StringView& name) const +auto DynamicObject::lookup_symbol(const StringView& name) const -> Optional { auto result = hash_section().lookup_symbol(name); if (!result.has_value()) @@ -482,7 +482,7 @@ VirtualAddress DynamicObject::patch_plt_entry(u32 relocation_offset) auto symbol = relocation.symbol(); u8* relocation_address = relocation.address().as_ptr(); - auto result = lookup_symbol(symbol); + auto result = DynamicLoader::lookup_symbol(symbol); if (!result.has_value()) { dbgln("did not find symbol: {}", symbol.name()); ASSERT_NOT_REACHED(); @@ -496,17 +496,4 @@ VirtualAddress DynamicObject::patch_plt_entry(u32 relocation_offset) return symbol_location; } -Optional DynamicObject::lookup_symbol(const ELF::DynamicObject::Symbol& symbol) const -{ - dbgln_if(DYNAMIC_LOAD_DEBUG, "looking up symbol: {}", symbol.name()); - if (symbol.is_undefined() || symbol.bind() == STB_WEAK) - return DynamicLinker::lookup_global_symbol(symbol.name()); - - if (!symbol.is_undefined()) { - dbgln_if(DYNAMIC_LOAD_DEBUG, "symbol is defined in its object"); - return SymbolLookupResult { symbol.value(), symbol.address(), symbol.bind(), &symbol.object() }; - } - return DynamicLinker::lookup_global_symbol(symbol.name()); -} - } // end namespace ELF diff --git a/Userland/Libraries/LibELF/DynamicObject.h b/Userland/Libraries/LibELF/DynamicObject.h index ca71208e81a..e65b02652f7 100644 --- a/Userland/Libraries/LibELF/DynamicObject.h +++ b/Userland/Libraries/LibELF/DynamicObject.h @@ -264,8 +264,6 @@ public: // Will be called from _fixup_plt_entry, as part of the PLT trampoline VirtualAddress patch_plt_entry(u32 relocation_offset); - Optional lookup_symbol(const ELF::DynamicObject::Symbol&) const; - bool elf_is_dynamic() const { return m_is_elf_dynamic; } private: