From 65ffd8de69513e5ca5d18d43b4b011543608eda0 Mon Sep 17 00:00:00 2001 From: Itamar Date: Sat, 9 Jan 2021 11:05:08 +0200 Subject: [PATCH] LibCoreDump: Add 'library_containing' API to CoreDump::Reader This API returns info about the library whose range in memory contains a given address (similar to 'region_containing', but for libraries). --- Libraries/LibCoreDump/Reader.cpp | 35 ++++++++++++++++++++++++++++++++ Libraries/LibCoreDump/Reader.h | 8 ++++++++ 2 files changed, 43 insertions(+) diff --git a/Libraries/LibCoreDump/Reader.cpp b/Libraries/LibCoreDump/Reader.cpp index 130c0bab9b..6646faee48 100644 --- a/Libraries/LibCoreDump/Reader.cpp +++ b/Libraries/LibCoreDump/Reader.cpp @@ -29,6 +29,7 @@ #include #include #include +#include namespace CoreDump { @@ -177,4 +178,38 @@ const HashMap Reader::metadata() const return metadata; } +struct LibraryData { + String name; + OwnPtr file; + ELF::Image lib_elf; +}; + +const Reader::LibraryData* Reader::library_containing(FlatPtr address) const +{ + static HashMap> cached_libs; + auto* region = region_containing(address); + if (!region) + return {}; + + auto name = region->object_name(); + + String path; + if (name.contains(".so")) + path = String::format("/usr/lib/%s", name.characters()); + else { + path = name; + } + + if (!cached_libs.contains(path)) { + auto lib_file = make(path); + if (!lib_file->is_valid()) + return {}; + auto image = ELF::Image((const u8*)lib_file->data(), lib_file->size()); + cached_libs.set(path, make(name, region->region_start, move(lib_file), move(image))); + } + + auto lib_data = cached_libs.get(path).value(); + return lib_data; +} + } diff --git a/Libraries/LibCoreDump/Reader.h b/Libraries/LibCoreDump/Reader.h index a05200ed44..6ca90aba14 100644 --- a/Libraries/LibCoreDump/Reader.h +++ b/Libraries/LibCoreDump/Reader.h @@ -58,6 +58,14 @@ public: Optional peek_memory(FlatPtr address) const; const ELF::Core::MemoryRegionInfo* region_containing(FlatPtr address) const; + struct LibraryData { + String name; + FlatPtr base_address { 0 }; + OwnPtr file; + ELF::Image lib_elf; + }; + const LibraryData* library_containing(FlatPtr address) const; + const Backtrace backtrace() const; const HashMap metadata() const;