ProcessMachCore.cpp revision 94a5d0de4433dce556db59758f3d6124eb0e1a2a
146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//===-- ProcessMachCore.cpp ------------------------------------------*- C++ -*-===// 246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// 346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// The LLVM Compiler Infrastructure 446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// 546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// This file is distributed under the University of Illinois Open Source 646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// License. See LICENSE.TXT for details. 746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// 846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//===----------------------------------------------------------------------===// 946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 1046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// C Includes 1146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include <errno.h> 1246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include <stdlib.h> 1346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 1446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// C++ Includes 1546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "llvm/Support/MachO.h" 169ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "llvm/Support/MathExtras.h" 1746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 1846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Other libraries and framework includes 1946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Core/Debugger.h" 2046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Core/PluginManager.h" 2149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 2349ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h" 2446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Core/State.h" 2546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Host/Host.h" 2649ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/ObjectFile.h" 2746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Target/Target.h" 2846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Target/Thread.h" 2946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 3046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Project includes 3146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "ProcessMachCore.h" 3246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "ThreadMachCore.h" 3346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "StopInfoMachException.h" 3446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h" 369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h" 379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 3846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonusing namespace lldb; 3946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonusing namespace lldb_private; 4046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 4146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char * 4246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginNameStatic() 4346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 4446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return "mach-o-core"; 4546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 4646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 4746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char * 4846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginDescriptionStatic() 4946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 5046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return "Mach-O core file debugging plug-in."; 5146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 5246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 5346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid 5446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Terminate() 5546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 5646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton PluginManager::UnregisterPlugin (ProcessMachCore::CreateInstance); 5746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 5846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 5946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 6046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonlldb::ProcessSP 6146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::CreateInstance (Target &target, Listener &listener, const FileSpec *crash_file) 6246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 6346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton lldb::ProcessSP process_sp; 6446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (crash_file) 6546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton process_sp.reset(new ProcessMachCore (target, listener, *crash_file)); 6646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return process_sp; 6746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 6846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 6946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonbool 7046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::CanDebug(Target &target, bool plugin_specified_by_name) 7146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 7246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (plugin_specified_by_name) 7346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return true; 7446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 7546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // For now we are just making sure the file exists for a given module 7646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (!m_core_module_sp && m_core_file.Exists()) 7746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 78444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec core_module_spec(m_core_file, target.GetArchitecture()); 79444fe998bf707bd076a70c3a779db8575533695eGreg Clayton Error error (ModuleList::GetSharedModule (core_module_spec, 809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_core_module_sp, 819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton NULL, 829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton NULL, 839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton NULL)); 8446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 8546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (m_core_module_sp) 8646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 8746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const llvm::Triple &triple_ref = m_core_module_sp->GetArchitecture().GetTriple(); 88b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (triple_ref.getVendor() == llvm::Triple::Apple) 8946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 9046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ObjectFile *core_objfile = m_core_module_sp->GetObjectFile(); 9146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (core_objfile && core_objfile->GetType() == ObjectFile::eTypeCoreFile) 9246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return true; 9346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 9446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 9546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 9646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return false; 9746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 9846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 9946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 10046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// ProcessMachCore constructor 10146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 10246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::ProcessMachCore(Target& target, Listener &listener, const FileSpec &core_file) : 10346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Process (target, listener), 10446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_core_aranges (), 10546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_core_module_sp (), 10646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_core_file (core_file), 1079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_addr (LLDB_INVALID_ADDRESS), 1089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_plugin_name () 10946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 11046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 11146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 11246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 11346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Destructor 11446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 11546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::~ProcessMachCore() 11646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 11746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Clear(); 11846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // We need to call finalize on the process before destroying ourselves 11946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // to make sure all of the broadcaster cleanup goes as planned. If we 12046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // destruct this class, then Process::~Process() might have problems 12146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // trying to fully destroy the broadcaster. 12246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Finalize(); 12346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 12446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 12546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 12646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// PluginInterface 12746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 12846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char * 12946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginName() 13046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 13146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return "Process debugging plug-in that loads mach-o core files."; 13246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 13346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 13446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char * 13546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetShortPluginName() 13646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 13746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return GetPluginNameStatic(); 13846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 13946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 14046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonuint32_t 14146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginVersion() 14246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 14346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return 1; 14446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 14546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 1469ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonbool 1479ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::GetDynamicLoaderAddress (lldb::addr_t addr) 1489ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 1499ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton llvm::MachO::mach_header header; 1509ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton Error error; 1519ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (DoReadMemory (addr, &header, sizeof(header), error) != sizeof(header)) 1529ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return false; 1539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (header.magic == llvm::MachO::HeaderMagic32Swapped || 1549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.magic == llvm::MachO::HeaderMagic64Swapped) 1559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 1569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.magic = llvm::ByteSwap_32(header.magic); 1579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.cputype = llvm::ByteSwap_32(header.cputype); 1589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.cpusubtype = llvm::ByteSwap_32(header.cpusubtype); 1599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.filetype = llvm::ByteSwap_32(header.filetype); 1609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.ncmds = llvm::ByteSwap_32(header.ncmds); 1619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.sizeofcmds = llvm::ByteSwap_32(header.sizeofcmds); 1629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.flags = llvm::ByteSwap_32(header.flags); 1639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 1649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 1659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // TODO: swap header if needed... 1669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton //printf("0x%16.16llx: magic = 0x%8.8x, file_type= %u\n", vaddr, header.magic, header.filetype); 1679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (header.magic == llvm::MachO::HeaderMagic32 || 1689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.magic == llvm::MachO::HeaderMagic64) 1699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 1709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Check MH_EXECUTABLE to see if we can find the mach image 1719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // that contains the shared library list. The dynamic loader 1729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // (dyld) is what contains the list for user applications, 1739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // and the mach kernel contains a global that has the list 1749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // of kexts to load 1759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton switch (header.filetype) 1769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 1779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton case llvm::MachO::HeaderFileTypeDynamicLinkEditor: 1789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton //printf("0x%16.16llx: file_type = MH_DYLINKER\n", vaddr); 1799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Address of dyld "struct mach_header" in the core file 1809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_plugin_name = DynamicLoaderMacOSXDYLD::GetPluginNameStatic(); 1819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_addr = addr; 1829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return true; 1839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 1849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton case llvm::MachO::HeaderFileTypeExecutable: 1859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton //printf("0x%16.16llx: file_type = MH_EXECUTE\n", vaddr); 1869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Check MH_EXECUTABLE file types to see if the dynamic link object flag 1879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // is NOT set. If it isn't, then we have a mach_kernel. 1889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if ((header.flags & llvm::MachO::HeaderFlagBitIsDynamicLinkObject) == 0) 1899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 1909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_plugin_name = DynamicLoaderDarwinKernel::GetPluginNameStatic(); 1919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Address of the mach kernel "struct mach_header" in the core file. 1929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_addr = addr; 1939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return true; 1949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 1959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton break; 1969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 1979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 1989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return false; 1999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 2009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 20146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 20246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Control 20346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 20446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonError 20546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoLoadCore () 20646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 20746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Error error; 2089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!m_core_module_sp) 2099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton error.SetErrorString ("invalid core module"); 2119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return error; 2129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 21446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ObjectFile *core_objfile = m_core_module_sp->GetObjectFile(); 21546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (core_objfile == NULL) 21646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 21746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton error.SetErrorString ("invalid core object file"); 21846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return error; 21946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 22046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton SectionList *section_list = core_objfile->GetSectionList(); 22146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (section_list == NULL) 22246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 22346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton error.SetErrorString ("core file has no sections"); 22446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return error; 22546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 22646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 22746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const uint32_t num_sections = section_list->GetNumSections(0); 22846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (num_sections == 0) 22946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 23046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton error.SetErrorString ("core file has no sections"); 23146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return error; 23246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 2339ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 234d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda SetCanJIT(false); 235d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda 2369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton llvm::MachO::mach_header header; 2379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton DataExtractor data (&header, 2389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton sizeof(header), 2399ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_core_module_sp->GetArchitecture().GetByteOrder(), 2409ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_core_module_sp->GetArchitecture().GetAddressByteSize()); 2419ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 24246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton bool ranges_are_sorted = true; 24346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton addr_t vm_addr = 0; 24446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton for (uint32_t i=0; i<num_sections; ++i) 24546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 24646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Section *section = section_list->GetSectionAtIndex (i).get(); 24746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (section) 24846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 24946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton lldb::addr_t section_vm_addr = section->GetFileAddress(); 25046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton FileRange file_range (section->GetFileOffset(), section->GetFileSize()); 25146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton VMRangeToFileOffset::Entry range_entry (section_vm_addr, 25246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton section->GetByteSize(), 25346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton file_range); 25446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 25546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (vm_addr > section_vm_addr) 25646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ranges_are_sorted = false; 25746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton vm_addr = section->GetFileAddress(); 25846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton VMRangeToFileOffset::Entry *last_entry = m_core_aranges.Back(); 2599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// printf ("LC_SEGMENT[%u] arange=[0x%16.16llx - 0x%16.16llx), frange=[0x%8.8x - 0x%8.8x)\n", 2609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// i, 2619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// range_entry.GetRangeBase(), 2629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// range_entry.GetRangeEnd(), 2639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// range_entry.data.GetRangeBase(), 2649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// range_entry.data.GetRangeEnd()); 2659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 26646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (last_entry && 26746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton last_entry->GetRangeEnd() == range_entry.GetRangeBase() && 26846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton last_entry->data.GetRangeEnd() == range_entry.data.GetRangeBase()) 26946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 27046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton last_entry->SetRangeEnd (range_entry.GetRangeEnd()); 27146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton last_entry->data.SetRangeEnd (range_entry.data.GetRangeEnd()); 2729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton //puts("combine"); 27346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 27446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton else 27546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 27646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_core_aranges.Append(range_entry); 27746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 2789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // After we have added this section to our m_core_aranges map, 2809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // we can check the start of the section to see if it might 2819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // contain dyld for user space apps, or the mach kernel file 2829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // for kernel cores. 2839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_dyld_addr == LLDB_INVALID_ADDRESS) 2849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton GetDynamicLoaderAddress (section_vm_addr); 28546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 28646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 28746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (!ranges_are_sorted) 28846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 28946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_core_aranges.Sort(); 29046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 2919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Even if the architecture is set in the target, we need to override 2939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // it to match the core file which is always single arch. 2949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ArchSpec arch (m_core_module_sp->GetArchitecture()); 2959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (arch.GetCore() == ArchSpec::eCore_x86_32_i486) 2969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton arch.SetTriple ("i386", m_target.GetPlatform().get()); 2989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (arch.IsValid()) 3009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_target.SetArchitecture(arch); 3019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 3029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_dyld_addr == LLDB_INVALID_ADDRESS) 3039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Check the magic kernel address for the mach image header address in case 3059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // it is there. 3069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (arch.GetAddressByteSize() == 8) 3079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton Error header_addr_error; 3099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton addr_t header_addr = ReadPointerFromMemory (0xffffff8000002010ull, header_addr_error); 3109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (header_addr != LLDB_INVALID_ADDRESS) 3119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton GetDynamicLoaderAddress (header_addr); 3129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 3134952db8c76f619e3d8a0cf13456097128009d67bJason Molenda else 3144952db8c76f619e3d8a0cf13456097128009d67bJason Molenda { 3154952db8c76f619e3d8a0cf13456097128009d67bJason Molenda Error header_addr_error; 3164952db8c76f619e3d8a0cf13456097128009d67bJason Molenda addr_t header_addr = ReadPointerFromMemory (0xffff0110, header_addr_error); 3174952db8c76f619e3d8a0cf13456097128009d67bJason Molenda if (header_addr != LLDB_INVALID_ADDRESS) 3184952db8c76f619e3d8a0cf13456097128009d67bJason Molenda GetDynamicLoaderAddress (header_addr); 3194952db8c76f619e3d8a0cf13456097128009d67bJason Molenda } 3209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 32146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 32246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return error; 32346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 32446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 3259ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonlldb_private::DynamicLoader * 3269ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::GetDynamicLoader () 3279ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 3289ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_dyld_ap.get() == NULL) 3299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_ap.reset (DynamicLoader::FindPlugin(this, m_dyld_plugin_name.empty() ? NULL : m_dyld_plugin_name.c_str())); 3309ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return m_dyld_ap.get(); 3319ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 33246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 333ae932359b80098532f3c3766fa9e6527352fbb67Greg Claytonbool 33446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list) 33546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 33646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (old_thread_list.GetSize(false) == 0) 33746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 33846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // Make up the thread the first time this is called so we can setup our one and only 33946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // core thread state. 34046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ObjectFile *core_objfile = m_core_module_sp->GetObjectFile(); 34146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 34246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (core_objfile) 34346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 34446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const uint32_t num_threads = core_objfile->GetNumThreadContexts (); 34546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton for (lldb::tid_t tid = 0; tid < num_threads; ++tid) 34646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 34794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham ThreadSP thread_sp(new ThreadMachCore (*this, tid)); 34846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton new_thread_list.AddThread (thread_sp); 34946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 35046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 35146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 35246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton else 35346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 35446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const uint32_t num_threads = old_thread_list.GetSize(false); 35546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton for (uint32_t i=0; i<num_threads; ++i) 35646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton new_thread_list.AddThread (old_thread_list.GetThreadAtIndex (i)); 35746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 358ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton return new_thread_list.GetSize(false) > 0; 35946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 36046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 36146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid 36246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::RefreshStateAfterStop () 36346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 36446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // Let all threads recover from stopping and do any clean up based 36546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // on the previous thread state (if any). 36646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_thread_list.RefreshStateAfterStop(); 36746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton //SetThreadStopInfo (m_last_stop_packet); 36846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 36946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 37046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonError 37146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoDestroy () 37246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 37346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return Error(); 37446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 37546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 37646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------ 37746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Queries 37846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------ 37946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 38046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonbool 38146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::IsAlive () 38246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 38346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return true; 38446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 38546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 38646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------ 38746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Memory 38846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------ 38946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonsize_t 3909ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 3919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 3929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Don't allow the caching that lldb_private::Process::ReadMemory does 3939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // since in core files we have it all cached our our core file anyway. 3949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return DoReadMemory (addr, buf, size, error); 3959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 3969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 3979ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonsize_t 39846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error) 39946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 40046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ObjectFile *core_objfile = m_core_module_sp->GetObjectFile(); 40146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 40246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (core_objfile) 40346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 40446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const VMRangeToFileOffset::Entry *core_memory_entry = m_core_aranges.FindEntryThatContains (addr); 40546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (core_memory_entry) 40646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 40746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const addr_t offset = addr - core_memory_entry->GetRangeBase(); 40846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const addr_t bytes_left = core_memory_entry->GetRangeEnd() - addr; 40946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton size_t bytes_to_read = size; 41046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (bytes_to_read > bytes_left) 41146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton bytes_to_read = bytes_left; 41246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return core_objfile->CopyData (core_memory_entry->data.GetRangeBase() + offset, bytes_to_read, buf); 41346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 41446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton else 41546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 41646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton error.SetErrorStringWithFormat ("core file does not contain 0x%llx", addr); 41746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 41846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 41946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return 0; 42046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 42146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 42246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid 42346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Clear() 42446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 42546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_thread_list.Clear(); 42646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 42746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 42846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid 42946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Initialize() 43046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 43146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton static bool g_initialized = false; 43246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 43346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (g_initialized == false) 43446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 43546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton g_initialized = true; 43646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 43746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton GetPluginDescriptionStatic(), 43846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton CreateInstance); 43946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 44046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 44146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 44246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonaddr_t 44346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetImageInfoAddress() 44446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 4459ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return m_dyld_addr; 44646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 44746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 44846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 44949ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb_private::ObjectFile * 45049ce8969d3154e1560106cfe530444c09410f217Greg ClaytonProcessMachCore::GetCoreObjectFile () 45149ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 45249ce8969d3154e1560106cfe530444c09410f217Greg Clayton return m_core_module_sp->GetObjectFile(); 45349ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 454