diff options
-rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_linux.cc | 13 | ||||
-rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc | 7 | ||||
-rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h | 4 |
3 files changed, 14 insertions, 10 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc index f9b0c4e6bf7..70e2eb34618 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc @@ -166,6 +166,7 @@ const char *GetEnv(const char *name) { // ------------------ sanitizer_symbolizer.h typedef ElfW(Ehdr) Elf_Ehdr; typedef ElfW(Shdr) Elf_Shdr; +typedef ElfW(Phdr) Elf_Phdr; bool FindDWARFSection(uptr object_file_addr, const char *section_name, DWARFSection *section) { @@ -219,12 +220,16 @@ static int dl_iterate_phdr_cb(dl_phdr_info *info, size_t size, void *arg) { if (module_name == 0 || module_name[0] == '\0') return 0; void *mem = &data->modules[data->current_n]; - ModuleDIContext *cur_module = new(mem) ModuleDIContext(module_name); + ModuleDIContext *cur_module = new(mem) ModuleDIContext(module_name, + info->dlpi_addr); data->current_n++; for (int i = 0; i < info->dlpi_phnum; i++) { - uptr cur_beg = info->dlpi_addr + info->dlpi_phdr[i].p_vaddr; - uptr cur_end = cur_beg + info->dlpi_phdr[i].p_memsz; - cur_module->addAddressRange(cur_beg, cur_end); + const Elf_Phdr *phdr = &info->dlpi_phdr[i]; + if (phdr->p_type == PT_LOAD) { + uptr cur_beg = info->dlpi_addr + phdr->p_vaddr; + uptr cur_end = cur_beg + phdr->p_memsz; + cur_module->addAddressRange(cur_beg, cur_end); + } } InternalFree(module_name); return 0; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc index 438d4c401b4..85eb0764f19 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc @@ -38,7 +38,7 @@ void AddressInfo::Clear() { internal_memset(this, 0, sizeof(AddressInfo)); } -ModuleDIContext::ModuleDIContext(const char *module_name) { +ModuleDIContext::ModuleDIContext(const char *module_name, uptr base_address) { full_name_ = internal_strdup(module_name); short_name_ = internal_strrchr(module_name, '/'); if (short_name_ == 0) { @@ -46,7 +46,7 @@ ModuleDIContext::ModuleDIContext(const char *module_name) { } else { short_name_++; } - base_address_ = (uptr)-1; + base_address_ = base_address; n_ranges_ = 0; mapped_addr_ = 0; mapped_size_ = 0; @@ -56,7 +56,6 @@ void ModuleDIContext::addAddressRange(uptr beg, uptr end) { CHECK_LT(n_ranges_, kMaxNumberOfAddressRanges); ranges_[n_ranges_].beg = beg; ranges_[n_ranges_].end = end; - base_address_ = Min(base_address_, beg); n_ranges_++; } @@ -130,7 +129,7 @@ class Symbolizer { } return 0; } - static const uptr kMaxNumberOfModuleContexts = 256; + static const uptr kMaxNumberOfModuleContexts = 4096; // Array of module debug info contexts is leaked. ModuleDIContext *modules_; uptr n_modules_; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h index f86fcf33039..c813e8088d7 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h @@ -68,7 +68,7 @@ bool IsFullNameOfDWARFSection(const char *full_name, const char *short_name); class ModuleDIContext { public: - explicit ModuleDIContext(const char *module_name); + ModuleDIContext(const char *module_name, uptr base_address); void addAddressRange(uptr beg, uptr end); bool containsAddress(uptr address) const; void getAddressInfo(AddressInfo *info); @@ -85,7 +85,7 @@ class ModuleDIContext { char *full_name_; char *short_name_; uptr base_address_; - static const uptr kMaxNumberOfAddressRanges = 16; + static const uptr kMaxNumberOfAddressRanges = 8; AddressRange ranges_[kMaxNumberOfAddressRanges]; uptr n_ranges_; uptr mapped_addr_; |