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  class Segment {
75  public:
78  filesize(0), maxprot(0), initprot(0), nsects(0), flags(0) {}
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.
102  lldb::addr_t slide = 0;
103  /// Modification date for this dylib.
104  lldb::addr_t mod_date = 0;
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.
116  uint32_t load_stop_id = 0;
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.
123  std::string min_version_os_sdk;
124 
125  ImageInfo() = default;
126 
127  void Clear(bool load_cmd_data_only) {
128  if (!load_cmd_data_only) {
129  address = LLDB_INVALID_ADDRESS;
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 
164  lldb_private::ArchSpec GetArchitecture() const;
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
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;
232  ThreadIDToTLSMap m_tid_to_tls_map;
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:
242 };
243 
244 } // namespace lldb_private
245 
246 #endif // LLDB_SOURCE_PLUGINS_DYNAMICLOADER_MACOSX_DYLD_DYNAMICLOADERDARWIN_H
std::map< lldb::user_id_t, PthreadKeyToTLSMap > ThreadIDToTLSMap
bool operator==(const Segment &rhs) const
Defines a list of symbol context objects.
A class that represents a running process on the host machine.
DynamicLoaderDarwin(lldb_private::Process *process)
bool IsValid() const
Definition: UUID.h:62
lldb::addr_t address
Address of mach header for this dylib.
std::vector< Segment > segments
All segment vmaddr and vmsize pairs for this executable (from memory of inferior).
lldb::addr_t mod_date
Modification date for this dylib.
Defines a symbol context baton that can be handed other debug core functions.
Definition: SymbolContext.h:33
virtual bool NeedToDoInitialImageFetch()=0
bool AddModulesUsingImageInfos(ImageInfo::collection &image_infos)
void PrivateInitialize(lldb_private::Process *process)
llvm::Triple::OSType os_type
LC_VERSION_MIN_... load command os type.
void DidLaunch() override
Called after attaching a process.
llvm::MachO::mach_header header
The mach header for this image.
A file utility class.
Definition: FileSpec.h:56
void DidAttach() override
Called after attaching a process.
An architecture specification class.
Definition: ArchSpec.h:33
std::string min_version_os_sdk
LC_VERSION_MIN_... SDK.
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.
void Clear()
Clears the object state.
Definition: FileSpec.cpp:261
lldb_private::Address m_pthread_getspecific_addr
void UpdateSpecialBinariesFromNewImageInfos(ImageInfo::collection &image_infos)
void UnloadImages(const std::vector< lldb::addr_t > &solib_addresses)
bool operator==(const ImageInfo &rhs) const
virtual bool DidSetNotificationBreakpoint()=0
bool UnloadModuleSections(lldb_private::Module *module, ImageInfo &info)
static bool UseDYLDSPI(lldb_private::Process *process)
std::map< uint64_t, lldb::addr_t > PthreadKeyToTLSMap
void PutToLog(lldb_private::Log *log, lldb::addr_t slide) const
#define LLDB_INVALID_ADDRESS
Invalid value definitions.
Definition: lldb-defines.h:85
virtual void DoInitialImageFetch()=0
lldb_private::Address GetPthreadSetSpecificAddress()
A collection class for Module objects.
Definition: ModuleList.h:71
A class that describes an executable image and its associated object and symbol files.
Definition: Module.h:75
StateType
Process and Thread States.
lldb::ModuleSP FindTargetModuleForImageInfo(ImageInfo &image_info, bool can_create, bool *did_create_ptr)
lldb::addr_t slide
The amount to slide all segments by if there is a global slide.
A plug-in interface definition class for debugging a process.
Definition: Process.h:362
bool UpdateImageLoadAddress(lldb_private::Module *module, ImageInfo &info)
A section + offset based address class.
Definition: Address.h:59
DISALLOW_COPY_AND_ASSIGN(DynamicLoaderDarwin)
A plug-in interface definition class for dynamic loaders.
Definition: DynamicLoader.h:52
llvm::Triple::EnvironmentType os_env
LC_VERSION_MIN_... load command os environment.
void PrivateProcessStateChanged(lldb_private::Process *process, lldb::StateType state)
void SetDYLDModule(lldb::ModuleSP &dyld_module_sp)
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...
uint64_t addr_t
Definition: lldb-types.h:83
void Clear()
Definition: UUID.h:55
A uniqued constant string class.
Definition: ConstString.h:40
virtual void ClearNotificationBreakpoint()=0
void UpdateDYLDImageInfoFromNewImageInfo(ImageInfo &image_info)
std::shared_ptr< Object > ObjectSP
lldb_private::UUID uuid
UUID for this dylib if it has one, else all zeros.
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...
bool JSONImageInformationIntoImageInfo(lldb_private::StructuredData::ObjectSP image_details, ImageInfo::collection &image_infos)
std::recursive_mutex & GetMutex() const
ImageInfo::collection m_dyld_image_infos
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&#39;s the fi...
void AddExecutableModuleIfInImageInfos(ImageInfo::collection &image_infos)
lldb_private::FileSpec file_spec
Resolved path for this dylib.
virtual bool SetNotificationBreakpoint()=0