Add method Module::IsLoadedInTarget, and then in the MacOS X dynamic loader, after we

have initialized our shared library state, discard all the modules that didn't make
it into the running process.

llvm-svn: 136755
This commit is contained in:
Jim Ingham 2011-08-03 01:03:17 +00:00
parent e716ae02a9
commit b53cb271ca
3 changed files with 67 additions and 0 deletions

View File

@ -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.

View File

@ -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)
{

View File

@ -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