summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Core/Module.h14
-rw-r--r--lldb/source/Core/Module.cpp23
-rw-r--r--lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp30
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
OpenPOWER on IntegriCloud