diff --git a/DevTools/ProfileViewer/DisassemblyModel.cpp b/DevTools/ProfileViewer/DisassemblyModel.cpp index c0a0a3ddb69..b5d02aa353b 100644 --- a/DevTools/ProfileViewer/DisassemblyModel.cpp +++ b/DevTools/ProfileViewer/DisassemblyModel.cpp @@ -80,7 +80,7 @@ DisassemblyModel::DisassemblyModel(Profile& profile, ProfileNode& node) if (!m_file->is_valid()) return; - auto elf_loader = make((const u8*)m_file->data(), m_file->size()); + auto elf_loader = ELF::Loader::create((const u8*)m_file->data(), m_file->size()); auto symbol = elf_loader->find_symbol(node.address()); if (!symbol.has_value()) diff --git a/DevTools/ProfileViewer/Profile.cpp b/DevTools/ProfileViewer/Profile.cpp index 1d19b8e341e..b6653c876df 100644 --- a/DevTools/ProfileViewer/Profile.cpp +++ b/DevTools/ProfileViewer/Profile.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -185,12 +186,12 @@ OwnPtr Profile::load_from_perfcore_file(const StringView& path) return nullptr; } - auto elf_loader = make(static_cast(elf_file.data()), elf_file.size()); + auto elf_loader = ELF::Loader::create(static_cast(elf_file.data()), elf_file.size()); MappedFile kernel_elf_file("/boot/kernel"); - OwnPtr kernel_elf_loader; + RefPtr kernel_elf_loader; if (kernel_elf_file.is_valid()) - kernel_elf_loader = make(static_cast(kernel_elf_file.data()), kernel_elf_file.size()); + kernel_elf_loader = ELF::Loader::create(static_cast(kernel_elf_file.data()), kernel_elf_file.size()); auto events_value = object.get("events"); if (!events_value.is_array()) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 45c5623863c..c761a9fcf6f 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -885,7 +886,7 @@ int Process::do_exec(NonnullRefPtr main_program_description, Ve u32 entry_eip = 0; MM.enter_process_paging_scope(*this); - OwnPtr loader; + RefPtr loader; { ArmedScopeGuard rollback_regions_guard([&]() { ASSERT(Process::current == this); @@ -893,7 +894,7 @@ int Process::do_exec(NonnullRefPtr main_program_description, Ve m_regions = move(old_regions); MM.enter_process_paging_scope(*this); }); - loader = make(region->vaddr().as_ptr(), loader_metadata.size); + loader = ELF::Loader::create(region->vaddr().as_ptr(), loader_metadata.size); // Load the correct executable -- either interp or main program. // FIXME: Once we actually load both interp and main, we'll need to be more clever about this. // In that case, both will be ET_DYN objects, so they'll both be completely relocatable. @@ -4888,7 +4889,7 @@ OwnPtr Process::elf_bundle() const bundle->region = MM.allocate_kernel_region_with_vmobject(const_cast(vmobject), vmobject.size(), "ELF bundle", Region::Access::Read); if (!bundle->region) return nullptr; - bundle->elf_loader = make(bundle->region->vaddr().as_ptr(), bundle->region->size()); + bundle->elf_loader = ELF::Loader::create(bundle->region->vaddr().as_ptr(), bundle->region->size()); return bundle; } diff --git a/Kernel/Process.h b/Kernel/Process.h index e4148148bb4..789e3daf962 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -391,7 +391,7 @@ public: struct ELFBundle { OwnPtr region; - OwnPtr elf_loader; + RefPtr elf_loader; }; OwnPtr elf_bundle() const; diff --git a/Libraries/LibELF/Loader.h b/Libraries/LibELF/Loader.h index f9ea2877a45..e585d0f9768 100644 --- a/Libraries/LibELF/Loader.h +++ b/Libraries/LibELF/Loader.h @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -42,9 +43,9 @@ class Region; namespace ELF { -class Loader { +class Loader : public RefCounted { public: - explicit Loader(const u8*, size_t); + static NonnullRefPtr create(const u8* data, size_t size) { return adopt(*new Loader(data, size)); } ~Loader(); bool load(); @@ -67,6 +68,8 @@ public: Optional find_symbol(u32 address, u32* offset = nullptr) const; private: + explicit Loader(const u8*, size_t); + bool layout(); bool perform_relocations(); void* lookup(const ELF::Image::Symbol&);