146 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- MachDYLD.h ----------------------------------------------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| //  Created by Greg Clayton on 6/29/07.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef __MachDYLD_h__
 | |
| #define __MachDYLD_h__
 | |
| 
 | |
| #include "DNBDefs.h"
 | |
| #include "DNBRuntimeAction.h"
 | |
| #include "PThreadMutex.h"
 | |
| #include <map>
 | |
| #include <vector>
 | |
| #include <string>
 | |
| 
 | |
| class DNBBreakpoint;
 | |
| class MachProcess;
 | |
| 
 | |
| class MachDYLD : public DNBRuntimeAction
 | |
| {
 | |
| public:
 | |
|     MachDYLD ();
 | |
|     virtual ~MachDYLD ();
 | |
| 
 | |
|     //------------------------------------------------------------------
 | |
|     // DNBRuntimeAction required functions
 | |
|     //------------------------------------------------------------------
 | |
|     virtual void Initialize(nub_process_t pid);
 | |
|     virtual void ProcessStateChanged(nub_state_t state);
 | |
|     virtual void SharedLibraryStateChanged(DNBExecutableImageInfo *image_infos, nub_size_t num_image_infos);
 | |
| 
 | |
| protected:
 | |
|     bool                CheckForDYLDInMemory();
 | |
|     bool                FoundDYLD() const;
 | |
|     void                Clear();
 | |
|     void                Dump(FILE *f) const;
 | |
|     nub_process_t       ProcessID() const { return m_pid; }
 | |
|     uint32_t            AddrByteSize() const { return m_addr_size; }
 | |
|     nub_size_t          CopyCurrentShlibInfo(DNBExecutableImageInfo **image_infos);
 | |
|     nub_size_t          CopyChangedShlibInfo(DNBExecutableImageInfo **image_infos);
 | |
|     nub_addr_t          GetSharedLibraryHeaderAddress(const char *shlib_path) const;
 | |
|     bool                CheckForDYLDInMemory(nub_addr_t addr);
 | |
|     bool                ReadDYLIBInfo ();
 | |
|     static nub_bool_t   BreakpointHit (nub_process_t pid, nub_thread_t tid, nub_break_t breakID, void *baton);
 | |
|     void                UpdateUUIDs();
 | |
| 
 | |
|     struct DYLIBInfo
 | |
|     {
 | |
|         nub_addr_t      address;    // Address of mach header for this dylib
 | |
|         nub_addr_t      mod_date;    // Modification date for this dylib
 | |
|         std::string     path;        // Resolved path for this dylib
 | |
|         uint8_t         uuid[16];    // UUID for this dylib if it has one, else all zeros
 | |
|         std::vector<DNBSegment> segments;    // All segment vmaddr and vmsize pairs for this executable (from memory of inferior)
 | |
| 
 | |
|         DYLIBInfo() :
 | |
|             address(INVALID_NUB_ADDRESS),
 | |
|             mod_date(0),
 | |
|             path(),
 | |
|             segments()
 | |
|         {
 | |
|             memset(uuid, 0, 16);
 | |
|         }
 | |
| 
 | |
|         void Clear()
 | |
|         {
 | |
|             address = INVALID_NUB_ADDRESS;
 | |
|             mod_date = 0;
 | |
|             path.clear();
 | |
|             segments.clear();
 | |
|             memset(uuid, 0, 16);
 | |
|         }
 | |
| 
 | |
|         bool operator == (const DYLIBInfo& rhs) const
 | |
|         {
 | |
|             return    address        == rhs.address
 | |
|                  && mod_date    == rhs.mod_date
 | |
|                  && path        == rhs.path
 | |
|                  && memcmp(uuid, rhs.uuid, 16) == 0;
 | |
|         }
 | |
|         bool UUIDValid() const
 | |
|         {
 | |
|             return  uuid[ 0] || uuid[ 1] || uuid[ 2] || uuid[ 3] ||
 | |
|                     uuid[ 4] || uuid[ 5] || uuid[ 6] || uuid[ 7] ||
 | |
|                     uuid[ 8] || uuid[ 9] || uuid[10] || uuid[11] ||
 | |
|                     uuid[12] || uuid[13] || uuid[14] || uuid[15];
 | |
|         }
 | |
| 
 | |
|         void Dump(FILE *f) const;
 | |
|         typedef std::vector<DYLIBInfo> collection;
 | |
|         typedef collection::iterator iterator;
 | |
|         typedef collection::const_iterator const_iterator;
 | |
|     };
 | |
|     struct InfoHeader
 | |
|     {
 | |
|         uint32_t    version;        /* == 1 in Mac OS X 10.4, == 2 in Mac OS 10.5 */
 | |
|         uint32_t    dylib_info_count;
 | |
|         nub_addr_t  dylib_info_addr;
 | |
|         nub_addr_t  notification;
 | |
|         bool        processDetachedFromSharedRegion;
 | |
| 
 | |
|         InfoHeader() :
 | |
|             version(0),
 | |
|             dylib_info_count(0),
 | |
|             dylib_info_addr(INVALID_NUB_ADDRESS),
 | |
|             notification(INVALID_NUB_ADDRESS),
 | |
|             processDetachedFromSharedRegion(false)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         void Clear()
 | |
|         {
 | |
|             version = 0;
 | |
|             dylib_info_count = 0;
 | |
|             dylib_info_addr = INVALID_NUB_ADDRESS;
 | |
|             notification = INVALID_NUB_ADDRESS;
 | |
|             processDetachedFromSharedRegion = false;
 | |
|         }
 | |
| 
 | |
|         bool IsValid() const
 | |
|         {
 | |
|             return version == 1 || version == 2;
 | |
|         }
 | |
|     };
 | |
|     static nub_size_t   CopySharedLibraryInfo(DYLIBInfo::collection& dylib_coll, DNBExecutableImageInfo **image_infos);
 | |
|     static nub_size_t   CopySharedInfoCallback(nub_process_t pid, struct DNBExecutableImageInfo **image_infos, nub_bool_t only_changed, void *baton);
 | |
|     nub_process_t       m_pid;
 | |
|     uint32_t            m_addr_size;
 | |
|     nub_addr_t              m_dyld_addr;
 | |
|     nub_addr_t              m_dyld_all_image_infos_addr;
 | |
|     InfoHeader              m_dylib_info_header;
 | |
|     DYLIBInfo::collection   m_current_dylibs;    // Current shared libraries information
 | |
|     DYLIBInfo::collection   m_changed_dylibs;    // Shared libraries that changed since last shared library update
 | |
|     nub_break_t             m_notify_break_id;
 | |
|     mutable PThreadMutex    m_dyld_info_mutex;
 | |
| };
 | |
| 
 | |
| #endif // #ifndef __MachDYLD_h__
 |