forked from OSchip/llvm-project
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:
parent
e716ae02a9
commit
b53cb271ca
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue