LLDB  mainline
DynamicLoaderDarwin.h
Go to the documentation of this file.
1 //===-- DynamicLoaderDarwin.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_DYNAMICLOADER_MACOSX_DYLD_DYNAMICLOADERDARWIN_H
10 #define LLDB_SOURCE_PLUGINS_DYNAMICLOADER_MACOSX_DYLD_DYNAMICLOADERDARWIN_H
11 
12 #include <map>
13 #include <mutex>
14 #include <vector>
15 
16 #include "lldb/Host/SafeMachO.h"
18 #include "lldb/Target/Process.h"
19 #include "lldb/Utility/FileSpec.h"
21 #include "lldb/Utility/UUID.h"
22 
23 #include "llvm/ADT/Triple.h"
24 
25 namespace lldb_private {
26 
28 public:
30 
31  ~DynamicLoaderDarwin() override;
32 
33  /// Called after attaching a process.
34  ///
35  /// Allow DynamicLoader plug-ins to execute some code after
36  /// attaching to a process.
37  void DidAttach() override;
38 
39  void DidLaunch() override;
40 
41  lldb::ThreadPlanSP GetStepThroughTrampolinePlan(lldb_private::Thread &thread,
42  bool stop_others) override;
43 
45  lldb_private::Symbol *original_symbol,
46  lldb_private::ModuleList &module_list,
47  lldb_private::SymbolContextList &equivalent_symbols) override;
48 
49  lldb::addr_t GetThreadLocalData(const lldb::ModuleSP module,
50  const lldb::ThreadSP thread,
51  lldb::addr_t tls_file_addr) override;
52 
54 
55  virtual void DoInitialImageFetch() = 0;
56 
57  virtual bool NeedToDoInitialImageFetch() = 0;
58 
59 protected:
61 
63  lldb::StateType state);
64 
65  void Clear(bool clear_process);
66 
67  // Clear method for classes derived from this one
68  virtual void DoClear() = 0;
69 
70  void SetDYLDModule(lldb::ModuleSP &dyld_module_sp);
71 
72  lldb::ModuleSP GetDYLDModule();
73 
74  void ClearDYLDModule();
75 
76  class Segment {
77  public:
78  Segment() : name() {}
79 
89 
90  bool operator==(const Segment &rhs) const {
91  return name == rhs.name && vmaddr == rhs.vmaddr && vmsize == rhs.vmsize;
92  }
93 
94  void PutToLog(lldb_private::Log *log, lldb::addr_t slide) const;
95  };
96 
97  struct ImageInfo {
98  /// Address of mach header for this dylib.
100  /// The amount to slide all segments by if there is a global
101  /// slide.
103  /// Modification date for this dylib.
105  /// Resolved path for this dylib.
107  /// UUID for this dylib if it has one, else all zeros.
109  /// The mach header for this image.
110  llvm::MachO::mach_header header;
111  /// All segment vmaddr and vmsize pairs for this executable (from
112  /// memory of inferior).
113  std::vector<Segment> segments;
114  /// The process stop ID that the sections for this image were
115  /// loaded.
117  /// LC_VERSION_MIN_... load command os type.
118  llvm::Triple::OSType os_type = llvm::Triple::OSType::UnknownOS;
119  /// LC_VERSION_MIN_... load command os environment.
120  llvm::Triple::EnvironmentType os_env =
121  llvm::Triple::EnvironmentType::UnknownEnvironment;
122  /// LC_VERSION_MIN_... SDK.
124 
125  ImageInfo() = default;
126 
127  void Clear(bool load_cmd_data_only) {
128  if (!load_cmd_data_only) {
130  slide = 0;
131  mod_date = 0;
132  file_spec.Clear();
133  ::memset(&header, 0, sizeof(header));
134  }
135  uuid.Clear();
136  segments.clear();
137  load_stop_id = 0;
138  os_type = llvm::Triple::OSType::UnknownOS;
139  os_env = llvm::Triple::EnvironmentType::UnknownEnvironment;
140  min_version_os_sdk.clear();
141  }
142 
143  bool operator==(const ImageInfo &rhs) const {
144  return address == rhs.address && slide == rhs.slide &&
145  mod_date == rhs.mod_date && file_spec == rhs.file_spec &&
146  uuid == rhs.uuid &&
147  memcmp(&header, &rhs.header, sizeof(header)) == 0 &&
148  segments == rhs.segments && os_type == rhs.os_type &&
149  os_env == rhs.os_env;
150  }
151 
152  bool UUIDValid() const { return uuid.IsValid(); }
153 
155  if (header.cputype) {
156  if (header.cputype & llvm::MachO::CPU_ARCH_ABI64)
157  return 8;
158  else
159  return 4;
160  }
161  return 0;
162  }
163 
165 
166  const Segment *FindSegment(lldb_private::ConstString name) const;
167 
168  void PutToLog(lldb_private::Log *log) const;
169 
170  typedef std::vector<ImageInfo> collection;
171  typedef collection::iterator iterator;
172  typedef collection::const_iterator const_iterator;
173  };
174 
176 
178 
179  lldb::ModuleSP FindTargetModuleForImageInfo(ImageInfo &image_info,
180  bool can_create,
181  bool *did_create_ptr);
182 
183  void UnloadImages(const std::vector<lldb::addr_t> &solib_addresses);
184 
185  void UnloadAllImages();
186 
187  virtual bool SetNotificationBreakpoint() = 0;
188 
189  virtual void ClearNotificationBreakpoint() = 0;
190 
191  virtual bool DidSetNotificationBreakpoint() = 0;
192 
193  typedef std::map<uint64_t, lldb::addr_t> PthreadKeyToTLSMap;
194  typedef std::map<lldb::user_id_t, PthreadKeyToTLSMap> ThreadIDToTLSMap;
195 
196  std::recursive_mutex &GetMutex() const { return m_mutex; }
197 
198  lldb::ModuleSP GetPThreadLibraryModule();
199 
201 
204  ImageInfo::collection &image_infos);
205 
206  // If image_infos contains / may contain dyld or executable image, call this
207  // method
208  // to keep our internal record keeping of the special binaries up-to-date.
209  void
211 
212  // if image_info is a dyld binary, call this method
213  void UpdateDYLDImageInfoFromNewImageInfo(ImageInfo &image_info);
214 
215  // If image_infos contains / may contain executable image, call this method
216  // to keep our internal record keeping of the special dyld binary up-to-date.
218 
220 
221  // Whether we should use the new dyld SPI to get shared library information,
222  // or read
223  // it directly out of the dyld_all_image_infos. Whether we use the (newer)
224  // DynamicLoaderMacOS
225  // plugin or the (older) DynamicLoaderMacOSX plugin.
226  static bool UseDYLDSPI(lldb_private::Process *process);
227 
228  lldb::ModuleWP m_dyld_module_wp; // the dyld whose file type (mac, ios, etc)
229  // matches the process
230  lldb::ModuleWP m_libpthread_module_wp;
234  m_dyld_image_infos; // Current shared libraries information
235  uint32_t m_dyld_image_infos_stop_id; // The process stop ID that
236  // "m_dyld_image_infos" is valid for
238  mutable std::recursive_mutex m_mutex;
239 
240 private:
241  DynamicLoaderDarwin(const DynamicLoaderDarwin &) = delete;
242  const DynamicLoaderDarwin &operator=(const DynamicLoaderDarwin &) = delete;
243 };
244 
245 } // namespace lldb_private
246 
247 #endif // LLDB_SOURCE_PLUGINS_DYNAMICLOADER_MACOSX_DYLD_DYNAMICLOADERDARWIN_H
lldb_private::DynamicLoaderDarwin::FindEquivalentSymbols
void FindEquivalentSymbols(lldb_private::Symbol *original_symbol, lldb_private::ModuleList &module_list, lldb_private::SymbolContextList &equivalent_symbols) override
Some dynamic loaders provide features where there are a group of symbols "equivalent to" a given symb...
Definition: DynamicLoaderDarwin.cpp:1021
lldb_private::UUID
Definition: UUID.h:23
lldb_private::ArchSpec
Definition: ArchSpec.h:32
lldb_private::DynamicLoaderDarwin::GetPThreadLibraryModule
lldb::ModuleSP GetPThreadLibraryModule()
Definition: DynamicLoaderDarwin.cpp:1040
lldb_private::DynamicLoaderDarwin::Segment::nsects
uint32_t nsects
Definition: DynamicLoaderDarwin.h:87
lldb_private::DynamicLoaderDarwin::ImageInfo::segments
std::vector< Segment > segments
All segment vmaddr and vmsize pairs for this executable (from memory of inferior).
Definition: DynamicLoaderDarwin.h:113
lldb_private::DynamicLoaderDarwin::GetDYLDModule
lldb::ModuleSP GetDYLDModule()
Definition: DynamicLoaderDarwin.cpp:628
lldb_private::DynamicLoaderDarwin::ImageInfo::GetAddressByteSize
uint32_t GetAddressByteSize()
Definition: DynamicLoaderDarwin.h:154
lldb_private::DynamicLoaderDarwin::m_dyld
ImageInfo m_dyld
Definition: DynamicLoaderDarwin.h:237
lldb_private::Symbol
Definition: Symbol.h:20
StructuredData.h
UUID.h
lldb_private::DynamicLoaderDarwin::UpdateImageLoadAddress
bool UpdateImageLoadAddress(lldb_private::Module *module, ImageInfo &info)
Definition: DynamicLoaderDarwin.cpp:244
lldb_private::DynamicLoaderDarwin::JSONImageInformationIntoImageInfo
bool JSONImageInformationIntoImageInfo(lldb_private::StructuredData::ObjectSP image_details, ImageInfo::collection &image_infos)
Definition: DynamicLoaderDarwin.cpp:356
lldb_private::DynamicLoaderDarwin::m_tid_to_tls_map
ThreadIDToTLSMap m_tid_to_tls_map
Definition: DynamicLoaderDarwin.h:232
lldb_private::DynamicLoaderDarwin::m_pthread_getspecific_addr
lldb_private::Address m_pthread_getspecific_addr
Definition: DynamicLoaderDarwin.h:231
lldb_private::DynamicLoaderDarwin::ImageInfo::collection
std::vector< ImageInfo > collection
Definition: DynamicLoaderDarwin.h:170
lldb_private::UUID::IsValid
bool IsValid() const
Definition: UUID.h:69
lldb_private::DynamicLoaderDarwin::UpdateSpecialBinariesFromNewImageInfos
void UpdateSpecialBinariesFromNewImageInfos(ImageInfo::collection &image_infos)
Definition: DynamicLoaderDarwin.cpp:532
lldb_private::Process
Definition: Process.h:338
lldb_private::DynamicLoaderDarwin::GetMutex
std::recursive_mutex & GetMutex() const
Definition: DynamicLoaderDarwin.h:196
lldb_private::SymbolContextList
Definition: SymbolContext.h:379
lldb_private::Module
Definition: Module.h:85
lldb_private::DynamicLoaderDarwin::DoClear
virtual void DoClear()=0
lldb_private::DynamicLoaderDarwin::ImageInfo::UUIDValid
bool UUIDValid() const
Definition: DynamicLoaderDarwin.h:152
lldb::addr_t
uint64_t addr_t
Definition: lldb-types.h:83
lldb_private::DynamicLoaderDarwin::UnloadModuleSections
bool UnloadModuleSections(lldb_private::Module *module, ImageInfo &info)
Definition: DynamicLoaderDarwin.cpp:321
lldb_private::DynamicLoaderDarwin::ImageInfo
Definition: DynamicLoaderDarwin.h:97
lldb_private::DynamicLoaderDarwin::ImageInfo::FindSegment
const Segment * FindSegment(lldb_private::ConstString name) const
Definition: DynamicLoaderDarwin.cpp:800
lldb_private::SymbolContext
Definition: SymbolContext.h:33
lldb_private::DynamicLoaderDarwin::ImageInfo::file_spec
lldb_private::FileSpec file_spec
Resolved path for this dylib.
Definition: DynamicLoaderDarwin.h:106
lldb_private::DynamicLoaderDarwin::ClearDYLDModule
void ClearDYLDModule()
Definition: DynamicLoaderDarwin.cpp:633
lldb_private::DynamicLoaderDarwin::AlwaysRelyOnEHUnwindInfo
bool AlwaysRelyOnEHUnwindInfo(lldb_private::SymbolContext &sym_ctx) override
Ask if the eh_frame information for the given SymbolContext should be relied on even when it's the fi...
Definition: DynamicLoaderDarwin.cpp:742
Process.h
lldb_private::DynamicLoaderDarwin::SetDYLDModule
void SetDYLDModule(lldb::ModuleSP &dyld_module_sp)
Definition: DynamicLoaderDarwin.cpp:624
SafeMachO.h
lldb_private::DynamicLoaderDarwin::AddExecutableModuleIfInImageInfos
void AddExecutableModuleIfInImageInfos(ImageInfo::collection &image_infos)
lldb_private::DynamicLoaderDarwin::PrivateProcessStateChanged
void PrivateProcessStateChanged(lldb_private::Process *process, lldb::StateType state)
Definition: DynamicLoaderDarwin.cpp:833
lldb_private::DynamicLoaderDarwin::ImageInfo::iterator
collection::iterator iterator
Definition: DynamicLoaderDarwin.h:171
lldb_private::FileSpec
Definition: FileSpec.h:55
lldb_private::DynamicLoaderDarwin::UpdateDYLDImageInfoFromNewImageInfo
void UpdateDYLDImageInfoFromNewImageInfo(ImageInfo &image_info)
Definition: DynamicLoaderDarwin.cpp:609
lldb_private::DynamicLoaderDarwin::DidLaunch
void DidLaunch() override
Called after attaching a process.
Definition: DynamicLoaderDarwin.cpp:80
lldb_private::DynamicLoaderDarwin::AddModulesUsingImageInfos
bool AddModulesUsingImageInfos(ImageInfo::collection &image_infos)
Definition: DynamicLoaderDarwin.cpp:635
lldb_private::DynamicLoaderDarwin::ImageInfo::Clear
void Clear(bool load_cmd_data_only)
Definition: DynamicLoaderDarwin.h:127
lldb_private::DynamicLoaderDarwin::ImageInfo::address
lldb::addr_t address
Address of mach header for this dylib.
Definition: DynamicLoaderDarwin.h:99
lldb_private::DynamicLoaderDarwin::m_dyld_image_infos_stop_id
uint32_t m_dyld_image_infos_stop_id
Definition: DynamicLoaderDarwin.h:235
lldb_private::DynamicLoaderDarwin::UseDYLDSPI
static bool UseDYLDSPI(lldb_private::Process *process)
Definition: DynamicLoaderDarwin.cpp:1157
lldb_private::DynamicLoaderDarwin::ImageInfo::mod_date
lldb::addr_t mod_date
Modification date for this dylib.
Definition: DynamicLoaderDarwin.h:104
lldb_private::DynamicLoaderDarwin::ImageInfo::load_stop_id
uint32_t load_stop_id
The process stop ID that the sections for this image were loaded.
Definition: DynamicLoaderDarwin.h:116
lldb_private::ModuleList
Definition: ModuleList.h:82
lldb_private::DynamicLoaderDarwin::m_mutex
std::recursive_mutex m_mutex
Definition: DynamicLoaderDarwin.h:238
lldb_private::DynamicLoaderDarwin::Segment::vmaddr
lldb::addr_t vmaddr
Definition: DynamicLoaderDarwin.h:81
lldb_private::Thread
Definition: Thread.h:61
lldb_private::DynamicLoaderDarwin::Segment::flags
uint32_t flags
Definition: DynamicLoaderDarwin.h:88
lldb_private::DynamicLoaderDarwin::GetStepThroughTrampolinePlan
lldb::ThreadPlanSP GetStepThroughTrampolinePlan(lldb_private::Thread &thread, bool stop_others) override
Provides a plan to step through the dynamic loader trampoline for the current state of thread.
Definition: DynamicLoaderDarwin.cpp:868
lldb_private::DynamicLoaderDarwin::ImageInfo::uuid
lldb_private::UUID uuid
UUID for this dylib if it has one, else all zeros.
Definition: DynamicLoaderDarwin.h:108
lldb_private::StructuredData::ObjectSP
std::shared_ptr< Object > ObjectSP
Definition: StructuredData.h:59
lldb_private::DynamicLoaderDarwin::operator=
const DynamicLoaderDarwin & operator=(const DynamicLoaderDarwin &)=delete
lldb_private::ConstString
Definition: ConstString.h:39
lldb_private::DynamicLoaderDarwin::ImageInfo::header
llvm::MachO::mach_header header
The mach header for this image.
Definition: DynamicLoaderDarwin.h:110
lldb_private::DynamicLoaderDarwin::Segment::vmsize
lldb::addr_t vmsize
Definition: DynamicLoaderDarwin.h:82
lldb_private::DynamicLoaderDarwin::GetPthreadSetSpecificAddress
lldb_private::Address GetPthreadSetSpecificAddress()
Definition: DynamicLoaderDarwin.cpp:1059
lldb_private::DynamicLoaderDarwin::m_dyld_module_wp
lldb::ModuleWP m_dyld_module_wp
Definition: DynamicLoaderDarwin.h:228
lldb_private::DynamicLoaderDarwin::ImageInfo::PutToLog
void PutToLog(lldb_private::Log *log) const
Definition: DynamicLoaderDarwin.cpp:810
lldb_private::DynamicLoaderDarwin::NeedToDoInitialImageFetch
virtual bool NeedToDoInitialImageFetch()=0
lldb_private::DynamicLoaderDarwin::Segment::filesize
lldb::addr_t filesize
Definition: DynamicLoaderDarwin.h:84
lldb_private::DynamicLoader
Definition: DynamicLoader.h:52
lldb_private::DynamicLoaderDarwin::DynamicLoaderDarwin
DynamicLoaderDarwin(lldb_private::Process *process)
Definition: DynamicLoaderDarwin.cpp:58
lldb_private::DynamicLoaderDarwin::PthreadKeyToTLSMap
std::map< uint64_t, lldb::addr_t > PthreadKeyToTLSMap
Definition: DynamicLoaderDarwin.h:193
string
string(SUBSTRING ${p} 10 -1 pStripped) if($
Definition: Plugins/CMakeLists.txt:40
lldb_private::DynamicLoaderDarwin::Segment::name
lldb_private::ConstString name
Definition: DynamicLoaderDarwin.h:80
lldb_private::DynamicLoaderDarwin::Segment
Definition: DynamicLoaderDarwin.h:76
lldb_private::DynamicLoaderDarwin::ClearNotificationBreakpoint
virtual void ClearNotificationBreakpoint()=0
lldb_private::DynamicLoaderDarwin
Definition: DynamicLoaderDarwin.h:27
lldb_private::DynamicLoaderDarwin::PrivateInitialize
void PrivateInitialize(lldb_private::Process *process)
Definition: DynamicLoaderDarwin.cpp:824
lldb_private::DynamicLoaderDarwin::ImageInfo::const_iterator
collection::const_iterator const_iterator
Definition: DynamicLoaderDarwin.h:172
lldb_private::DynamicLoaderDarwin::Clear
void Clear(bool clear_process)
Definition: DynamicLoaderDarwin.cpp:87
lldb_private::DynamicLoaderDarwin::Segment::initprot
uint32_t initprot
Definition: DynamicLoaderDarwin.h:86
lldb_private::FileSpec::Clear
void Clear()
Clears the object state.
Definition: FileSpec.cpp:257
lldb_private::UUID::Clear
void Clear()
Definition: UUID.h:62
lldb_private::DynamicLoaderDarwin::ImageInfo::operator==
bool operator==(const ImageInfo &rhs) const
Definition: DynamicLoaderDarwin.h:143
lldb_private::DynamicLoaderDarwin::GetThreadLocalData
lldb::addr_t GetThreadLocalData(const lldb::ModuleSP module, const lldb::ThreadSP thread, lldb::addr_t tls_file_addr) override
Retrieves the per-module TLS block for a given thread.
Definition: DynamicLoaderDarwin.cpp:1077
lldb_private::DynamicLoaderDarwin::ImageInfo::os_env
llvm::Triple::EnvironmentType os_env
LC_VERSION_MIN_... load command os environment.
Definition: DynamicLoaderDarwin.h:120
lldb_private::DynamicLoaderDarwin::Segment::fileoff
lldb::addr_t fileoff
Definition: DynamicLoaderDarwin.h:83
lldb_private::DynamicLoaderDarwin::FindTargetModuleForImageInfo
lldb::ModuleSP FindTargetModuleForImageInfo(ImageInfo &image_info, bool can_create, bool *did_create_ptr)
Definition: DynamicLoaderDarwin.cpp:96
uint32_t
lldb_private::Address
Definition: Address.h:59
lldb_private::DynamicLoaderDarwin::UnloadAllImages
void UnloadAllImages()
Definition: DynamicLoaderDarwin.cpp:212
lldb_private::DynamicLoaderDarwin::Segment::operator==
bool operator==(const Segment &rhs) const
Definition: DynamicLoaderDarwin.h:90
lldb_private::DynamicLoaderDarwin::UnloadImages
void UnloadImages(const std::vector< lldb::addr_t > &solib_addresses)
Definition: DynamicLoaderDarwin.cpp:164
lldb_private::DynamicLoaderDarwin::ImageInfo::ImageInfo
ImageInfo()=default
lldb_private::DynamicLoaderDarwin::m_dyld_image_infos
ImageInfo::collection m_dyld_image_infos
Definition: DynamicLoaderDarwin.h:234
LLDB_INVALID_ADDRESS
#define LLDB_INVALID_ADDRESS
Definition: lldb-defines.h:74
lldb_private::DynamicLoaderDarwin::SetNotificationBreakpoint
virtual bool SetNotificationBreakpoint()=0
lldb_private::DynamicLoaderDarwin::ImageInfo::slide
lldb::addr_t slide
The amount to slide all segments by if there is a global slide.
Definition: DynamicLoaderDarwin.h:102
lldb_private
A class that represents a running process on the host machine.
Definition: SBCommandInterpreterRunOptions.h:16
lldb_private::DynamicLoaderDarwin::DidSetNotificationBreakpoint
virtual bool DidSetNotificationBreakpoint()=0
lldb_private::DynamicLoaderDarwin::DidAttach
void DidAttach() override
Called after attaching a process.
Definition: DynamicLoaderDarwin.cpp:70
FileSpec.h
lldb_private::DynamicLoaderDarwin::~DynamicLoaderDarwin
~DynamicLoaderDarwin() override
lldb_private::DynamicLoaderDarwin::ImageInfo::GetArchitecture
lldb_private::ArchSpec GetArchitecture() const
Definition: DynamicLoaderDarwin.cpp:775
lldb::StateType
StateType
Process and Thread States.
Definition: lldb-enumerations.h:73
lldb_private::Log
Definition: Log.h:115
lldb_private::DynamicLoaderDarwin::ThreadIDToTLSMap
std::map< lldb::user_id_t, PthreadKeyToTLSMap > ThreadIDToTLSMap
Definition: DynamicLoaderDarwin.h:194
lldb_private::DynamicLoaderDarwin::m_libpthread_module_wp
lldb::ModuleWP m_libpthread_module_wp
Definition: DynamicLoaderDarwin.h:230
lldb_private::DynamicLoaderDarwin::ImageInfo::min_version_os_sdk
std::string min_version_os_sdk
LC_VERSION_MIN_... SDK.
Definition: DynamicLoaderDarwin.h:123
DynamicLoader.h
lldb_private::DynamicLoaderDarwin::Segment::Segment
Segment()
Definition: DynamicLoaderDarwin.h:78
lldb_private::DynamicLoaderDarwin::DoInitialImageFetch
virtual void DoInitialImageFetch()=0
lldb_private::DynamicLoaderDarwin::Segment::PutToLog
void PutToLog(lldb_private::Log *log, lldb::addr_t slide) const
Definition: DynamicLoaderDarwin.cpp:760
lldb_private::DynamicLoaderDarwin::ImageInfo::os_type
llvm::Triple::OSType os_type
LC_VERSION_MIN_... load command os type.
Definition: DynamicLoaderDarwin.h:118
lldb_private::DynamicLoaderDarwin::Segment::maxprot
uint32_t maxprot
Definition: DynamicLoaderDarwin.h:85