mirror of
https://github.com/intel/llvm.git
synced 2026-01-23 07:58:23 +08:00
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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user