1 //===-- ObjectFileMachO.h ---------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef liblldb_ObjectFileMachO_h_ 11 #define liblldb_ObjectFileMachO_h_ 12 13 #include "llvm/Support/MachO.h" 14 15 #include "lldb/Core/Address.h" 16 #include "lldb/Core/RangeMap.h" 17 #include "lldb/Host/FileSpec.h" 18 #include "lldb/Host/Mutex.h" 19 #include "lldb/Symbol/ObjectFile.h" 20 21 //---------------------------------------------------------------------- 22 // This class needs to be hidden as eventually belongs in a plugin that 23 // will export the ObjectFile protocol 24 //---------------------------------------------------------------------- 25 class ObjectFileMachO : 26 public lldb_private::ObjectFile 27 { 28 public: 29 //------------------------------------------------------------------ 30 // Static Functions 31 //------------------------------------------------------------------ 32 static void 33 Initialize(); 34 35 static void 36 Terminate(); 37 38 static lldb_private::ConstString 39 GetPluginNameStatic(); 40 41 static const char * 42 GetPluginDescriptionStatic(); 43 44 static lldb_private::ObjectFile * 45 CreateInstance (const lldb::ModuleSP &module_sp, 46 lldb::DataBufferSP& data_sp, 47 lldb::offset_t data_offset, 48 const lldb_private::FileSpec* file, 49 lldb::offset_t file_offset, 50 lldb::offset_t length); 51 52 static lldb_private::ObjectFile * 53 CreateMemoryInstance (const lldb::ModuleSP &module_sp, 54 lldb::DataBufferSP& data_sp, 55 const lldb::ProcessSP &process_sp, 56 lldb::addr_t header_addr); 57 58 static size_t 59 GetModuleSpecifications (const lldb_private::FileSpec& file, 60 lldb::DataBufferSP& data_sp, 61 lldb::offset_t data_offset, 62 lldb::offset_t file_offset, 63 lldb::offset_t length, 64 lldb_private::ModuleSpecList &specs); 65 66 static bool 67 MagicBytesMatch (lldb::DataBufferSP& data_sp, 68 lldb::addr_t offset, 69 lldb::addr_t length); 70 71 //------------------------------------------------------------------ 72 // Member Functions 73 //------------------------------------------------------------------ 74 ObjectFileMachO (const lldb::ModuleSP &module_sp, 75 lldb::DataBufferSP& data_sp, 76 lldb::offset_t data_offset, 77 const lldb_private::FileSpec* file, 78 lldb::offset_t offset, 79 lldb::offset_t length); 80 81 ObjectFileMachO (const lldb::ModuleSP &module_sp, 82 lldb::DataBufferSP& data_sp, 83 const lldb::ProcessSP &process_sp, 84 lldb::addr_t header_addr); 85 86 virtual 87 ~ObjectFileMachO(); 88 89 virtual bool 90 ParseHeader (); 91 92 virtual bool 93 SetLoadAddress(lldb_private::Target &target, 94 lldb::addr_t value, 95 bool value_is_offset); 96 97 virtual lldb::ByteOrder 98 GetByteOrder () const; 99 100 virtual bool 101 IsExecutable () const; 102 103 virtual uint32_t 104 GetAddressByteSize () const; 105 106 virtual lldb::AddressClass 107 GetAddressClass (lldb::addr_t file_addr); 108 109 virtual lldb_private::Symtab * 110 GetSymtab(); 111 112 virtual bool 113 IsStripped (); 114 115 virtual void 116 CreateSections (lldb_private::SectionList &unified_section_list); 117 118 virtual void 119 Dump (lldb_private::Stream *s); 120 121 virtual bool 122 GetArchitecture (lldb_private::ArchSpec &arch); 123 124 virtual bool 125 GetUUID (lldb_private::UUID* uuid); 126 127 virtual uint32_t 128 GetDependentModules (lldb_private::FileSpecList& files); 129 130 //------------------------------------------------------------------ 131 // PluginInterface protocol 132 //------------------------------------------------------------------ 133 virtual lldb_private::ConstString 134 GetPluginName(); 135 136 virtual uint32_t 137 GetPluginVersion(); 138 139 virtual lldb_private::Address 140 GetEntryPointAddress (); 141 142 virtual lldb_private::Address 143 GetHeaderAddress (); 144 145 virtual uint32_t 146 GetNumThreadContexts (); 147 148 virtual lldb::RegisterContextSP 149 GetThreadContextAtIndex (uint32_t idx, lldb_private::Thread &thread); 150 151 virtual ObjectFile::Type 152 CalculateType(); 153 154 virtual ObjectFile::Strata 155 CalculateStrata(); 156 157 virtual uint32_t 158 GetVersion (uint32_t *versions, uint32_t num_versions); 159 160 virtual uint32_t 161 GetMinimumOSVersion (uint32_t *versions, uint32_t num_versions); 162 163 virtual uint32_t 164 GetSDKVersion (uint32_t *versions, uint32_t num_versions); 165 166 static bool 167 ParseHeader (lldb_private::DataExtractor &data, 168 lldb::offset_t *data_offset_ptr, 169 llvm::MachO::mach_header &header); 170 171 protected: 172 173 static bool 174 GetUUID (const llvm::MachO::mach_header &header, 175 const lldb_private::DataExtractor &data, 176 lldb::offset_t lc_offset, // Offset to the first load command 177 lldb_private::UUID& uuid); 178 179 // Intended for same-host arm device debugging where lldb needs to 180 // detect libraries in the shared cache and augment the nlist entries 181 // with an on-disk dyld_shared_cache file. The process will record 182 // the shared cache UUID so the on-disk cache can be matched or rejected 183 // correctly. 184 lldb_private::UUID 185 GetProcessSharedCacheUUID (lldb_private::Process *); 186 187 // Intended for same-host arm device debugging where lldb will read 188 // shared cache libraries out of its own memory instead of the remote 189 // process' memory as an optimization. If lldb's shared cache UUID 190 // does not match the process' shared cache UUID, this optimization 191 // should not be used. 192 lldb_private::UUID 193 GetLLDBSharedCacheUUID (); 194 195 llvm::MachO::mach_header m_header; 196 static const lldb_private::ConstString &GetSegmentNameTEXT(); 197 static const lldb_private::ConstString &GetSegmentNameDATA(); 198 static const lldb_private::ConstString &GetSegmentNameOBJC(); 199 static const lldb_private::ConstString &GetSegmentNameLINKEDIT(); 200 static const lldb_private::ConstString &GetSectionNameEHFrame(); 201 202 llvm::MachO::dysymtab_command m_dysymtab; 203 std::vector<llvm::MachO::segment_command_64> m_mach_segments; 204 std::vector<llvm::MachO::section_64> m_mach_sections; 205 std::vector<uint32_t> m_min_os_versions; 206 std::vector<uint32_t> m_sdk_versions; 207 typedef lldb_private::RangeVector<uint32_t, uint32_t> FileRangeArray; 208 lldb_private::Address m_entry_point_address; 209 FileRangeArray m_thread_context_offsets; 210 bool m_thread_context_offsets_valid; 211 212 size_t 213 ParseSymtab (); 214 215 }; 216 217 #endif // liblldb_ObjectFileMachO_h_ 218