LLDB  mainline
ObjectFileMachO.h
Go to the documentation of this file.
1 //===-- ObjectFileMachO.h ---------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_MACH_O_OBJECTFILEMACHO_H
10 #define LLDB_SOURCE_PLUGINS_OBJECTFILE_MACH_O_OBJECTFILEMACHO_H
11 
12 #include "lldb/Core/Address.h"
13 #include "lldb/Core/FileSpecList.h"
14 #include "lldb/Host/SafeMachO.h"
15 #include "lldb/Symbol/ObjectFile.h"
16 #include "lldb/Utility/FileSpec.h"
17 #include "lldb/Utility/RangeMap.h"
18 #include "lldb/Utility/UUID.h"
19 
20 // This class needs to be hidden as eventually belongs in a plugin that
21 // will export the ObjectFile protocol
23 public:
24  ObjectFileMachO(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp,
25  lldb::offset_t data_offset,
26  const lldb_private::FileSpec *file, lldb::offset_t offset,
27  lldb::offset_t length);
28 
29  ObjectFileMachO(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp,
30  const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
31 
32  ~ObjectFileMachO() override = default;
33 
34  // Static Functions
35  static void Initialize();
36 
37  static void Terminate();
38 
40 
41  static const char *GetPluginDescriptionStatic();
42 
44  CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp,
45  lldb::offset_t data_offset, const lldb_private::FileSpec *file,
46  lldb::offset_t file_offset, lldb::offset_t length);
47 
49  const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp,
50  const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
51 
52  static size_t GetModuleSpecifications(const lldb_private::FileSpec &file,
53  lldb::DataBufferSP &data_sp,
54  lldb::offset_t data_offset,
55  lldb::offset_t file_offset,
56  lldb::offset_t length,
58 
59  static bool SaveCore(const lldb::ProcessSP &process_sp,
60  const lldb_private::FileSpec &outfile,
61  lldb_private::Status &error);
62 
63  static bool MagicBytesMatch(lldb::DataBufferSP &data_sp, lldb::addr_t offset,
64  lldb::addr_t length);
65 
66  // LLVM RTTI support
67  static char ID;
68  bool isA(const void *ClassID) const override {
69  return ClassID == &ID || ObjectFile::isA(ClassID);
70  }
71  static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }
72 
73  // Member Functions
74  bool ParseHeader() override;
75 
77  bool value_is_offset) override;
78 
79  lldb::ByteOrder GetByteOrder() const override;
80 
81  bool IsExecutable() const override;
82 
83  bool IsDynamicLoader() const;
84 
85  uint32_t GetAddressByteSize() const override;
86 
88 
89  lldb_private::Symtab *GetSymtab() override;
90 
91  bool IsStripped() override;
92 
93  void CreateSections(lldb_private::SectionList &unified_section_list) override;
94 
95  void Dump(lldb_private::Stream *s) override;
96 
98 
99  lldb_private::UUID GetUUID() override;
100 
101  uint32_t GetDependentModules(lldb_private::FileSpecList &files) override;
102 
103  lldb_private::FileSpecList GetReExportedLibraries() override {
104  return m_reexported_dylibs;
105  }
106 
108 
110 
111  uint32_t GetNumThreadContexts() override;
112 
113  std::string GetIdentifierString() override;
114 
115  bool GetCorefileMainBinaryInfo (lldb::addr_t &address, lldb_private::UUID &uuid) override;
116 
117  lldb::RegisterContextSP
119 
120  ObjectFile::Type CalculateType() override;
121 
122  ObjectFile::Strata CalculateStrata() override;
123 
124  llvm::VersionTuple GetVersion() override;
125 
126  llvm::VersionTuple GetMinimumOSVersion() override;
127 
128  llvm::VersionTuple GetSDKVersion() override;
129 
130  bool GetIsDynamicLinkEditor() override;
131 
132  static bool ParseHeader(lldb_private::DataExtractor &data,
133  lldb::offset_t *data_offset_ptr,
134  llvm::MachO::mach_header &header);
135 
136  bool AllowAssemblyEmulationUnwindPlans() override;
137 
138  // PluginInterface protocol
140 
141  uint32_t GetPluginVersion() override;
142 
143 protected:
144  static lldb_private::UUID
145  GetUUID(const llvm::MachO::mach_header &header,
146  const lldb_private::DataExtractor &data,
147  lldb::offset_t lc_offset); // Offset to the first load command
148 
150  lldb::ModuleSP module_sp, const llvm::MachO::mach_header &header,
151  const lldb_private::DataExtractor &data, lldb::offset_t lc_offset);
152 
153  /// Enumerate all ArchSpecs supported by this Mach-O file.
154  ///
155  /// On macOS one Mach-O slice can contain multiple load commands:
156  /// One load command for being loaded into a macOS process and one
157  /// load command for being loaded into a macCatalyst process. In
158  /// contrast to ObjectContainerUniversalMachO, this is the same
159  /// binary that can be loaded into different contexts.
160  static void GetAllArchSpecs(const llvm::MachO::mach_header &header,
161  const lldb_private::DataExtractor &data,
162  lldb::offset_t lc_offset,
163  lldb_private::ModuleSpec &base_spec,
164  lldb_private::ModuleSpecList &all_specs);
165 
166  /// Intended for same-host arm device debugging where lldb needs to
167  /// detect libraries in the shared cache and augment the nlist entries
168  /// with an on-disk dyld_shared_cache file. The process will record
169  /// the shared cache UUID so the on-disk cache can be matched or rejected
170  /// correctly.
172  lldb::addr_t &base_addr,
173  lldb_private::UUID &uuid);
174 
175  /// Intended for same-host arm device debugging where lldb will read
176  /// shared cache libraries out of its own memory instead of the remote
177  /// process' memory as an optimization. If lldb's shared cache UUID
178  /// does not match the process' shared cache UUID, this optimization
179  /// should not be used.
180  void GetLLDBSharedCacheUUID(lldb::addr_t &base_addir, lldb_private::UUID &uuid);
181 
183 
185  lldb::addr_t mach_header_load_address,
186  const lldb_private::Section *mach_header_section,
187  const lldb_private::Section *section);
188 
190  GetSharedCacheUUID(lldb_private::FileSpec dyld_shared_cache,
191  const lldb::ByteOrder byte_order,
192  const uint32_t addr_byte_size);
193 
194  size_t ParseSymtab();
195 
197  EncryptedFileRanges GetEncryptedFileRanges();
198 
199  struct SegmentParsingContext;
200  void ProcessDysymtabCommand(const llvm::MachO::load_command &load_cmd,
201  lldb::offset_t offset);
202  void ProcessSegmentCommand(const llvm::MachO::load_command &load_cmd,
203  lldb::offset_t offset, uint32_t cmd_idx,
204  SegmentParsingContext &context);
205  void SanitizeSegmentCommand(llvm::MachO::segment_command_64 &seg_cmd,
206  uint32_t cmd_idx);
207 
208  bool SectionIsLoadable(const lldb_private::Section *section);
209 
210  llvm::MachO::mach_header m_header;
219 
220  llvm::MachO::dysymtab_command m_dysymtab;
221  std::vector<llvm::MachO::segment_command_64> m_mach_segments;
222  std::vector<llvm::MachO::section_64> m_mach_sections;
223  llvm::Optional<llvm::VersionTuple> m_min_os_version;
224  llvm::Optional<llvm::VersionTuple> m_sdk_versions;
227  FileRangeArray m_thread_context_offsets;
229  lldb_private::FileSpecList m_reexported_dylibs;
231 };
232 
233 #endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_MACH_O_OBJECTFILEMACHO_H
void GetProcessSharedCacheUUID(lldb_private::Process *, lldb::addr_t &base_addr, lldb_private::UUID &uuid)
Intended for same-host arm device debugging where lldb needs to detect libraries in the shared cache ...
lldb_private::Symtab * GetSymtab() override
Gets the symbol table for the currently selected architecture (and object for archives).
llvm::MachO::mach_header m_header
static void Terminate()
EncryptedFileRanges GetEncryptedFileRanges()
lldb_private::FileSpecList m_reexported_dylibs
An data extractor class.
Definition: DataExtractor.h:46
lldb_private::FileSpecList GetReExportedLibraries() override
Gets the file spec list of libraries re-exported by this object file.
uint32_t GetAddressByteSize() const override
Gets the address size in bytes for the current object file.
bool AllowAssemblyEmulationUnwindPlans() override
Returns if the function bounds for symbols in this symbol file are likely accurate.
A stream class that can stream formatted output to a file.
Definition: Stream.h:28
static bool SaveCore(const lldb::ProcessSP &process_sp, const lldb_private::FileSpec &outfile, lldb_private::Status &error)
void Dump(lldb_private::Stream *s) override
Dump a description of this object to a Stream.
static size_t GetModuleSpecifications(const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp, lldb::offset_t data_offset, lldb::offset_t file_offset, lldb::offset_t length, lldb_private::ModuleSpecList &specs)
static lldb_private::ConstString GetSectionNameEHFrame()
lldb_private::ArchSpec GetArchitecture() override
Get the ArchSpec for this object file.
lldb_private::AddressClass GetAddressClass(lldb::addr_t file_addr) override
Get the address type given a file address in an object file.
~ObjectFileMachO() override=default
lldb_private::RangeVector< uint32_t, uint32_t > FileRangeArray
A file utility class.
Definition: FileSpec.h:56
An architecture specification class.
Definition: ArchSpec.h:33
static char ID
ObjectFile::Strata CalculateStrata() override
The object file should be able to calculate the strata of the object file.
A plug-in interface definition class for object file parsers.
Definition: ObjectFile.h:58
static lldb_private::ObjectFile * CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, lldb::offset_t data_offset, const lldb_private::FileSpec *file, lldb::offset_t file_offset, lldb::offset_t length)
FileRangeArray m_thread_context_offsets
bool GetCorefileMainBinaryInfo(lldb::addr_t &address, lldb_private::UUID &uuid) override
When the ObjectFile is a core file, lldb needs to locate the "binary" in the core file...
bool IsExecutable() const override
Tells whether this object file is capable of being the main executable for a process.
lldb_private::Section * GetMachHeaderSection()
bool IsStripped() override
Detect if this object file has been stripped of local symbols.
void CreateSections(lldb_private::SectionList &unified_section_list) override
ObjectFile::Type CalculateType() override
The object file should be able to calculate its type by looking at its file header and possibly the s...
bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value, bool value_is_offset) override
Sets the load address for an entire module, assuming a rigid slide of sections, if possible in the im...
std::vector< llvm::MachO::segment_command_64 > m_mach_segments
static void GetAllArchSpecs(const llvm::MachO::mach_header &header, const lldb_private::DataExtractor &data, lldb::offset_t lc_offset, lldb_private::ModuleSpec &base_spec, lldb_private::ModuleSpecList &all_specs)
Enumerate all ArchSpecs supported by this Mach-O file.
lldb_private::UUID GetSharedCacheUUID(lldb_private::FileSpec dyld_shared_cache, const lldb::ByteOrder byte_order, const uint32_t addr_byte_size)
void SanitizeSegmentCommand(llvm::MachO::segment_command_64 &seg_cmd, uint32_t cmd_idx)
static lldb_private::ConstString GetSegmentNameTEXT()
uint64_t offset_t
Definition: lldb-types.h:87
llvm::MachO::dysymtab_command m_dysymtab
static bool MagicBytesMatch(lldb::DataBufferSP &data_sp, lldb::addr_t offset, lldb::addr_t length)
llvm::Optional< llvm::VersionTuple > m_sdk_versions
lldb_private::Address GetEntryPointAddress() override
Returns the address of the Entry Point in this object file - if the object file doesn&#39;t have an entry...
ByteOrder
Byte ordering definitions.
static bool classof(const ObjectFile *obj)
lldb_private::Address m_entry_point_address
llvm::VersionTuple GetMinimumOSVersion() override
Get the minimum OS version this object file can run on.
void ProcessSegmentCommand(const llvm::MachO::load_command &load_cmd, lldb::offset_t offset, uint32_t cmd_idx, SegmentParsingContext &context)
A plug-in interface definition class for debugging a process.
Definition: Process.h:362
uint32_t GetDependentModules(lldb_private::FileSpecList &files) override
static lldb_private::ConstString GetSegmentNameLINKEDIT()
static lldb_private::ConstString GetSegmentNameDWARF()
lldb_private::ConstString GetPluginName() override
static lldb_private::ConstString GetSegmentNameDATA_DIRTY()
static lldb_private::ConstString GetSegmentNameDATA_CONST()
A section + offset based address class.
Definition: Address.h:59
ObjectFileMachO(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, lldb::offset_t data_offset, const lldb_private::FileSpec *file, lldb::offset_t offset, lldb::offset_t length)
void ProcessDysymtabCommand(const llvm::MachO::load_command &load_cmd, lldb::offset_t offset)
lldb_private::UUID GetUUID() override
Gets the UUID for this object file.
void GetLLDBSharedCacheUUID(lldb::addr_t &base_addir, lldb_private::UUID &uuid)
Intended for same-host arm device debugging where lldb will read shared cache libraries out of its ow...
static const char * GetPluginDescriptionStatic()
bool isA(const void *ClassID) const override
bool m_thread_context_offsets_valid
std::string GetIdentifierString() override
Some object files may have an identifier string embedded in them, e.g.
uint64_t addr_t
Definition: lldb-types.h:83
A uniqued constant string class.
Definition: ConstString.h:40
bool GetIsDynamicLinkEditor() override
Return true if this file is a dynamic link editor (dyld)
bool ParseHeader() override
Attempts to parse the object header.
uint32_t GetNumThreadContexts() override
lldb::RegisterContextSP GetThreadContextAtIndex(uint32_t idx, lldb_private::Thread &thread) override
static lldb_private::ConstString GetPluginNameStatic()
uint32_t GetPluginVersion() override
static lldb_private::ConstString GetSegmentNameDATA()
bool SectionIsLoadable(const lldb_private::Section *section)
bool m_allow_assembly_emulation_unwind_plans
lldb_private::Address GetBaseAddress() override
Returns base address of this object file.
static lldb_private::ConstString GetSegmentNameOBJC()
lldb_private::RangeVector< uint32_t, uint32_t, 8 > EncryptedFileRanges
lldb::addr_t CalculateSectionLoadAddressForMemoryImage(lldb::addr_t mach_header_load_address, const lldb_private::Section *mach_header_section, const lldb_private::Section *section)
llvm::Optional< llvm::VersionTuple > m_min_os_version
llvm::VersionTuple GetSDKVersion() override
Get the SDK OS version this object file was built with.
lldb::ByteOrder GetByteOrder() const override
Gets whether endian swapping should occur when extracting data from this object file.
bool IsDynamicLoader() const
llvm::VersionTuple GetVersion() override
Get the object file version numbers.
static void Initialize()
std::vector< llvm::MachO::section_64 > m_mach_sections
ObjectFile(const lldb::ModuleSP &module_sp, const FileSpec *file_spec_ptr, lldb::offset_t file_offset, lldb::offset_t length, const lldb::DataBufferSP &data_sp, lldb::offset_t data_offset)
Construct with a parent module, offset, and header data.
Definition: ObjectFile.cpp:259
An error handling class.
Definition: Status.h:44
static lldb_private::ObjectFile * CreateMemoryInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, const lldb::ProcessSP &process_sp, lldb::addr_t header_addr)