LibCoreDump: Make symbolication work when .text isn't the first segment

This can happen with binaries built with Clang or with a custom linker
script.
This commit is contained in:
Gunnar Beutner 2021-07-27 17:01:29 +02:00 committed by Andreas Kling
parent 99d46caa28
commit c9118b84b7
Notes: sideshowbarker 2024-07-18 08:02:16 +09:00
3 changed files with 21 additions and 3 deletions

View file

@ -79,14 +79,18 @@ Backtrace::~Backtrace()
void Backtrace::add_entry(const Reader& coredump, FlatPtr ip)
{
auto* region = coredump.region_containing((FlatPtr)ip);
if (!region) {
auto* ip_region = coredump.region_containing((FlatPtr)ip);
if (!ip_region) {
m_entries.append({ ip, {}, {}, {} });
return;
}
auto object_name = region->object_name();
auto object_name = ip_region->object_name();
if (object_name == "Loader.so")
return;
// We need to find the first region for the object, just in case
// the PT_LOAD header for the .text segment isn't the first one
// in the object file.
auto region = coredump.first_region_for_object(object_name);
auto* object_info = object_info_for_region(*region);
if (!object_info)
return;

View file

@ -137,6 +137,19 @@ const JsonObject Reader::process_info() const
// FIXME: Maybe just cache this on the Reader instance after first access.
}
ELF::Core::MemoryRegionInfo const* Reader::first_region_for_object(StringView object_name) const
{
ELF::Core::MemoryRegionInfo const* ret = nullptr;
for_each_memory_region_info([&ret, &object_name](auto& region_info) {
if (region_info.object_name() == object_name) {
ret = &region_info;
return IterationDecision::Break;
}
return IterationDecision::Continue;
});
return ret;
}
const ELF::Core::MemoryRegionInfo* Reader::region_containing(FlatPtr address) const
{
const ELF::Core::MemoryRegionInfo* ret = nullptr;

View file

@ -32,6 +32,7 @@ public:
const ELF::Image& image() const { return m_coredump_image; }
Optional<FlatPtr> peek_memory(FlatPtr address) const;
ELF::Core::MemoryRegionInfo const* first_region_for_object(StringView object_name) const;
const ELF::Core::MemoryRegionInfo* region_containing(FlatPtr address) const;
struct LibraryData {