Home | History | Annotate | Download | only in POSIX-DYLD
      1 //===-- DynamicLoaderPOSIX.h ------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef liblldb_DynamicLoaderPOSIX_H_
     11 #define liblldb_DynamicLoaderPOSIX_H_
     12 
     13 // C Includes
     14 // C++ Includes
     15 // Other libraries and framework includes
     16 #include "lldb/Breakpoint/StoppointCallbackContext.h"
     17 #include "lldb/Target/DynamicLoader.h"
     18 
     19 #include "DYLDRendezvous.h"
     20 
     21 class AuxVector;
     22 
     23 class DynamicLoaderPOSIXDYLD : public lldb_private::DynamicLoader
     24 {
     25 public:
     26 
     27     static void
     28     Initialize();
     29 
     30     static void
     31     Terminate();
     32 
     33     static lldb_private::ConstString
     34     GetPluginNameStatic();
     35 
     36     static const char *
     37     GetPluginDescriptionStatic();
     38 
     39     static lldb_private::DynamicLoader *
     40     CreateInstance(lldb_private::Process *process, bool force);
     41 
     42     DynamicLoaderPOSIXDYLD(lldb_private::Process *process);
     43 
     44     virtual
     45     ~DynamicLoaderPOSIXDYLD();
     46 
     47     //------------------------------------------------------------------
     48     // DynamicLoader protocol
     49     //------------------------------------------------------------------
     50 
     51     virtual void
     52     DidAttach();
     53 
     54     virtual void
     55     DidLaunch();
     56 
     57     virtual lldb::ThreadPlanSP
     58     GetStepThroughTrampolinePlan(lldb_private::Thread &thread,
     59                                  bool stop_others);
     60 
     61     virtual lldb_private::Error
     62     CanLoadImage();
     63 
     64     //------------------------------------------------------------------
     65     // PluginInterface protocol
     66     //------------------------------------------------------------------
     67     virtual lldb_private::ConstString
     68     GetPluginName();
     69 
     70     virtual uint32_t
     71     GetPluginVersion();
     72 
     73     virtual void
     74     GetPluginCommandHelp(const char *command, lldb_private::Stream *strm);
     75 
     76     virtual lldb_private::Error
     77     ExecutePluginCommand(lldb_private::Args &command, lldb_private::Stream *strm);
     78 
     79     virtual lldb_private::Log *
     80     EnablePluginLogging(lldb_private::Stream *strm, lldb_private::Args &command);
     81 
     82 protected:
     83     /// Runtime linker rendezvous structure.
     84     DYLDRendezvous m_rendezvous;
     85 
     86     /// Virtual load address of the inferior process.
     87     lldb::addr_t m_load_offset;
     88 
     89     /// Virtual entry address of the inferior process.
     90     lldb::addr_t m_entry_point;
     91 
     92     /// Auxiliary vector of the inferior process.
     93     std::unique_ptr<AuxVector> m_auxv;
     94 
     95     /// Rendezvous breakpoint.
     96     lldb::break_id_t m_dyld_bid;
     97 
     98     /// Enables a breakpoint on a function called by the runtime
     99     /// linker each time a module is loaded or unloaded.
    100     void
    101     SetRendezvousBreakpoint();
    102 
    103     /// Callback routine which updates the current list of loaded modules based
    104     /// on the information supplied by the runtime linker.
    105     static bool
    106     RendezvousBreakpointHit(void *baton,
    107                             lldb_private::StoppointCallbackContext *context,
    108                             lldb::user_id_t break_id,
    109                             lldb::user_id_t break_loc_id);
    110 
    111     /// Helper method for RendezvousBreakpointHit.  Updates LLDB's current set
    112     /// of loaded modules.
    113     void
    114     RefreshModules();
    115 
    116     /// Updates the load address of every allocatable section in @p module.
    117     ///
    118     /// @param module The module to traverse.
    119     ///
    120     /// @param base_addr The virtual base address @p module is loaded at.
    121     void
    122     UpdateLoadedSections(lldb::ModuleSP module,
    123                          lldb::addr_t base_addr = 0);
    124 
    125     /// Locates or creates a module given by @p file and updates/loads the
    126     /// resulting module at the virtual base address @p base_addr.
    127     lldb::ModuleSP
    128     LoadModuleAtAddress(const lldb_private::FileSpec &file, lldb::addr_t base_addr);
    129 
    130     /// Resolves the entry point for the current inferior process and sets a
    131     /// breakpoint at that address.
    132     void
    133     ProbeEntry();
    134 
    135     /// Callback routine invoked when we hit the breakpoint on process entry.
    136     ///
    137     /// This routine is responsible for resolving the load addresses of all
    138     /// dependent modules required by the inferior and setting up the rendezvous
    139     /// breakpoint.
    140     static bool
    141     EntryBreakpointHit(void *baton,
    142                        lldb_private::StoppointCallbackContext *context,
    143                        lldb::user_id_t break_id,
    144                        lldb::user_id_t break_loc_id);
    145 
    146     /// Helper for the entry breakpoint callback.  Resolves the load addresses
    147     /// of all dependent modules.
    148     void
    149     LoadAllCurrentModules();
    150 
    151     /// Computes a value for m_load_offset returning the computed address on
    152     /// success and LLDB_INVALID_ADDRESS on failure.
    153     lldb::addr_t
    154     ComputeLoadOffset();
    155 
    156     /// Computes a value for m_entry_point returning the computed address on
    157     /// success and LLDB_INVALID_ADDRESS on failure.
    158     lldb::addr_t
    159     GetEntryPoint();
    160 
    161     /// Checks to see if the target module has changed, updates the target
    162     /// accordingly and returns the target executable module.
    163     lldb::ModuleSP
    164     GetTargetExecutable();
    165 
    166 private:
    167     DISALLOW_COPY_AND_ASSIGN(DynamicLoaderPOSIXDYLD);
    168 };
    169 
    170 #endif  // liblldb_DynamicLoaderPOSIXDYLD_H_
    171