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 400e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static lldb_private::ConstString 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 650bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton virtual bool 660bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton ProcessDidExec (); 670bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual lldb::ThreadPlanSP 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetStepThroughTrampolinePlan (lldb_private::Thread &thread, 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_others); 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham virtual size_t 73323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham FindEquivalentSymbols (lldb_private::Symbol *original_symbol, 74323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham lldb_private::ModuleList &module_list, 75323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham lldb_private::SymbolContextList &equivalent_symbols); 76323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham 770baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton virtual lldb_private::Error 780baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton CanLoadImage (); 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // PluginInterface protocol 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 830e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton virtual lldb_private::ConstString 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginName(); 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual uint32_t 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginVersion(); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8984985174d8b0fe4913caf446f7789f1531317650Jason Molenda virtual bool 9084985174d8b0fe4913caf446f7789f1531317650Jason Molenda AlwaysRelyOnEHUnwindInfo (lldb_private::SymbolContext &sym_ctx); 9184985174d8b0fe4913caf446f7789f1531317650Jason Molenda 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrivateInitialize (lldb_private::Process *process); 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrivateProcessStateChanged (lldb_private::Process *process, 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StateType state); 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LocateDYLD (); 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidSetNotificationBreakpoint () const; 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear (bool clear_process); 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutToLog (lldb_private::Log *log) const; 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReadDYLDInfoFromMemoryAndSetNotificationCallback (lldb::addr_t addr); 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static bool 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NotifyBreakpointHit (void *baton, 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::StoppointCallbackContext *context, 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t break_id, 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t break_loc_id); 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 12149ce8969d3154e1560106cfe530444c09410f217Greg Clayton AddrByteSize(); 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static lldb::ByteOrder 12449ce8969d3154e1560106cfe530444c09410f217Greg Clayton GetByteOrderFromMagic (uint32_t magic); 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReadMachHeader (lldb::addr_t addr, 1281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton llvm::MachO::mach_header *header, 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::DataExtractor *load_command_data); 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class Segment 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Segment() : 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name(), 1366e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton vmaddr(LLDB_INVALID_ADDRESS), 1376e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton vmsize(0), 1386e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton fileoff(0), 1396e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton filesize(0), 1406e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton maxprot(0), 1416e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton initprot(0), 1426e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton nsects(0), 1436e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton flags(0) 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::ConstString name; 1486e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton lldb::addr_t vmaddr; 1496e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton lldb::addr_t vmsize; 1506e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton lldb::addr_t fileoff; 1516e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton lldb::addr_t filesize; 1526e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton uint32_t maxprot; 1536e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton uint32_t initprot; 1546e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton uint32_t nsects; 1556e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton uint32_t flags; 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner operator==(const Segment& rhs) const 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1606e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton return name == rhs.name && vmaddr == rhs.vmaddr && vmsize == rhs.vmsize; 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutToLog (lldb_private::Log *log, 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t slide) const; 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct DYLDImageInfo 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 171ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton lldb::addr_t address; // Address of mach header for this dylib 172ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton lldb::addr_t slide; // The amount to slide all segments by if there is a global slide. 173ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton lldb::addr_t mod_date; // Modification date for this dylib 174ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton lldb_private::FileSpec file_spec; // Resolved path for this dylib 175ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton lldb_private::UUID uuid; // UUID for this dylib if it has one, else all zeros 176ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton llvm::MachO::mach_header header; // The mach header for this image 177ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton std::vector<Segment> segments; // All segment vmaddr and vmsize pairs for this executable (from memory of inferior) 1782ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton uint32_t load_stop_id; // The process stop ID that the sections for this image were loadeded 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DYLDImageInfo() : 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner address(LLDB_INVALID_ADDRESS), 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner slide(0), 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mod_date(0), 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec(), 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uuid(), 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner header(), 1872ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton segments(), 1882ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton load_stop_id(0) 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(bool load_cmd_data_only) 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!load_cmd_data_only) 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner address = LLDB_INVALID_ADDRESS; 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner slide = 0; 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mod_date = 0; 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.Clear(); 201ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton ::memset (&header, 0, sizeof(header)); 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uuid.Clear(); 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner segments.clear(); 2052ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton load_stop_id = 0; 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner operator == (const DYLDImageInfo& rhs) const 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return address == rhs.address 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && slide == rhs.slide 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && mod_date == rhs.mod_date 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && file_spec == rhs.file_spec 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && uuid == rhs.uuid 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && memcmp(&header, &rhs.header, sizeof(header)) == 0 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && segments == rhs.segments; 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UUIDValid() const 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return uuid.IsValid(); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton uint32_t 22720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton GetAddressByteSize () 22820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 22920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (header.cputype) 23020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 23120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (header.cputype & llvm::MachO::CPUArchABI64) 23220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton return 8; 23320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton else 23420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton return 4; 23520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 23620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton return 0; 23720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 23820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 23920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton lldb::ByteOrder 24049ce8969d3154e1560106cfe530444c09410f217Greg Clayton GetByteOrder(); 24120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 24224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton lldb_private::ArchSpec 24324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton GetArchitecture () const 24424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 24524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return lldb_private::ArchSpec (lldb_private::eArchTypeMachO, header.cputype, header.cpusubtype); 24624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 24724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Segment * 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FindSegment (const lldb_private::ConstString &name) const; 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutToLog (lldb_private::Log *log) const; 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector<DYLDImageInfo> collection; 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef collection::iterator iterator; 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef collection::const_iterator const_iterator; 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct DYLDAllImageInfos 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t version; 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t dylib_info_count; // Version >= 1 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t dylib_info_addr; // Version >= 1 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t notification; // Version >= 1 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool processDetachedFromSharedRegion; // Version >= 1 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool libSystemInitialized; // Version >= 2 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t dyldImageLoadAddress; // Version >= 2 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DYLDAllImageInfos() : 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner version (0), 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dylib_info_count (0), 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dylib_info_addr (LLDB_INVALID_ADDRESS), 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner notification (LLDB_INVALID_ADDRESS), 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner processDetachedFromSharedRegion (false), 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner libSystemInitialized (false), 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dyldImageLoadAddress (LLDB_INVALID_ADDRESS) 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear() 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner version = 0; 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dylib_info_count = 0; 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dylib_info_addr = LLDB_INVALID_ADDRESS; 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner notification = LLDB_INVALID_ADDRESS; 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner processDetachedFromSharedRegion = false; 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner libSystemInitialized = false; 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dyldImageLoadAddress = LLDB_INVALID_ADDRESS; 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IsValid() const 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return version >= 1 || version <= 6; 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterNotificationCallbacks(); 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UnregisterNotificationCallbacks(); 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ParseLoadCommands (const lldb_private::DataExtractor& data, 30724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton DYLDImageInfo& dylib_info, 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::FileSpec *lc_id_dylinker); 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UpdateImageLoadAddress(lldb_private::Module *module, 31224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton DYLDImageInfo& info); 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UnloadImageLoadAddress (lldb_private::Module *module, 31624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton DYLDImageInfo& info); 31724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 31824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton lldb::ModuleSP 3192ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton FindTargetModuleForDYLDImageInfo (DYLDImageInfo &image_info, 32024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton bool can_create, 32124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton bool *did_create_ptr); 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 323ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton DYLDImageInfo * 32424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton GetImageInfo (lldb_private::Module *module); 325ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NeedToLocateDYLD () const; 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetNotificationBreakpoint (); 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 332e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham // There is a little tricky bit where you might initially attach while dyld is updating 333e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham // the all_image_infos, and you can't read the infos, so you have to continue and pick it 334e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham // up when you hit the update breakpoint. At that point, you need to run this initialize 335e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham // function, but when you do it that way you DON'T need to do the extra work you would at 336e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham // the breakpoint. 337e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham // So this function will only do actual work if the image infos haven't been read yet. 338e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham // If it does do any work, then it will return true, and false otherwise. That way you can 339e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham // call it in the breakpoint action, and if it returns true you're done. 340e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham bool 341e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham InitializeFromAllImageInfos (); 342e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReadAllImageInfosStructure (); 345e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham 346e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham bool 347e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham AddModulesUsingImageInfosAddress (lldb::addr_t image_infos_addr, uint32_t image_infos_count); 348e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham 349e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham bool 350e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham AddModulesUsingImageInfos (DYLDImageInfo::collection &image_infos); 351e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham 352e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham bool 353e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham RemoveModulesUsingImageInfosAddress (lldb::addr_t image_infos_addr, uint32_t image_infos_count); 354e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham 355e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham void 356e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham UpdateImageInfosHeaderAndLoadCommands(DYLDImageInfo::collection &image_infos, 357e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham uint32_t infos_count, 358e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham bool update_executable); 359e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham 360e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham bool 361e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham ReadImageInfos (lldb::addr_t image_infos_addr, 362e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham uint32_t image_infos_count, 363e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham DYLDImageInfo::collection &image_infos); 364e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3665d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton DYLDImageInfo m_dyld; // Info about the current dyld being used 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t m_dyld_all_image_infos_addr; 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DYLDAllImageInfos m_dyld_all_image_infos; 36920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton uint32_t m_dyld_all_image_infos_stop_id; 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t m_break_id; 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DYLDImageInfo::collection m_dyld_image_infos; // Current shared libraries information 37220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton uint32_t m_dyld_image_infos_stop_id; // The process stop ID that "m_dyld_image_infos" is valid for 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mutable lldb_private::Mutex m_mutex; 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::Process::Notifications m_notification_callbacks; 3750bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton bool m_process_image_addr_is_all_images_infos; 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DISALLOW_COPY_AND_ASSIGN (DynamicLoaderMacOSXDYLD); 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // liblldb_DynamicLoaderMacOSXDYLD_h_ 382