[Lldb-commits] [lldb] r134682 - in /lldb/trunk/source: Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h lldb.cpp
Greg Clayton
gclayton at apple.com
Thu Jul 7 21:11:42 PDT 2011
Author: gclayton
Date: Thu Jul 7 23:11:42 2011
New Revision: 134682
URL: http://llvm.org/viewvc/llvm-project?rev=134682&view=rev
Log:
LLDB now has a Kernel dynamic linker that can detect where kexts are
loaded. It locks onto *-apple-darwin binaries where the binary has
a "__KLD" segment. Soon I will modify the lldb_private::ObjectFile
class to return an executable type which will be an enum with values
something like:
eObjectFileTypeUserExectable,
eObjectFileTypeUserSharedLibrary,
eObjectFileTypeKernelExectable,
eObjectFileTypeKernelSharedLibrary,
eObjectFileTypeObjectFile,
eObjectFileTypeCoreFile
But for now we look at the section since a user and kernel mach-o
executable have the same mach-o file type.
Modified:
lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
lldb/trunk/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp
lldb/trunk/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h
lldb/trunk/source/lldb.cpp
Modified: lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp?rev=134682&r1=134681&r2=134682&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp (original)
+++ lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp Thu Jul 7 23:11:42 2011
@@ -88,9 +88,30 @@
bool create = force;
if (!create)
{
- const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple();
- if (triple_ref.getOS() == llvm::Triple::Darwin && triple_ref.getVendor() == llvm::Triple::Apple)
- create = true;
+ create = true;
+ Module* exe_module = process->GetTarget().GetExecutableModule().get();
+ if (exe_module)
+ {
+ 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;
+ }
+ }
+ }
+ }
+
+ if (create)
+ {
+ const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple();
+ create = triple_ref.getOS() == llvm::Triple::Darwin && triple_ref.getVendor() == llvm::Triple::Apple;
+ }
}
if (create)
Modified: lldb/trunk/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp?rev=134682&r1=134681&r2=134682&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp (original)
+++ lldb/trunk/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp Thu Jul 7 23:11:42 2011
@@ -51,9 +51,29 @@
bool create = force;
if (!create)
{
- const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple();
- if (triple_ref.getOS() == llvm::Triple::Darwin && triple_ref.getVendor() == llvm::Triple::Apple)
- create = true;
+ Module* exe_module = process->GetTarget().GetExecutableModule().get();
+ if (exe_module)
+ {
+ 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;
+ }
+ }
+ }
+ }
+
+ if (create)
+ {
+ const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple();
+ create = triple_ref.getOS() == llvm::Triple::Darwin && triple_ref.getVendor() == llvm::Triple::Apple;
+ }
}
if (create)
@@ -160,14 +180,22 @@
if (m_kernel.module_sp)
{
static ConstString mach_header_name ("_mh_execute_header");
- const Symbol *symbol = m_kernel.module_sp->FindFirstSymbolWithNameAndType (mach_header_name, eSymbolTypeAbsolute);
+ static ConstString kext_summary_symbol ("gLoadedKextSummaries");
+ const Symbol *symbol = NULL;
+ symbol = m_kernel.module_sp->FindFirstSymbolWithNameAndType (kext_summary_symbol, eSymbolTypeData);
+ if (symbol)
+ m_kext_summary_header_addr = symbol->GetValue();
+
+ symbol = m_kernel.module_sp->FindFirstSymbolWithNameAndType (mach_header_name, eSymbolTypeAbsolute);
if (symbol)
{
- m_kernel.so_address = symbol->GetValue();
+ // The "_mh_execute_header" symbol is absolute and not a section based
+ // symbol that will have a valid address, so we need to resolve it...
+ m_process->GetTarget().GetImages().ResolveFileAddress (symbol->GetValue().GetFileAddress(), m_kernel.so_address);
DataExtractor data; // Load command data
if (ReadMachHeader (m_kernel, &data))
{
- if (m_kernel.header.filetype == llvm::MachO::HeaderFileTypeDynamicLinkEditor)
+ if (m_kernel.header.filetype == llvm::MachO::HeaderFileTypeExecutable)
{
if (ParseLoadCommands (data, m_kernel))
UpdateImageLoadAddress (m_kernel);
@@ -665,16 +693,16 @@
// Parse the load commands for an image
//----------------------------------------------------------------------
uint32_t
-DynamicLoaderMacOSXKernel::ParseLoadCommands (const DataExtractor& data, OSKextLoadedKextSummary& dylib_info)
+DynamicLoaderMacOSXKernel::ParseLoadCommands (const DataExtractor& data, OSKextLoadedKextSummary& image_info)
{
uint32_t offset = 0;
uint32_t cmd_idx;
Segment segment;
- dylib_info.Clear (true);
+ image_info.Clear (true);
- for (cmd_idx = 0; cmd_idx < dylib_info.header.ncmds; cmd_idx++)
+ for (cmd_idx = 0; cmd_idx < image_info.header.ncmds; cmd_idx++)
{
- // Clear out any load command specific data from DYLIB_INFO since
+ // Clear out any load command specific data from image_info since
// we are about to read it.
if (data.ValidOffsetForDataOfSize (offset, sizeof(llvm::MachO::load_command)))
@@ -696,7 +724,7 @@
segment.filesize = data.GetU32 (&offset);
// Extract maxprot, initprot, nsects and flags all at once
data.GetU32(&offset, &segment.maxprot, 4);
- dylib_info.segments.push_back (segment);
+ image_info.segments.push_back (segment);
}
break;
@@ -707,12 +735,12 @@
data.GetU64(&offset, &segment.vmaddr, 4);
// Extract maxprot, initprot, nsects and flags all at once
data.GetU32(&offset, &segment.maxprot, 4);
- dylib_info.segments.push_back (segment);
+ image_info.segments.push_back (segment);
}
break;
case llvm::MachO::LoadCommandUUID:
- dylib_info.uuid.SetBytes(data.GetData (&offset, 16));
+ image_info.uuid.SetBytes(data.GetData (&offset, 16));
break;
default:
@@ -732,21 +760,30 @@
// that is greater than zero) in the object file.
// Determine the slide amount (if any)
- const size_t num_sections = dylib_info.segments.size();
+ const size_t num_sections = image_info.segments.size();
for (size_t i = 0; i < num_sections; ++i)
{
// Iterate through the object file sections to find the
// first section that starts of file offset zero and that
// has bytes in the file...
- if (dylib_info.segments[i].fileoff == 0 && dylib_info.segments[i].filesize > 0)
+ if (image_info.segments[i].fileoff == 0 && image_info.segments[i].filesize > 0)
{
- dylib_info.slide = dylib_info.address - dylib_info.segments[i].vmaddr;
+ image_info.slide = image_info.address - image_info.segments[i].vmaddr;
// We have found the slide amount, so we can exit
// this for loop.
break;
}
}
#endif
+ if (image_info.uuid.IsValid())
+ {
+ bool did_create = false;
+ if (FindTargetModule(image_info, true, &did_create))
+ {
+ if (did_create)
+ image_info.module_create_stop_id = m_process->GetStopID();
+ }
+ }
return cmd_idx;
}
Modified: lldb/trunk/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h?rev=134682&r1=134681&r2=134682&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h (original)
+++ lldb/trunk/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h Thu Jul 7 23:11:42 2011
@@ -193,6 +193,7 @@
{
char name[KERNEL_MODULE_MAX_NAME];
lldb::ModuleSP module_sp;
+ uint32_t module_create_stop_id;
lldb_private::UUID uuid; // UUID for this dylib if it has one, else all zeros
lldb_private::Address so_address; // The section offset address for this kext in case it can be read from object files
uint64_t address;
@@ -206,6 +207,7 @@
OSKextLoadedKextSummary() :
module_sp (),
+ module_create_stop_id (UINT32_MAX),
uuid (),
so_address (),
address (LLDB_INVALID_ADDRESS),
@@ -236,6 +238,7 @@
::memset (&header, 0, sizeof(header));
}
module_sp.reset();
+ module_create_stop_id = UINT32_MAX;
uuid.Clear();
segments.clear();
}
Modified: lldb/trunk/source/lldb.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/lldb.cpp?rev=134682&r1=134681&r2=134682&view=diff
==============================================================================
--- lldb/trunk/source/lldb.cpp (original)
+++ lldb/trunk/source/lldb.cpp Thu Jul 7 23:11:42 2011
@@ -38,6 +38,7 @@
#if defined (__APPLE__)
#include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h"
+#include "Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h"
#include "Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h"
#include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.h"
#include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h"
@@ -94,6 +95,7 @@
// Apple/Darwin hosted plugins
//----------------------------------------------------------------------
DynamicLoaderMacOSXDYLD::Initialize();
+ DynamicLoaderMacOSXKernel::Initialize();
SymbolFileDWARFDebugMap::Initialize();
ItaniumABILanguageRuntime::Initialize();
AppleObjCRuntimeV2::Initialize();
@@ -158,6 +160,7 @@
#if defined (__APPLE__)
DynamicLoaderMacOSXDYLD::Terminate();
+ DynamicLoaderMacOSXKernel::Terminate();
SymbolFileDWARFDebugMap::Terminate();
ItaniumABILanguageRuntime::Terminate();
AppleObjCRuntimeV2::Terminate();
More information about the lldb-commits
mailing list