diff options
-rw-r--r-- | lldb/include/lldb/Core/Module.h | 14 | ||||
-rw-r--r-- | lldb/source/Core/Module.cpp | 23 | ||||
-rw-r--r-- | lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp | 30 |
3 files changed, 67 insertions, 0 deletions
diff --git a/lldb/include/lldb/Core/Module.h b/lldb/include/lldb/Core/Module.h index c0925f0d903..fb65150a0d6 100644 --- a/lldb/include/lldb/Core/Module.h +++ b/lldb/include/lldb/Core/Module.h @@ -399,6 +399,20 @@ public: //------------------------------------------------------------------ bool IsExecutable (); + + //------------------------------------------------------------------ + /// Tells whether this module has been loaded in the target passed in. + /// This call doesn't distinguish between whether the module is loaded + /// by the dynamic loader, or by a "target module add" type call. + /// + /// @param[in] target + /// The target to check whether this is loaded in. + /// + /// @return + /// \b true if it is, \b false otherwise. + //------------------------------------------------------------------ + bool + IsLoadedInTarget (Target *target); //------------------------------------------------------------------ /// Get the number of compile units for this module. diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index 28780f4f99a..0e5f67a0ba6 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -690,6 +690,29 @@ Module::IsExecutable () return GetObjectFile()->IsExecutable(); } +bool +Module::IsLoadedInTarget (Target *target) +{ + ObjectFile *obj_file = GetObjectFile(); + if (obj_file) + { + SectionList *sections = obj_file->GetSectionList(); + if (sections != NULL) + { + size_t num_sections = sections->GetSize(); + bool loaded = false; + for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++) + { + SectionSP section_sp = sections->GetSectionAtIndex(sect_idx); + if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS) + { + return true; + } + } + } + } + return false; +} bool Module::SetArchitecture (const ArchSpec &new_arch) { diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp index 5f1d6a411cd..4eec4c866ef 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp @@ -947,6 +947,36 @@ DynamicLoaderMacOSXDYLD::InitializeFromAllImageInfos () } } } + + // Now we have one more bit of business. If there is a library left in the images for our target that + // doesn't have a load address, then it must be something that we were expecting to load (for instance we + // read a load command for it) but it didn't in fact load - probably because DYLD_*_PATH pointed + // to an equivalent version. We don't want it to stay in the target's module list or it will confuse + // us, so unload it here. + Target *target = m_process->CalculateTarget(); + ModuleList &modules = target->GetImages(); + ModuleList not_loaded_modules; + size_t num_modules = modules.GetSize(); + for (size_t i = 0; i < num_modules; i++) + { + ModuleSP module_sp = modules.GetModuleAtIndex(i); + if (!module_sp->IsLoadedInTarget (target)) + { + if (log) + { + StreamString s; + module_sp->GetDescription (&s); + log->Printf ("Unloading pre-run module: %s.", s.GetData ()); + } + not_loaded_modules.Append (module_sp); + } + } + + if (not_loaded_modules.GetSize() != 0) + { + target->ModulesDidUnload(not_loaded_modules); + } + return true; } else |