forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			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__
 |