summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
diff options
context:
space:
mode:
authorJason Molenda <jmolenda@apple.com>2012-09-29 04:02:01 +0000
committerJason Molenda <jmolenda@apple.com>2012-09-29 04:02:01 +0000
commit4bd4e7e3ba8315c4180da954f0af40bbcb07f624 (patch)
tree0eb343bc870d4d1efbd900f05316cec7bca61f8d /lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
parent913b8763290ac7d1b83be9e26067d86400b0e5e0 (diff)
downloadbcm5719-llvm-4bd4e7e3ba8315c4180da954f0af40bbcb07f624.tar.gz
bcm5719-llvm-4bd4e7e3ba8315c4180da954f0af40bbcb07f624.zip
Add support for debugging KASLR kernels via kdp (the kernel being
loaded at a random offset). To get the kernel's UUID and load address I need to send a kdp packet so I had to implement the kernel relocation (and attempt to find the kernel if none was provided to lldb already) in ProcessKDP -- but this code really properly belongs in DynamicLoaderDarwinKernel. I also had to add an optional Stream to ConnectRemote so ProcessKDP::DoConnectRemote can print feedback about the remote kernel's UUID, load address, and notify the user if we auto-loaded the kernel via the UUID. <rdar://problem/7714201> llvm-svn: 164881
Diffstat (limited to 'lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp')
-rw-r--r--lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp32
1 files changed, 29 insertions, 3 deletions
diff --git a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
index 5edd3684108..abaf1b4e862 100644
--- a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
+++ b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
@@ -342,7 +342,16 @@ DynamicLoaderDarwinKernel::LoadKernelModuleIfNeeded()
{
m_kernel.Clear(false);
m_kernel.module_sp = m_process->GetTarget().GetExecutableModule();
- strncpy(m_kernel.name, "mach_kernel", sizeof(m_kernel.name));
+
+ ConstString kernel_name("mach_kernel");
+ if (m_kernel.module_sp.get()
+ && m_kernel.module_sp->GetObjectFile()
+ && !m_kernel.module_sp->GetObjectFile()->GetFileSpec().GetFilename().IsEmpty())
+ {
+ kernel_name = m_kernel.module_sp->GetObjectFile()->GetFileSpec().GetFilename();
+ }
+ strlcpy (m_kernel.name, kernel_name.AsCString(), sizeof(m_kernel.name));
+
if (m_kernel.address == LLDB_INVALID_ADDRESS)
{
m_kernel.address = m_process->GetImageInfoAddress ();
@@ -353,7 +362,25 @@ DynamicLoaderDarwinKernel::LoadKernelModuleIfNeeded()
// the file if we have one
ObjectFile *kernel_object_file = m_kernel.module_sp->GetObjectFile();
if (kernel_object_file)
- m_kernel.address = kernel_object_file->GetHeaderAddress().GetFileAddress();
+ {
+ addr_t load_address = kernel_object_file->GetHeaderAddress().GetLoadAddress(&m_process->GetTarget());
+ addr_t file_address = kernel_object_file->GetHeaderAddress().GetFileAddress();
+ if (load_address != LLDB_INVALID_ADDRESS && load_address != 0)
+ {
+ m_kernel.address = load_address;
+ if (load_address != file_address)
+ {
+ // Don't accidentally relocate the kernel to the File address --
+ // the Load address has already been set to its actual in-memory address.
+ // Mark it as IsLoaded.
+ m_kernel.load_process_stop_id = m_process->GetStopID();
+ }
+ }
+ else
+ {
+ m_kernel.address = file_address;
+ }
+ }
}
}
@@ -725,7 +752,6 @@ DynamicLoaderDarwinKernel::PrivateInitialize(Process *process)
DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState()));
Clear(true);
m_process = process;
- m_process->GetTarget().GetSectionLoadList().Clear();
}
void
OpenPOWER on IntegriCloud