瀏覽代碼

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).
Itamar 4 年之前
父節點
當前提交
65ffd8de69
共有 2 個文件被更改,包括 43 次插入0 次删除
  1. 35 0
      Libraries/LibCoreDump/Reader.cpp
  2. 8 0
      Libraries/LibCoreDump/Reader.h

+ 35 - 0
Libraries/LibCoreDump/Reader.cpp

@@ -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;
+}
+
 }

+ 8 - 0
Libraries/LibCoreDump/Reader.h

@@ -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;