diff options
Diffstat (limited to 'source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h')
| -rw-r--r-- | source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h | 303 | 
1 files changed, 303 insertions, 0 deletions
| diff --git a/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h b/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h new file mode 100644 index 0000000000000..fd33cd3d32f8f --- /dev/null +++ b/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h @@ -0,0 +1,303 @@ +//===-- ObjectFilePECOFF.h --------------------------------------*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_ObjectFilePECOFF_h_ +#define liblldb_ObjectFilePECOFF_h_ + +// C Includes +// C++ Includes +#include <vector> + +// Other libraries and framework includes +// Project includes +#include "lldb/Symbol/ObjectFile.h" + +class ObjectFilePECOFF :  +    public lldb_private::ObjectFile +{ +public: +    typedef enum MachineType +    { +        MachineUnknown = 0x0, +        MachineAm33 = 0x1d3, +        MachineAmd64 = 0x8664, +        MachineArm = 0x1c0, +        MachineArmNt = 0x1c4, +        MachineArm64 = 0xaa64, +        MachineEbc = 0xebc, +        MachineX86 = 0x14c, +        MachineIA64 = 0x200, +        MachineM32R = 0x9041, +        MachineMips16 = 0x266, +        MachineMipsFpu = 0x366, +        MachineMipsFpu16 = 0x466, +        MachinePowerPc = 0x1f0, +        MachinePowerPcfp = 0x1f1, +        MachineR4000 = 0x166, +        MachineSh3 = 0x1a2, +        MachineSh3dsp = 0x1a3, +        MachineSh4 = 0x1a6, +        MachineSh5 = 0x1a8, +        MachineThumb = 0x1c2, +        MachineWcemIpsv2 = 0x169 +    } MachineType; +     +    ObjectFilePECOFF(const lldb::ModuleSP &module_sp, +                     lldb::DataBufferSP& data_sp, +                     lldb::offset_t data_offset, +                     const lldb_private::FileSpec* file, +                     lldb::offset_t file_offset, +                     lldb::offset_t length); + +    ~ObjectFilePECOFF() override; + +    //------------------------------------------------------------------ +    // Static Functions +    //------------------------------------------------------------------ +    static void +    Initialize(); +     +    static void +    Terminate(); +     +    static lldb_private::ConstString +    GetPluginNameStatic(); +     +    static const char * +    GetPluginDescriptionStatic(); +     +    static ObjectFile * +    CreateInstance (const lldb::ModuleSP &module_sp, +                    lldb::DataBufferSP& data_sp, +                    lldb::offset_t data_offset, +                    const lldb_private::FileSpec* file, +                    lldb::offset_t offset, +                    lldb::offset_t length); +     +    static lldb_private::ObjectFile * +    CreateMemoryInstance (const lldb::ModuleSP &module_sp,  +                          lldb::DataBufferSP& data_sp,  +                          const lldb::ProcessSP &process_sp,  +                          lldb::addr_t header_addr); +     +    static size_t +    GetModuleSpecifications (const lldb_private::FileSpec& file, +                             lldb::DataBufferSP& data_sp, +                             lldb::offset_t data_offset, +                             lldb::offset_t file_offset, +                             lldb::offset_t length, +                             lldb_private::ModuleSpecList &specs); + +    static bool +    SaveCore (const lldb::ProcessSP &process_sp, +              const lldb_private::FileSpec &outfile, +              lldb_private::Error &error); + +    static bool +    MagicBytesMatch (lldb::DataBufferSP& data_sp); +     +    bool +    ParseHeader() override; +     +    bool +    SetLoadAddress(lldb_private::Target &target, lldb::addr_t value, bool value_is_offset) override; + +    lldb::ByteOrder +    GetByteOrder() const override; +     +    bool +    IsExecutable() const override; +     +    uint32_t +    GetAddressByteSize() const override; +     +//    virtual lldb_private::AddressClass +//    GetAddressClass (lldb::addr_t file_addr); + +    lldb_private::Symtab * +    GetSymtab() override; +     +    bool +    IsStripped() override; + +    void +    CreateSections(lldb_private::SectionList &unified_section_list) override; +     +    void +    Dump(lldb_private::Stream *s) override; +     +    bool +    GetArchitecture(lldb_private::ArchSpec &arch) override; +     +    bool +    GetUUID(lldb_private::UUID* uuid) override; +     +    uint32_t +    GetDependentModules(lldb_private::FileSpecList& files) override; +     +//    virtual lldb_private::Address +//    GetEntryPointAddress (); +     +    ObjectFile::Type +    CalculateType() override; +     +    ObjectFile::Strata +    CalculateStrata() override; +     +    //------------------------------------------------------------------ +    // PluginInterface protocol +    //------------------------------------------------------------------ +    lldb_private::ConstString +    GetPluginName() override; +     +    uint32_t +    GetPluginVersion() override; + +protected: +	bool NeedsEndianSwap() const;     +     +	typedef struct dos_header  {  // DOS .EXE header +		uint16_t e_magic;         // Magic number +		uint16_t e_cblp;          // Bytes on last page of file +		uint16_t e_cp;            // Pages in file +		uint16_t e_crlc;          // Relocations +		uint16_t e_cparhdr;       // Size of header in paragraphs +		uint16_t e_minalloc;      // Minimum extra paragraphs needed +		uint16_t e_maxalloc;      // Maximum extra paragraphs needed +		uint16_t e_ss;            // Initial (relative) SS value +		uint16_t e_sp;            // Initial SP value +		uint16_t e_csum;          // Checksum +		uint16_t e_ip;            // Initial IP value +		uint16_t e_cs;            // Initial (relative) CS value +		uint16_t e_lfarlc;        // File address of relocation table +		uint16_t e_ovno;          // Overlay number +		uint16_t e_res[4];        // Reserved words +		uint16_t e_oemid;         // OEM identifier (for e_oeminfo) +		uint16_t e_oeminfo;       // OEM information; e_oemid specific +		uint16_t e_res2[10];      // Reserved words +		uint32_t e_lfanew;        // File address of new exe header +    } dos_header_t; +     +	typedef struct coff_header { +		uint16_t machine; +		uint16_t nsects; +		uint32_t modtime; +		uint32_t symoff; +		uint32_t nsyms; +		uint16_t hdrsize; +		uint16_t flags; +	} coff_header_t; +     +	typedef struct data_directory { +		uint32_t vmaddr; +		uint32_t vmsize; +	} data_directory_t; +     +	typedef struct coff_opt_header  +	{ +		uint16_t	magic; +		uint8_t		major_linker_version; +		uint8_t		minor_linker_version; +		uint32_t	code_size; +		uint32_t	data_size; +		uint32_t	bss_size; +		uint32_t	entry; +		uint32_t	code_offset; +		uint32_t	data_offset; +         +		uint64_t	image_base; +		uint32_t	sect_alignment; +		uint32_t	file_alignment; +		uint16_t	major_os_system_version; +		uint16_t	minor_os_system_version; +		uint16_t	major_image_version; +		uint16_t	minor_image_version; +		uint16_t	major_subsystem_version; +		uint16_t	minor_subsystem_version; +		uint32_t	reserved1; +		uint32_t	image_size; +		uint32_t	header_size; +		uint32_t	checksum; +		uint16_t	subsystem; +		uint16_t	dll_flags; +		uint64_t	stack_reserve_size; +		uint64_t	stack_commit_size; +		uint64_t	heap_reserve_size; +		uint64_t	heap_commit_size; +		uint32_t	loader_flags; +        //    uint32_t	num_data_dir_entries; +		std::vector<data_directory> data_dirs;	// will contain num_data_dir_entries entries +	} coff_opt_header_t; + +    typedef enum coff_data_dir_type +    { +        coff_data_dir_export_table = 0, +        coff_data_dir_import_table = 1, +    } coff_data_dir_type; +     +	typedef struct section_header { +		char		name[8]; +		uint32_t	vmsize;	// Virtual Size +		uint32_t	vmaddr;	// Virtual Addr +		uint32_t	size;	// File size +		uint32_t	offset;	// File offset +		uint32_t	reloff;	// Offset to relocations +		uint32_t	lineoff;// Offset to line table entries +		uint16_t	nreloc;	// Number of relocation entries +		uint16_t	nline;	// Number of line table entries +		uint32_t	flags; +	} section_header_t; +     +	typedef struct coff_symbol { +		char		name[8]; +		uint32_t	value; +		uint16_t	sect; +		uint16_t	type; +		uint8_t		storage; +		uint8_t		naux;		 +	} coff_symbol_t; + +    typedef struct export_directory_entry { +        uint32_t   characteristics; +        uint32_t   time_date_stamp; +        uint16_t   major_version; +        uint16_t   minor_version; +        uint32_t   name; +        uint32_t   base; +        uint32_t   number_of_functions; +        uint32_t   number_of_names; +        uint32_t   address_of_functions; +        uint32_t   address_of_names; +        uint32_t   address_of_name_ordinals; +    } export_directory_entry; +     +	static bool ParseDOSHeader (lldb_private::DataExtractor &data, dos_header_t &dos_header); +	static bool ParseCOFFHeader (lldb_private::DataExtractor &data, lldb::offset_t *offset_ptr, coff_header_t &coff_header); +	bool ParseCOFFOptionalHeader (lldb::offset_t *offset_ptr); +	bool ParseSectionHeaders (uint32_t offset); +	 +	static	void DumpDOSHeader(lldb_private::Stream *s, const dos_header_t& header); +	static	void DumpCOFFHeader(lldb_private::Stream *s, const coff_header_t& header); +	static	void DumpOptCOFFHeader(lldb_private::Stream *s, const coff_opt_header_t& header); +    void DumpSectionHeaders(lldb_private::Stream *s); +    void DumpSectionHeader(lldb_private::Stream *s, const section_header_t& sh); +    bool GetSectionName(std::string& sect_name, const section_header_t& sect); +     +	typedef std::vector<section_header_t>		SectionHeaderColl; +	typedef SectionHeaderColl::iterator			SectionHeaderCollIter; +	typedef SectionHeaderColl::const_iterator	SectionHeaderCollConstIter; +private: +	dos_header_t		m_dos_header; +	coff_header_t		m_coff_header; +	coff_opt_header_t	m_coff_header_opt; +	SectionHeaderColl	m_sect_headers; +    lldb::addr_t		m_image_base; +}; + +#endif // liblldb_ObjectFilePECOFF_h_ | 
