1 | //===-- DynamicLoaderMacOS.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 | // This is the DynamicLoader plugin for Darwin (macOS / iPhoneOS / tvOS / |
10 | // watchOS / BridgeOS) |
11 | // platforms late 2016 and newer, where lldb will call dyld SPI functions to get |
12 | // information about shared libraries, information about the shared cache, and |
13 | // the _dyld_debugger_notification function we put a breakpoint on give us an |
14 | // array of load addresses for solibs loaded and unloaded. The SPI will tell us |
15 | // about both dyld and the executable, in addition to all of the usual solibs. |
16 | |
17 | #ifndef LLDB_SOURCE_PLUGINS_DYNAMICLOADER_MACOSX_DYLD_DYNAMICLOADERMACOS_H |
18 | #define LLDB_SOURCE_PLUGINS_DYNAMICLOADER_MACOSX_DYLD_DYNAMICLOADERMACOS_H |
19 | |
20 | #include <mutex> |
21 | #include <vector> |
22 | |
23 | #include "lldb/Target/DynamicLoader.h" |
24 | #include "lldb/Target/Process.h" |
25 | #include "lldb/Utility/FileSpec.h" |
26 | #include "lldb/Utility/StructuredData.h" |
27 | #include "lldb/Utility/UUID.h" |
28 | |
29 | #include "DynamicLoaderDarwin.h" |
30 | |
31 | class DynamicLoaderMacOS : public lldb_private::DynamicLoaderDarwin { |
32 | public: |
33 | DynamicLoaderMacOS(lldb_private::Process *process); |
34 | |
35 | ~DynamicLoaderMacOS() override; |
36 | |
37 | // Static Functions |
38 | static void Initialize(); |
39 | |
40 | static void Terminate(); |
41 | |
42 | static llvm::StringRef GetPluginNameStatic() { return "macos-dyld" ; } |
43 | |
44 | static llvm::StringRef GetPluginDescriptionStatic(); |
45 | |
46 | static lldb_private::DynamicLoader * |
47 | CreateInstance(lldb_private::Process *process, bool force); |
48 | |
49 | /// Called after attaching a process. |
50 | /// |
51 | /// Allow DynamicLoader plug-ins to execute some code after |
52 | /// attaching to a process. |
53 | bool ProcessDidExec() override; |
54 | |
55 | lldb_private::Status CanLoadImage() override; |
56 | |
57 | bool GetSharedCacheInformation( |
58 | lldb::addr_t &base_address, lldb_private::UUID &uuid, |
59 | lldb_private::LazyBool &using_shared_cache, |
60 | lldb_private::LazyBool &private_shared_cache) override; |
61 | |
62 | // PluginInterface protocol |
63 | llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } |
64 | |
65 | protected: |
66 | void PutToLog(lldb_private::Log *log) const; |
67 | |
68 | void DoInitialImageFetch() override; |
69 | |
70 | bool NeedToDoInitialImageFetch() override; |
71 | |
72 | bool DidSetNotificationBreakpoint() override; |
73 | |
74 | bool SetDYLDHandoverBreakpoint(lldb::addr_t notification_address); |
75 | |
76 | void ClearDYLDHandoverBreakpoint(); |
77 | |
78 | void AddBinaries(const std::vector<lldb::addr_t> &load_addresses); |
79 | |
80 | void DoClear() override; |
81 | |
82 | bool IsFullyInitialized() override; |
83 | |
84 | static bool |
85 | NotifyBreakpointHit(void *baton, |
86 | lldb_private::StoppointCallbackContext *context, |
87 | lldb::user_id_t break_id, lldb::user_id_t break_loc_id); |
88 | |
89 | lldb::addr_t GetNotificationFuncAddrFromImageInfos(); |
90 | |
91 | bool SetNotificationBreakpoint() override; |
92 | |
93 | void ClearNotificationBreakpoint() override; |
94 | |
95 | void UpdateImageInfosHeaderAndLoadCommands(ImageInfo::collection &image_infos, |
96 | uint32_t infos_count, |
97 | bool update_executable); |
98 | |
99 | lldb::addr_t |
100 | GetDyldLockVariableAddressFromModule(lldb_private::Module *module); |
101 | |
102 | uint32_t m_image_infos_stop_id; // The Stop ID the last time we |
103 | // loaded/unloaded images |
104 | lldb::user_id_t m_break_id; |
105 | lldb::user_id_t m_dyld_handover_break_id; |
106 | mutable std::recursive_mutex m_mutex; |
107 | lldb::addr_t m_maybe_image_infos_address; // If dyld is still maintaining the |
108 | // all_image_infos address, store it |
109 | // here so we can use it to detect |
110 | // exec's when talking to |
111 | // debugservers that don't support |
112 | // the "reason:exec" annotation. |
113 | bool m_libsystem_fully_initalized; |
114 | }; |
115 | |
116 | #endif // LLDB_SOURCE_PLUGINS_DYNAMICLOADER_MACOSX_DYLD_DYNAMICLOADERMACOS_H |
117 | |