Improved detection of object file types, moving

detection of kernels into the object file and
adding a new category for raw binary images.
Fixed all clients who previously searched for
sections manually, making them use the object
file's facilities instead.

llvm-svn: 150272
This commit is contained in:
Sean Callanan
2012-02-10 20:22:35 +00:00
parent 1ada7bc09d
commit 49bce8ecdb
6 changed files with 33 additions and 28 deletions

View File

@@ -58,15 +58,7 @@ DynamicLoaderDarwinKernel::CreateInstance (Process* process, bool force)
ObjectFile *object_file = exe_module->GetObjectFile();
if (object_file)
{
SectionList *section_list = object_file->GetSectionList();
if (section_list)
{
static ConstString g_kld_section_name ("__KLD");
if (section_list->FindSectionByName (g_kld_section_name))
{
create = true;
}
}
create = (object_file->GetStrata() == ObjectFile::eStrataKernel);
}
}

View File

@@ -98,15 +98,7 @@ DynamicLoaderMacOSXDYLD::CreateInstance (Process* process, bool force)
ObjectFile *object_file = exe_module->GetObjectFile();
if (object_file)
{
SectionList *section_list = object_file->GetSectionList();
if (section_list)
{
static ConstString g_kld_section_name ("__KLD");
if (section_list->FindSectionByName (g_kld_section_name))
{
create = false;
}
}
create = (object_file->GetStrata() == ObjectFile::eStrataUser);
}
}

View File

@@ -33,6 +33,19 @@ DynamicLoaderStatic::CreateInstance (Process* process, bool force)
create = true;
}
if (!create)
{
Module *exe_module = process->GetTarget().GetExecutableModulePointer();
if (exe_module)
{
ObjectFile *object_file = exe_module->GetObjectFile();
if (object_file)
{
create = (object_file->GetStrata() == ObjectFile::eStrataRawImage);
}
}
}
if (create)
return new DynamicLoaderStatic (process);
return NULL;

View File

@@ -2180,12 +2180,24 @@ ObjectFileMachO::CalculateStrata()
case HeaderFileTypeExecutable: // 0x2u MH_EXECUTE
// Check for the MH_DYLDLINK bit in the flags
if (m_header.flags & HeaderFlagBitIsDynamicLinkObject)
{
return eStrataUser;
return eStrataKernel;
}
else
{
SectionList *section_list = GetSectionList();
if (section_list)
{
static ConstString g_kld_section_name ("__KLD");
if (section_list->FindSectionByName(g_kld_section_name))
return eStrataKernel;
}
}
return eStrataRawImage;
case HeaderFileTypeFixedVMShlib: return eStrataUser; // 0x3u MH_FVMLIB
case HeaderFileTypeCore: return eStrataUnknown; // 0x4u MH_CORE
case HeaderFileTypePreloadedExecutable: return eStrataUser; // 0x5u MH_PRELOAD
case HeaderFileTypePreloadedExecutable: return eStrataRawImage; // 0x5u MH_PRELOAD
case HeaderFileTypeDynamicShlib: return eStrataUser; // 0x6u MH_DYLIB
case HeaderFileTypeDynamicLinkEditor: return eStrataUser; // 0x7u MH_DYLINKER
case HeaderFileTypeBundle: return eStrataUser; // 0x8u MH_BUNDLE

View File

@@ -68,14 +68,9 @@ OperatingSystemDarwinKernel::CreateInstance (Process *process, bool force)
ObjectFile *object_file = exe_module->GetObjectFile();
if (object_file)
{
SectionList *section_list = object_file->GetSectionList();
if (section_list)
if (object_file->GetStrata() != ObjectFile::eStrataKernel)
{
static ConstString g_kld_section_name ("__KLD");
if (section_list->FindSectionByName (g_kld_section_name))
{
create = true;
}
return NULL;
}
}
}