1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 21:07:35 +00:00

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).
This commit is contained in:
Itamar 2021-01-09 11:05:08 +02:00 committed by Andreas Kling
parent 399091dec3
commit 65ffd8de69
2 changed files with 43 additions and 0 deletions

View file

@ -29,6 +29,7 @@
#include <LibCoreDump/Backtrace.h>
#include <LibCoreDump/Reader.h>
#include <string.h>
#include <sys/stat.h>
namespace CoreDump {
@ -177,4 +178,38 @@ const HashMap<String, String> Reader::metadata() const
return metadata;
}
struct LibraryData {
String name;
OwnPtr<MappedFile> file;
ELF::Image lib_elf;
};
const Reader::LibraryData* Reader::library_containing(FlatPtr address) const
{
static HashMap<String, OwnPtr<LibraryData>> 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<MappedFile>(path);
if (!lib_file->is_valid())
return {};
auto image = ELF::Image((const u8*)lib_file->data(), lib_file->size());
cached_libs.set(path, make<LibraryData>(name, region->region_start, move(lib_file), move(image)));
}
auto lib_data = cached_libs.get(path).value();
return lib_data;
}
}

View file

@ -58,6 +58,14 @@ public:
Optional<uint32_t> peek_memory(FlatPtr address) const;
const ELF::Core::MemoryRegionInfo* region_containing(FlatPtr address) const;
struct LibraryData {
String name;
FlatPtr base_address { 0 };
OwnPtr<MappedFile> file;
ELF::Image lib_elf;
};
const LibraryData* library_containing(FlatPtr address) const;
const Backtrace backtrace() const;
const HashMap<String, String> metadata() const;