summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_linux.cc13
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc7
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h4
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_;
OpenPOWER on IntegriCloud