diff --git a/lldb/include/lldb/Target/SectionLoadList.h b/lldb/include/lldb/Target/SectionLoadList.h index 31970272f0e66fb0af6770bc6bb9f48847c84424..641b19e0f441ed9ee40ffc1eb1c5279544ae9132 100644 --- a/lldb/include/lldb/Target/SectionLoadList.h +++ b/lldb/include/lldb/Target/SectionLoadList.h @@ -53,7 +53,7 @@ public: ResolveLoadAddress (lldb::addr_t load_addr, Address &so_addr) const; bool - SetSectionLoadAddress (const Section *section, lldb::addr_t load_addr); + SetSectionLoadAddress (const Section *section, lldb::addr_t load_addr, bool warn_multiple = false); // The old load address should be specified when unloading to ensure we get // the correct instance of the section as a shared library could be loaded diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp index dd7a101fc9f210dd3dfb8d9f78d80d4dc7c07f92..2ea134c42d747cea7dd403ce6f9240c915731a61 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp @@ -440,18 +440,18 @@ DynamicLoaderMacOSXDYLD::UpdateImageLoadAddress (Module *module, DYLDImageInfo& if (section_sp) { - // Don't ever load any __LINKEDIT sections since the ones in the shared - // cached will be coalesced into a single section and we will get warnings - // about multiple sections mapping to the same address. - if (section_sp->GetName() != g_section_name_LINKEDIT) + // __LINKEDIT sections from files in the shared cache + // can overlap so check to see what the segment name is + // and pass "false" so we don't warn of overlapping + // "Section" objects, and "true" for all other sections. + const bool warn_multiple = section_sp->GetName() != g_section_name_LINKEDIT; + + const addr_t old_section_load_addr = m_process->GetTarget().GetSectionLoadList().GetSectionLoadAddress (section_sp.get()); + if (old_section_load_addr == LLDB_INVALID_ADDRESS || + old_section_load_addr != new_section_load_addr) { - const addr_t old_section_load_addr = m_process->GetTarget().GetSectionLoadList().GetSectionLoadAddress (section_sp.get()); - if (old_section_load_addr == LLDB_INVALID_ADDRESS || - old_section_load_addr != new_section_load_addr) - { - if (m_process->GetTarget().GetSectionLoadList().SetSectionLoadAddress (section_sp.get(), new_section_load_addr)) - changed = true; - } + if (m_process->GetTarget().GetSectionLoadList().SetSectionLoadAddress (section_sp.get(), new_section_load_addr, warn_multiple)) + changed = true; } } else diff --git a/lldb/source/Target/SectionLoadList.cpp b/lldb/source/Target/SectionLoadList.cpp index 05a97a297e96bb46d4ae73d71441a6e82b4c4b67..6add3ec6a2b859b5c726d3f50a87d8e6fd7e1217 100644 --- a/lldb/source/Target/SectionLoadList.cpp +++ b/lldb/source/Target/SectionLoadList.cpp @@ -57,7 +57,7 @@ SectionLoadList::GetSectionLoadAddress (const Section *section) const } bool -SectionLoadList::SetSectionLoadAddress (const Section *section, addr_t load_addr) +SectionLoadList::SetSectionLoadAddress (const Section *section, addr_t load_addr, bool warn_multiple) { LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER | LIBLLDB_LOG_VERBOSE)); @@ -77,6 +77,7 @@ SectionLoadList::SetSectionLoadAddress (const Section *section, addr_t load_addr if (section->GetByteSize() == 0) return false; // No change + // Fill in the section -> load_addr map Mutex::Locker locker(m_mutex); sect_to_addr_collection::iterator sta_pos = m_sect_to_addr.find(section); if (sta_pos != m_sect_to_addr.end()) @@ -89,10 +90,21 @@ SectionLoadList::SetSectionLoadAddress (const Section *section, addr_t load_addr else m_sect_to_addr[section] = load_addr; + // Fill in the load_addr -> section map addr_to_sect_collection::iterator ats_pos = m_addr_to_sect.find(load_addr); if (ats_pos != m_addr_to_sect.end()) { - if (section != ats_pos->second) + // Some sections are ok to overlap, and for others we should warn. When + // we have multiple load addresses that correspond to a section, we will + // allways attribute the section to the be last section that claims it + // exists at that address. Sometimes it is ok for more that one section + // to be loaded at a specific load address, and other times it isn't. + // The "warn_multiple" parameter tells us if we should warn in this case + // or not. The DynamicLoader plug-in subclasses should know which + // sections should warn and which shouldn't (darwin shared cache modules + // all shared the same "__LINKEDIT" sections, so the dynamic loader can + // pass false for "warn_multiple"). + if (warn_multiple && section != ats_pos->second) { ModuleSP module_sp (section->GetModule()); if (module_sp)