From ac762fbbc3d67d2af22fca157846a03fb3f1c145 Mon Sep 17 00:00:00 2001 From: Itamar Date: Sat, 20 Nov 2021 11:48:45 +0200 Subject: [PATCH] LibCoredump: Add Reader::for_each_library --- Userland/Libraries/LibCoredump/Reader.cpp | 23 +++++++++++++++++++++++ Userland/Libraries/LibCoredump/Reader.h | 8 ++++++++ 2 files changed, 31 insertions(+) diff --git a/Userland/Libraries/LibCoredump/Reader.cpp b/Userland/Libraries/LibCoredump/Reader.cpp index c5126e689a..ae3ddbaa1c 100644 --- a/Userland/Libraries/LibCoredump/Reader.cpp +++ b/Userland/Libraries/LibCoredump/Reader.cpp @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include @@ -292,4 +293,26 @@ const Reader::LibraryData* Reader::library_containing(FlatPtr address) const return lib_data; } +void Reader::for_each_library(Function func) const +{ + HashTable libraries; + for_each_memory_region_info([&](ELF::Core::MemoryRegionInfo const& region) { + auto name = region.object_name(); + if (name.is_null() || libraries.contains(name)) + return IterationDecision::Continue; + + libraries.set(name); + + String path; + if (Core::File::looks_like_shared_library(name)) + path = String::formatted("/usr/lib/{}", name); + else { + path = name; + } + + func(LibraryInfo { name, path, (FlatPtr)region.region_start }); + return IterationDecision::Continue; + }); +} + } diff --git a/Userland/Libraries/LibCoredump/Reader.h b/Userland/Libraries/LibCoredump/Reader.h index 9263cf13b4..911e1e4ed6 100644 --- a/Userland/Libraries/LibCoredump/Reader.h +++ b/Userland/Libraries/LibCoredump/Reader.h @@ -26,6 +26,14 @@ public: template void for_each_memory_region_info(Func func) const; + struct LibraryInfo { + String name; + String path; + FlatPtr base_address { 0 }; + }; + + void for_each_library(Function func) const; + template void for_each_thread_info(Func func) const;