Index: lib/lsan/lsan_common_mac.cc =================================================================== --- lib/lsan/lsan_common_mac.cc +++ lib/lsan/lsan_common_mac.cc @@ -104,8 +104,16 @@ for (const __sanitizer::LoadedModule::AddressRange &range : modules[i].ranges()) { - // Sections storing global variables are writable and non-executable - if (range.executable || !range.writable) continue; + // Sections which may contain global variables + if (internal_strcmp(range.name, "__DATA") && + internal_strcmp(range.name, "__data") && + internal_strcmp(range.name, "__objc_data") && + internal_strcmp(range.name, "__objc_opt_rw") && + internal_strcmp(range.name, "__objc_opt_ptrs") && + internal_strcmp(range.name, "__bss") && + internal_strcmp(range.name, "__common")) { + continue; + } ScanGlobalRange(range.beg, range.end, frontier); } Index: lib/sanitizer_common/sanitizer_common.h =================================================================== --- lib/sanitizer_common/sanitizer_common.h +++ lib/sanitizer_common/sanitizer_common.h @@ -702,6 +702,7 @@ } const uptr kModuleUUIDSize = 16; +const uptr kMaxSegName = 16; // Represents a binary loaded into virtual memory (e.g. this can be an // executable or a shared object). @@ -720,7 +721,8 @@ void set(const char *module_name, uptr base_address, ModuleArch arch, u8 uuid[kModuleUUIDSize], bool instrumented); void clear(); - void addAddressRange(uptr beg, uptr end, bool executable, bool writable); + void addAddressRange(uptr beg, uptr end, bool executable, bool writable, + char *name = nullptr); bool containsAddress(uptr address) const; const char *full_name() const { return full_name_; } @@ -736,13 +738,16 @@ uptr end; bool executable; bool writable; + char name[kMaxSegName]; - AddressRange(uptr beg, uptr end, bool executable, bool writable) + AddressRange(uptr beg, uptr end, bool executable, bool writable, char *name) : next(nullptr), beg(beg), end(end), executable(executable), - writable(writable) {} + writable(writable) { + if (name) internal_strncpy(this->name, name, kMaxSegName); + } }; const IntrusiveList &ranges() const { return ranges_; } Index: lib/sanitizer_common/sanitizer_common.cc =================================================================== --- lib/sanitizer_common/sanitizer_common.cc +++ lib/sanitizer_common/sanitizer_common.cc @@ -285,9 +285,10 @@ } void LoadedModule::addAddressRange(uptr beg, uptr end, bool executable, - bool writable) { + bool writable, char *name) { void *mem = InternalAlloc(sizeof(AddressRange)); - AddressRange *r = new(mem) AddressRange(beg, end, executable, writable); + AddressRange *r = + new(mem) AddressRange(beg, end, executable, writable, name); ranges_.push_back(r); if (executable && end > max_executable_address_) max_executable_address_ = end; Index: lib/sanitizer_common/sanitizer_procmaps.h =================================================================== --- lib/sanitizer_common/sanitizer_procmaps.h +++ lib/sanitizer_common/sanitizer_procmaps.h @@ -41,6 +41,7 @@ uptr start; uptr end; uptr offset; + char name[kMaxSegName]; }; class MemoryMappedSegment { @@ -64,6 +65,7 @@ uptr protection; ModuleArch arch; u8 uuid[kModuleUUIDSize]; + char name[kMaxSegName]; bool has_sections; private: Index: lib/sanitizer_common/sanitizer_procmaps_mac.cc =================================================================== --- lib/sanitizer_common/sanitizer_procmaps_mac.cc +++ lib/sanitizer_common/sanitizer_procmaps_mac.cc @@ -44,6 +44,8 @@ section->end = section->start + sc->size; section->offset = sc->offset; + internal_strncpy(section->name, sc->sectname, kMaxSegName); + nsects_--; return true; } @@ -202,6 +204,7 @@ : _dyld_get_image_name(current_image_); internal_strncpy(segment->filename, src, segment->filename_size); } + internal_strncpy(segment->name, sc->segname, kMaxSegName); segment->arch = current_arch_; internal_memcpy(segment->uuid, current_uuid_, kModuleUUIDSize); return true; @@ -340,12 +343,14 @@ } if (!segment.has_sections) { cur_module->addAddressRange(segment.start, segment.end, - segment.IsExecutable(), segment.IsWritable()); + segment.IsExecutable(), segment.IsWritable(), + segment.name); continue; } while (segment.Next(§ion)) { cur_module->addAddressRange(section.start, section.end, - segment.IsExecutable(), segment.IsWritable()); + segment.IsExecutable(), segment.IsWritable(), + section.name); } } }