Index: client/linux/minidump_writer/linux_dumper.cc |
diff --git a/client/linux/minidump_writer/linux_dumper.cc b/client/linux/minidump_writer/linux_dumper.cc |
index c1e77c966ce5e8b02b1ae084eeb3e5808474a497..2f17c649e34cccc79d8351e2c30f76eae7ed2647 100644 |
--- a/client/linux/minidump_writer/linux_dumper.cc |
+++ b/client/linux/minidump_writer/linux_dumper.cc |
@@ -54,6 +54,7 @@ |
static const char kMappedFileUnsafePrefix[] = "/dev/"; |
static const char kDeletedSuffix[] = " (deleted)"; |
+static const char kReservedFlags[] = " ---p"; |
inline static bool IsMappedFileOpenUnsafe( |
const google_breakpad::MappingInfo& mapping) { |
@@ -296,6 +297,23 @@ bool LinuxDumper::EnumerateMappings() { |
continue; |
} |
} |
+ // Also merge mappings that result from address ranges that the |
+ // linker reserved but which a loaded library did not use. These |
+ // appear as an anonymous private mapping with no access flags set |
+ // and which directly follow an executable mapping. |
+ if (!name && !mappings_.empty()) { |
+ MappingInfo* module = mappings_.back(); |
+ if ((start_addr == module->start_addr + module->size) && |
+ module->exec && |
+ module->name && module->name[0] == '/' && |
+ offset == 0 && my_strncmp(i2, |
+ kReservedFlags, |
+ sizeof(kReservedFlags) - 1) == 0) { |
+ module->size = end_addr - module->start_addr; |
+ line_reader->PopLine(line_len); |
+ continue; |
+ } |
+ } |
MappingInfo* const module = new(allocator_) MappingInfo; |
my_memset(module, 0, sizeof(MappingInfo)); |
module->start_addr = start_addr; |