12341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===-- DYLDRendezvous.h ----------------------------------------*- C++ -*-===// 22341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 32341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// The LLVM Compiler Infrastructure 42341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 52341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// This file is distributed under the University of Illinois Open Source 62341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// License. See LICENSE.TXT for details. 72341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 82341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===----------------------------------------------------------------------===// 92341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#ifndef liblldb_Rendezvous_H_ 112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define liblldb_Rendezvous_H_ 122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C Includes 142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C++ Includes 152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include <list> 162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include <string> 172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Other libraries and framework includes 192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/lldb-defines.h" 202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/lldb-types.h" 212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chennamespace lldb_private { 232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass Process; 242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// @class DYLDRendezvous 272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// @brief Interface to the runtime linker. 282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// 292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// A structure is present in a processes memory space which is updated by the 302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// runtime liker each time a module is loaded or unloaded. This class provides 312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// an interface to this structure and maintains a consistent snapshot of the 322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// currently loaded modules. 332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass DYLDRendezvous { 342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // This structure is used to hold the contents of the debug rendezvous 362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // information (struct r_debug) as found in the inferiors memory. Note that 372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // the layout of this struct is not binary compatible, it is simply large 382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // enough to hold the information on both 32 and 64 bit platforms. 392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen struct Rendezvous { 402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen uint64_t version; 412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t map_addr; 422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t brk; 432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen uint64_t state; 442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t ldbase; 452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen Rendezvous() 472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen : version(0), map_addr(0), brk(0), state(0), ldbase(0) { } 482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen }; 492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenpublic: 512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DYLDRendezvous(lldb_private::Process *process); 522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Update the internal snapshot of runtime linker rendezvous and recompute 542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// the currently loaded modules. 552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// 562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// This method should be called once one start up, then once each time the 572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// runtime linker enters the function given by GetBreakAddress(). 582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// 592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @returns true on success and false on failure. 602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// 612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @see GetBreakAddress(). 622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool 632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen Resolve(); 642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @returns true if this rendezvous has been located in the inferiors 662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// address space and false otherwise. 672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool 682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen IsValid(); 692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @returns the address of the rendezvous structure in the inferiors 712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// address space. 722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t 732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetRendezvousAddress() const { return m_rendezvous_addr; } 742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @returns the version of the rendezvous protocol being used. 7636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint64_t 772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetVersion() const { return m_current.version; } 782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @returns address in the inferiors address space containing the linked 802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// list of shared object descriptors. 812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t 822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetLinkMapAddress() const { return m_current.map_addr; } 832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// A breakpoint should be set at this address and Resolve called on each 852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// hit. 862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// 872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @returns the address of a function called by the runtime linker each 882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// time a module is loaded/unloaded, or about to be loaded/unloaded. 892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// 902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @see Resolve() 912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t 922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetBreakAddress() const { return m_current.brk; } 932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Returns the current state of the rendezvous structure. 9536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint64_t 962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetState() const { return m_current.state; } 972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @returns the base address of the runtime linker in the inferiors address 992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// space. 1002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t 1012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetLDBase() const { return m_current.ldbase; } 1022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @returns true if modules have been loaded into the inferior since the 1042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// last call to Resolve(). 1052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool 1062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ModulesDidLoad() const { return !m_added_soentries.empty(); } 1072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @returns true if modules have been unloaded from the inferior since the 1092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// last call to Resolve(). 1102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool 1112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ModulesDidUnload() const { return !m_removed_soentries.empty(); } 1122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void 114952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton DumpToLog(lldb_private::Log *log) const; 1152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @brief Constants describing the state of the rendezvous. 1172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// 1182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @see GetState(). 1192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen enum RendezvousState { 1202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen eConsistent, 1212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen eAdd, 1222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen eDelete 1232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen }; 1242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @brief Structure representing the shared objects currently loaded into 1262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// the inferior process. 1272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// 1282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// This object is a rough analogue to the struct link_map object which 1292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// actually lives in the inferiors memory. 1302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen struct SOEntry { 1312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t base_addr; ///< Base address of the loaded object. 1322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t path_addr; ///< String naming the shared object. 1332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t dyn_addr; ///< Dynamic section of shared object. 1342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t next; ///< Address of next so_entry. 1352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t prev; ///< Address of previous so_entry. 1362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen std::string path; ///< File name of shared object. 1372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen SOEntry() { clear(); } 1392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool operator ==(const SOEntry &entry) { 1412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return this->path == entry.path; 1422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 1432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void clear() { 1452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen base_addr = 0; 1462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen path_addr = 0; 1472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen dyn_addr = 0; 1482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen next = 0; 1492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen prev = 0; 1502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen path.clear(); 1512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 1522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen }; 1532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenprotected: 1552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen typedef std::list<SOEntry> SOEntryList; 1562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenpublic: 1582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen typedef SOEntryList::const_iterator iterator; 1592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Iterators over all currently loaded modules. 1612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen iterator begin() const { return m_soentries.begin(); } 1622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen iterator end() const { return m_soentries.end(); } 1632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Iterators over all modules loaded into the inferior since the last call 1652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// to Resolve(). 1662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen iterator loaded_begin() const { return m_added_soentries.begin(); } 1672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen iterator loaded_end() const { return m_added_soentries.end(); } 1682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Iterators over all modules unloaded from the inferior since the last 1702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// call to Resolve(). 1712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen iterator unloaded_begin() const { return m_removed_soentries.begin(); } 1722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen iterator unloaded_end() const { return m_removed_soentries.end(); } 1732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenprotected: 1752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Process *m_process; 1762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // Cached copy of executable pathname 1782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen char m_exe_path[PATH_MAX]; 1792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Location of the r_debug structure in the inferiors address space. 1812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t m_rendezvous_addr; 1822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Current and previous snapshots of the rendezvous structure. 1842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen Rendezvous m_current; 1852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen Rendezvous m_previous; 1862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// List of SOEntry objects corresponding to the current link map state. 1882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen SOEntryList m_soentries; 1892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// List of SOEntry's added to the link map since the last call to Resolve(). 1912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen SOEntryList m_added_soentries; 1922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// List of SOEntry's removed from the link map since the last call to 1942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Resolve(). 1952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen SOEntryList m_removed_soentries; 1962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Reads @p size bytes from the inferiors address space starting at @p 1982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// addr. 1992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// 2002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// @returns addr + size if the read was successful and false otherwise. 2012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t 2022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ReadMemory(lldb::addr_t addr, void *dst, size_t size); 2032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Reads a null-terminated C string from the memory location starting at @p 2052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// addr. 2062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen std::string 2072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ReadStringFromMemory(lldb::addr_t addr); 2082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Reads an SOEntry starting at @p addr. 2102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool 2112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ReadSOEntryFromMemory(lldb::addr_t addr, SOEntry &entry); 2122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Updates the current set of SOEntries, the set of added entries, and the 2142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// set of removed entries. 2152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool 2162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen UpdateSOEntries(); 2172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool 2192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen UpdateSOEntriesForAddition(); 2202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool 2222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen UpdateSOEntriesForDeletion(); 2232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// Reads the current list of shared objects according to the link map 2252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen /// supplied by the runtime linker. 2262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool 2272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen TakeSnapshot(SOEntryList &entry_list); 2282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}; 2292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif 231