From 4bd4e7e3ba8315c4180da954f0af40bbcb07f624 Mon Sep 17 00:00:00 2001 From: Jason Molenda Date: Sat, 29 Sep 2012 04:02:01 +0000 Subject: 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. llvm-svn: 164881 --- .../Darwin-Kernel/DynamicLoaderDarwinKernel.cpp | 32 ++++++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp') 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 -- cgit v1.2.3