LLDB  mainline
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 //===----------------------------------------------------------------------===//
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"
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);
29  ObjectFileMachO(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp,
30  const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
32  ~ObjectFileMachO() override = default;
34  // Static Functions
35  static void Initialize();
37  static void Terminate();
41  static const char *GetPluginDescriptionStatic();
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);
49  const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp,
50  const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
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,
59  static bool SaveCore(const lldb::ProcessSP &process_sp,
60  const lldb_private::FileSpec &outfile,
61  lldb_private::Status &error);
63  static bool MagicBytesMatch(lldb::DataBufferSP &data_sp, lldb::addr_t offset,
64  lldb::addr_t length);
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); }
73  // Member Functions
74  bool ParseHeader() override;
77  bool value_is_offset) override;
79  lldb::ByteOrder GetByteOrder() const override;
81  bool IsExecutable() const override;
83  bool IsDynamicLoader() const;
85  uint32_t GetAddressByteSize() const override;
89  lldb_private::Symtab *GetSymtab() override;
91  bool IsStripped() override;
93  void CreateSections(lldb_private::SectionList &unified_section_list) override;
95  void Dump(lldb_private::Stream *s) override;
99  lldb_private::UUID GetUUID() override;
101  uint32_t GetDependentModules(lldb_private::FileSpecList &files) override;
103  lldb_private::FileSpecList GetReExportedLibraries() override {
104  return m_reexported_dylibs;
105  }
111  uint32_t GetNumThreadContexts() override;
113  std::string GetIdentifierString() override;
115  bool GetCorefileMainBinaryInfo (lldb::addr_t &address, lldb_private::UUID &uuid) override;
117  lldb::RegisterContextSP
120  ObjectFile::Type CalculateType() override;
122  ObjectFile::Strata CalculateStrata() override;
124  llvm::VersionTuple GetVersion() override;
126  llvm::VersionTuple GetMinimumOSVersion() override;
128  llvm::VersionTuple GetSDKVersion() override;
130  bool GetIsDynamicLinkEditor() override;
132  static bool ParseHeader(lldb_private::DataExtractor &data,
133  lldb::offset_t *data_offset_ptr,
134  llvm::MachO::mach_header &header);
136  bool AllowAssemblyEmulationUnwindPlans() override;
138  // PluginInterface protocol
141  uint32_t GetPluginVersion() override;
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
150  lldb::ModuleSP module_sp, const llvm::MachO::mach_header &header,
151  const lldb_private::DataExtractor &data, lldb::offset_t lc_offset);
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);
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);
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);
185  lldb::addr_t mach_header_load_address,
186  const lldb_private::Section *mach_header_section,
187  const lldb_private::Section *section);
190  GetSharedCacheUUID(lldb_private::FileSpec dyld_shared_cache,
191  const lldb::ByteOrder byte_order,
192  const uint32_t addr_byte_size);
194  size_t ParseSymtab();
197  EncryptedFileRanges GetEncryptedFileRanges();
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);
208  bool SectionIsLoadable(const lldb_private::Section *section);
210  llvm::MachO::mach_header m_header;
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 };
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...
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)