DynamicLoaderMacOSXDYLD.h revision 24bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DynamicLoaderMacOSXDYLD.h -------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_DynamicLoaderMacOSXDYLD_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_DynamicLoaderMacOSXDYLD_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map> 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector> 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string> 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "llvm/Support/MachO.h" 211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/DynamicLoader.h" 235f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UUID.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Mutex.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DynamicLoaderMacOSXDYLD : public lldb_private::DynamicLoader 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Static Functions 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static void 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Initialize(); 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static void 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Terminate(); 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static const char * 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginNameStatic(); 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static const char * 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginDescriptionStatic(); 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static lldb_private::DynamicLoader * 4775c703dd8b492bad25a987b96853626641ae7246Greg Clayton CreateInstance (lldb_private::Process *process, bool force); 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DynamicLoaderMacOSXDYLD (lldb_private::Process *process); 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~DynamicLoaderMacOSXDYLD (); 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Called after attaching a process. 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Allow DynamicLoader plug-ins to execute some code after 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// attaching to a process. 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidAttach (); 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidLaunch (); 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual lldb::ThreadPlanSP 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetStepThroughTrampolinePlan (lldb_private::Thread &thread, 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_others); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton virtual lldb_private::Error 700baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton CanLoadImage (); 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // PluginInterface protocol 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual const char * 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginName(); 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual const char * 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetShortPluginName(); 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual uint32_t 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginVersion(); 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrivateInitialize (lldb_private::Process *process); 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrivateProcessStateChanged (lldb_private::Process *process, 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StateType state); 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LocateDYLD (); 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidSetNotificationBreakpoint () const; 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear (bool clear_process); 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutToLog (lldb_private::Log *log) const; 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReadDYLDInfoFromMemoryAndSetNotificationCallback (lldb::addr_t addr); 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UpdateAllImageInfos (); 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static bool 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NotifyBreakpointHit (void *baton, 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::StoppointCallbackContext *context, 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t break_id, 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t break_loc_id); 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UpdateAllImageInfosHeaderAndLoadCommands (); 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UpdateCommPageLoadAddress (lldb_private::Module *module); 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner AddrByteSize() 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_dyld.header.magic) 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case llvm::MachO::HeaderMagic32: 1261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case llvm::MachO::HeaderMagic32Swapped: 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 4; 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case llvm::MachO::HeaderMagic64: 1301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case llvm::MachO::HeaderMagic64Swapped: 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 8; 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static lldb::ByteOrder 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetByteOrderFromMagic (uint32_t magic) 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (magic) 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case llvm::MachO::HeaderMagic32: 1451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case llvm::MachO::HeaderMagic64: 146cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton return lldb::endian::InlHostByteOrder(); 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case llvm::MachO::HeaderMagic32Swapped: 1491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case llvm::MachO::HeaderMagic64Swapped: 150cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig) 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return lldb::eByteOrderLittle; 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return lldb::eByteOrderBig; 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return lldb::eByteOrderInvalid; 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReadMachHeader (lldb::addr_t addr, 1631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton llvm::MachO::mach_header *header, 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::DataExtractor *load_command_data); 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class Segment 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Segment() : 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name(), 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr(LLDB_INVALID_ADDRESS), 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size(0) 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::ConstString name; 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t addr; 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t size; 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner operator==(const Segment& rhs) const 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return name == rhs.name && addr == rhs.addr && size == rhs.size; 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutToLog (lldb_private::Log *log, 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t slide) const; 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct DYLDImageInfo 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 194ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton lldb::addr_t address; // Address of mach header for this dylib 195ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton lldb::addr_t slide; // The amount to slide all segments by if there is a global slide. 196ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton lldb::addr_t mod_date; // Modification date for this dylib 197ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton lldb_private::FileSpec file_spec; // Resolved path for this dylib 198ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton lldb_private::UUID uuid; // UUID for this dylib if it has one, else all zeros 199ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton llvm::MachO::mach_header header; // The mach header for this image 200ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton std::vector<Segment> segments; // All segment vmaddr and vmsize pairs for this executable (from memory of inferior) 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DYLDImageInfo() : 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner address(LLDB_INVALID_ADDRESS), 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner slide(0), 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mod_date(0), 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec(), 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uuid(), 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner header(), 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner segments() 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(bool load_cmd_data_only) 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!load_cmd_data_only) 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner address = LLDB_INVALID_ADDRESS; 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner slide = 0; 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mod_date = 0; 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.Clear(); 222ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton ::memset (&header, 0, sizeof(header)); 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uuid.Clear(); 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner segments.clear(); 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner operator == (const DYLDImageInfo& rhs) const 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return address == rhs.address 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && slide == rhs.slide 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && mod_date == rhs.mod_date 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && file_spec == rhs.file_spec 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && uuid == rhs.uuid 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && memcmp(&header, &rhs.header, sizeof(header)) == 0 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && segments == rhs.segments; 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UUIDValid() const 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return uuid.IsValid(); 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton uint32_t 24720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton GetAddressByteSize () 24820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 24920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (header.cputype) 25020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 25120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (header.cputype & llvm::MachO::CPUArchABI64) 25220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton return 8; 25320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton else 25420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton return 4; 25520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 25620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton return 0; 25720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 25820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 25920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton lldb::ByteOrder 26020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton GetByteOrder() 26120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 26220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton switch (header.magic) 26320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 26420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton case llvm::MachO::HeaderMagic32: // MH_MAGIC 26520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton case llvm::MachO::HeaderMagic64: // MH_MAGIC_64 266cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton return lldb::endian::InlHostByteOrder(); 26720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 26820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton case llvm::MachO::HeaderMagic32Swapped: // MH_CIGAM 26920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton case llvm::MachO::HeaderMagic64Swapped: // MH_CIGAM_64 270cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderLittle) 27120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton return lldb::eByteOrderBig; 27220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton else 27320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton return lldb::eByteOrderLittle; 27420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton default: 27520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton assert (!"invalid header.magic value"); 27620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton break; 27720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 278cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton return lldb::endian::InlHostByteOrder(); 27920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 28020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 28124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton lldb_private::ArchSpec 28224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton GetArchitecture () const 28324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 28424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return lldb_private::ArchSpec (lldb_private::eArchTypeMachO, header.cputype, header.cpusubtype); 28524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 28624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Segment * 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FindSegment (const lldb_private::ConstString &name) const; 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutToLog (lldb_private::Log *log) const; 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector<DYLDImageInfo> collection; 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef collection::iterator iterator; 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef collection::const_iterator const_iterator; 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct DYLDAllImageInfos 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t version; 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t dylib_info_count; // Version >= 1 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t dylib_info_addr; // Version >= 1 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t notification; // Version >= 1 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool processDetachedFromSharedRegion; // Version >= 1 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool libSystemInitialized; // Version >= 2 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t dyldImageLoadAddress; // Version >= 2 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DYLDAllImageInfos() : 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner version (0), 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dylib_info_count (0), 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dylib_info_addr (LLDB_INVALID_ADDRESS), 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner notification (LLDB_INVALID_ADDRESS), 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner processDetachedFromSharedRegion (false), 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner libSystemInitialized (false), 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dyldImageLoadAddress (LLDB_INVALID_ADDRESS) 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear() 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner version = 0; 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dylib_info_count = 0; 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dylib_info_addr = LLDB_INVALID_ADDRESS; 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner notification = LLDB_INVALID_ADDRESS; 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner processDetachedFromSharedRegion = false; 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner libSystemInitialized = false; 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dyldImageLoadAddress = LLDB_INVALID_ADDRESS; 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IsValid() const 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return version >= 1 || version <= 6; 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterNotificationCallbacks(); 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UnregisterNotificationCallbacks(); 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ParseLoadCommands (const lldb_private::DataExtractor& data, 34624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton DYLDImageInfo& dylib_info, 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::FileSpec *lc_id_dylinker); 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UpdateImageLoadAddress(lldb_private::Module *module, 35124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton DYLDImageInfo& info); 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UnloadImageLoadAddress (lldb_private::Module *module, 35524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton DYLDImageInfo& info); 35624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 35724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton lldb::ModuleSP 35824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton FindTargetModuleForDYLDImageInfo (const DYLDImageInfo &image_info, 35924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton bool can_create, 36024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton bool *did_create_ptr); 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 362ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton DYLDImageInfo * 36324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton GetImageInfo (lldb_private::Module *module); 364ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NeedToLocateDYLD () const; 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetNotificationBreakpoint (); 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReadAllImageInfosStructure (); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3745d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton DYLDImageInfo m_dyld; // Info about the current dyld being used 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t m_dyld_all_image_infos_addr; 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DYLDAllImageInfos m_dyld_all_image_infos; 37720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton uint32_t m_dyld_all_image_infos_stop_id; 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t m_break_id; 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DYLDImageInfo::collection m_dyld_image_infos; // Current shared libraries information 38020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton uint32_t m_dyld_image_infos_stop_id; // The process stop ID that "m_dyld_image_infos" is valid for 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mutable lldb_private::Mutex m_mutex; 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::Process::Notifications m_notification_callbacks; 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DISALLOW_COPY_AND_ASSIGN (DynamicLoaderMacOSXDYLD); 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // liblldb_DynamicLoaderMacOSXDYLD_h_ 389