diff --git a/include/ehp.hpp b/include/ehp.hpp index 22740c8d71750663280caa4b5612fbcccdf4d40b..14946ff18c364bd6e820f0c173e26de89a045caf 100644 --- a/include/ehp.hpp +++ b/include/ehp.hpp @@ -39,6 +39,7 @@ class EHProgramInstruction_t public: virtual ~EHProgramInstruction_t() {} virtual void print(uint64_t &pc, int64_t caf=1) const = 0; + virtual uint64_t getSize() const = 0; virtual bool isNop() const = 0; virtual bool isDefCFAOffset() const = 0; virtual bool isRestoreState() const = 0; @@ -68,10 +69,14 @@ class CIEContents_t public: virtual ~CIEContents_t() {} virtual const EHProgram_t& getProgram() const =0; + virtual uint64_t getPosition() const = 0; + virtual uint64_t getLength() const = 0; virtual uint64_t getCAF() const =0; virtual int64_t getDAF() const =0; virtual uint64_t getPersonality() const =0; + virtual uint8_t getPersonalityEncoding() const = 0; virtual uint64_t getPersonalityPointerPosition() const = 0; + virtual uint64_t getPersonalityPointerSize() const = 0; virtual uint64_t getReturnRegister() const =0; virtual string getAugmentation() const =0; virtual uint8_t getLSDAEncoding() const =0; @@ -114,8 +119,12 @@ class LSDACallSite_t virtual ~LSDACallSite_t() {} virtual const LSDACallSiteActionVector_t* getActionTable() const =0; virtual uint64_t getCallSiteAddress() const =0; + virtual uint64_t getCallSiteAddressPosition() const = 0; virtual uint64_t getCallSiteEndAddress() const =0; + virtual uint64_t getCallSiteEndAddressPosition() const = 0; virtual uint64_t getLandingPadAddress() const =0; + virtual uint64_t getLandingPadAddressPosition() const = 0; + virtual uint64_t getLandingPadAddressEndPosition() const = 0; virtual void print() const=0; }; @@ -131,8 +140,12 @@ class LSDA_t virtual ~LSDA_t() {} virtual uint8_t getTTEncoding() const =0; virtual void print() const=0; - virtual const CallSiteVector_t* getCallSites() const =0; - virtual const TypeTableVector_t* getTypeTable() const =0; + virtual uint64_t getLandingPadBaseAddress() const = 0; + virtual const CallSiteVector_t* getCallSites() const =0; + virtual uint8_t getCallSiteTableEncoding() const = 0; + virtual const TypeTableVector_t* getTypeTable() const =0; + virtual uint64_t getTypeTableAddress() const = 0; + virtual uint8_t getTypeTableEncoding() const = 0; unique_ptr<LSDA_t> factory(const string lsda_data, const uint64_t lsda_start_addr); }; @@ -144,12 +157,18 @@ class FDEContents_t FDEContents_t(const FDEContents_t&) {} public: virtual ~FDEContents_t() {} + virtual uint64_t getPosition() const =0; virtual uint64_t getStartAddress() const =0; virtual uint64_t getEndAddress() const =0; virtual const CIEContents_t& getCIE() const =0; virtual const EHProgram_t& getProgram() const =0; virtual const LSDA_t* getLSDA() const =0; virtual uint64_t getLSDAAddress() const =0; + virtual uint64_t getStartAddressPosition() const = 0; + virtual uint64_t getEndAddressPosition() const = 0; + virtual uint64_t getEndAddressSize() const = 0; + virtual uint64_t getLSDAAddressPosition() const = 0; + virtual uint64_t getLSDAAddressSize() const = 0; virtual void print() const=0; // move to ostream? toString? }; diff --git a/src/ehp.cpp b/src/ehp.cpp index 4f387e010f75a920640f636ddf1edee1cfa39faf..dda39764dc063bdd470061cf433d8bef87be99b0 100644 --- a/src/ehp.cpp +++ b/src/ehp.cpp @@ -991,12 +991,13 @@ bool cie_contents_t<ptrsize>::parse_cie( } auto personality_encoding=uint8_t(DW_EH_PE_omit); auto personality=uint64_t(0); - auto personality_pointer_position = uint64_t(0); + auto personality_pointer_position=uint64_t(0); + auto personality_pointer_size=uint64_t(0); if(augmentation.find("P") != string::npos) { if(this->read_type(personality_encoding, position, eh_frame_scoop_data, max)) return true; - personality_pointer_position = position + eh_addr; + personality_pointer_position=position; // indirect is OK as a personality encoding, but we don't need to go that far. // we just need to record what's in the CIE, regardless of whether it's the actual @@ -1004,6 +1005,7 @@ bool cie_contents_t<ptrsize>::parse_cie( auto personality_encoding_sans_indirect = personality_encoding&(~DW_EH_PE_indirect); if(this->read_type_with_encoding(personality_encoding_sans_indirect, personality, position, eh_frame_scoop_data, max, eh_addr)) return true; + personality_pointer_size=position - personality_pointer_position; } auto lsda_encoding=uint8_t(DW_EH_PE_omit); @@ -1022,7 +1024,8 @@ bool cie_contents_t<ptrsize>::parse_cie( return true; - c.cie_position=cie_position; + c.cie_position=cie_position +eh_addr; + c.length=length; c.cie_id=cie_id; c.cie_version=cie_version; c.augmentation=augmentation; @@ -1032,7 +1035,8 @@ bool cie_contents_t<ptrsize>::parse_cie( c.augmentation_data_length=augmentation_data_length; c.personality_encoding=personality_encoding; c.personality=personality; - c.personality_pointer_position = personality_pointer_position; + c.personality_pointer_position=personality_pointer_position + eh_addr; + c.personality_pointer_size=personality_pointer_size; c.lsda_encoding=lsda_encoding; c.fde_encoding=fde_encoding; @@ -1211,15 +1215,20 @@ bool lsda_call_site_t<ptrsize>::parse_lcs( const uint64_t landing_pad_base_addr, const uint64_t gcc_except_table_max) { - + call_site_addr_position = pos + data_addr; if(this->read_type_with_encoding(cs_table_encoding, call_site_offset, pos, data, max, data_addr)) return true; call_site_addr=landing_pad_base_addr+call_site_offset; + call_site_end_addr_position = pos + data_addr; + if(this->read_type_with_encoding(cs_table_encoding, call_site_length, pos, data, max, data_addr)) return true; call_site_end_addr=call_site_addr+call_site_length; + landing_pad_addr_position = pos + data_addr; + if(this->read_type_with_encoding(cs_table_encoding, landing_pad_offset, pos, data, max, data_addr)) return true; + landing_pad_addr_end_position = pos + data_addr; // calc the actual addr. if(landing_pad_offset == 0) @@ -1510,15 +1519,17 @@ bool fde_contents_t<ptrsize>::parse_fde( return true; auto fde_start_addr=uint64_t(0); + auto fde_start_addr_position = pos; if(this->read_type_with_encoding(c.getCIE().getFDEEncoding(),fde_start_addr, pos, eh_frame_scoop_data, max, eh_addr)) return true; auto fde_range_len=uint64_t(0); + auto fde_end_addr_position = pos; if(this->read_type_with_encoding(c.getCIE().getFDEEncoding() & 0xf /* drop pc-rel bits */,fde_range_len, pos, eh_frame_scoop_data, max, eh_addr)) return true; auto fde_end_addr=fde_start_addr+fde_range_len; - + auto fde_end_addr_size = pos - fde_end_addr_position; auto augmentation_data_length=uint64_t(0); if(c.getCIE().getAugmentation().find("z") != string::npos) { @@ -1526,10 +1537,13 @@ bool fde_contents_t<ptrsize>::parse_fde( return true; } auto lsda_addr=uint64_t(0); + auto fde_lsda_addr_position = pos; + auto fde_lsda_addr_size = 0; if(c.getCIE().getLSDAEncoding()!= DW_EH_PE_omit) { if(this->read_type_with_encoding(c.getCIE().getLSDAEncoding(), lsda_addr, pos, eh_frame_scoop_data, max, eh_addr)) return true; + fde_lsda_addr_size = pos - fde_lsda_addr_position; if(lsda_addr!=0) if(c.lsda.parse_lsda(lsda_addr,gcc_except_scoop, fde_start_addr)) return true; @@ -1538,7 +1552,7 @@ bool fde_contents_t<ptrsize>::parse_fde( if(c.eh_pgm.parse_program(pos, eh_frame_scoop_data, end_pos)) return true; - c.fde_position=fde_position; + c.fde_position = fde_position + eh_addr; c.cie_position=cie_position; c.length=length; c.id=id; @@ -1546,6 +1560,11 @@ bool fde_contents_t<ptrsize>::parse_fde( c.fde_end_addr=fde_end_addr; c.fde_range_len=fde_range_len; c.lsda_addr=lsda_addr; + c.fde_start_addr_position = fde_start_addr_position + eh_addr; + c.fde_end_addr_position = fde_end_addr_position + eh_addr; + c.fde_lsda_addr_position = fde_lsda_addr_position + eh_addr; + c.fde_end_addr_size = fde_end_addr_size; + c.fde_lsda_addr_size = fde_lsda_addr_size; return false; } diff --git a/src/ehp_priv.hpp b/src/ehp_priv.hpp index 688c7fb954de2e6a1ef400334bc3c7c7dc270585..492edd23a4e5b77fc252bff5638d3e1651e9b7c3 100644 --- a/src/ehp_priv.hpp +++ b/src/ehp_priv.hpp @@ -89,7 +89,7 @@ class eh_program_insn_t : public EHProgramInstruction_t eh_program_insn_t(const string &s) ; void print(uint64_t &pc, int64_t caf) const; - + uint64_t getSize() const { return program_bytes.size(); } void push_byte(uint8_t c) ; static void print_uleb_operand( @@ -166,6 +166,7 @@ class cie_contents_t : public CIEContents_t, private eh_frame_util_t<ptrsize> uint8_t personality_encoding; uint64_t personality; uint64_t personality_pointer_position; + uint64_t personality_pointer_size; uint8_t lsda_encoding; uint8_t fde_encoding; eh_program_t<ptrsize> eh_pgm; @@ -175,10 +176,14 @@ class cie_contents_t : public CIEContents_t, private eh_frame_util_t<ptrsize> cie_contents_t() ; const eh_program_t<ptrsize>& getProgram() const ; + uint64_t getPosition() const { return cie_position; } + uint64_t getLength() const { return length; } uint64_t getCAF() const ; int64_t getDAF() const ; + uint8_t getPersonalityEncoding() const { return personality_encoding; } uint64_t getPersonality() const ; uint64_t getPersonalityPointerPosition() const { return personality_pointer_position; }; + uint64_t getPersonalityPointerSize() const { return personality_pointer_size; }; uint64_t getReturnRegister() const ; string getAugmentation() const ; @@ -244,10 +249,14 @@ class lsda_call_site_t : public LSDACallSite_t, private eh_frame_util_t<ptrsize> private: uint64_t call_site_offset; uint64_t call_site_addr; + uint64_t call_site_addr_position; uint64_t call_site_length; uint64_t call_site_end_addr; + uint64_t call_site_end_addr_position; uint64_t landing_pad_offset; uint64_t landing_pad_addr; + uint64_t landing_pad_addr_position; + uint64_t landing_pad_addr_end_position; uint64_t action; uint64_t action_table_offset; uint64_t action_table_addr; @@ -263,8 +272,12 @@ class lsda_call_site_t : public LSDACallSite_t, private eh_frame_util_t<ptrsize> vector<lsda_call_site_action_t <ptrsize> >& getActionTableInternal() { return action_table; } uint64_t getCallSiteAddress() const { return call_site_addr ; } - uint64_t getCallSiteEndAddress() const { return call_site_end_addr ; } - uint64_t getLandingPadAddress() const { return landing_pad_addr ; } + uint64_t getCallSiteAddressPosition() const { return call_site_addr_position; } + uint64_t getCallSiteEndAddress() const { return call_site_end_addr ; } + uint64_t getCallSiteEndAddressPosition() const { return call_site_end_addr_position; } + uint64_t getLandingPadAddress() const { return landing_pad_addr ; } + uint64_t getLandingPadAddressPosition() const { return landing_pad_addr_position; } + uint64_t getLandingPadAddressEndPosition() const { return landing_pad_addr_end_position; } bool parse_lcs( const uint64_t action_table_start_addr, @@ -326,9 +339,13 @@ class lsda_t : public LSDA_t, private eh_frame_util_t<ptrsize> const uint64_t fde_region_start ); void print() const; - const CallSiteVector_t* getCallSites() const ; - const call_site_table_t<ptrsize> getCallSitesInternal() const { return call_site_table;} - const TypeTableVector_t* getTypeTable() const ; + uint64_t getLandingPadBaseAddress() const { return landing_pad_base_addr; } + const CallSiteVector_t* getCallSites() const ; + uint8_t getCallSiteTableEncoding() const { return cs_table_encoding; } + const call_site_table_t<ptrsize> getCallSitesInternal() const { return call_site_table;} + const TypeTableVector_t* getTypeTable() const ; + uint64_t getTypeTableAddress() const { return type_table_addr; } + uint8_t getTypeTableEncoding() const { return type_table_encoding; } }; @@ -345,7 +362,11 @@ class fde_contents_t : public FDEContents_t, eh_frame_util_t<ptrsize> uint64_t fde_end_addr; uint64_t fde_range_len; uint64_t lsda_addr; - + uint64_t fde_start_addr_position; + uint64_t fde_end_addr_position; + uint64_t fde_end_addr_size; + uint64_t fde_lsda_addr_position; + uint64_t fde_lsda_addr_size; lsda_t<ptrsize> lsda; eh_program_t<ptrsize> eh_pgm; @@ -358,8 +379,8 @@ class fde_contents_t : public FDEContents_t, eh_frame_util_t<ptrsize> fde_start_addr(start_addr), fde_end_addr(end_addr) {} - - + uint64_t getPosition() const { return fde_position; } + uint64_t getLength() const { return length; } uint64_t getStartAddress() const { return fde_start_addr; } uint64_t getEndAddress() const {return fde_end_addr; } @@ -375,7 +396,12 @@ class fde_contents_t : public FDEContents_t, eh_frame_util_t<ptrsize> const LSDA_t* getLSDA() const { return &lsda; } // shared_ptr<LSDA_t>(new lsda_t<ptrsize>(lsda)) ; } const lsda_t<ptrsize>& getLSDAInternal() const { return lsda; } - uint64_t getLSDAAddress() const { return lsda_addr; } + uint64_t getLSDAAddress() const { return lsda_addr; } + uint64_t getStartAddressPosition() const { return fde_start_addr_position; } + uint64_t getEndAddressPosition() const { return fde_end_addr_position; } + uint64_t getEndAddressSize() const { return fde_end_addr_size; } + uint64_t getLSDAAddressPosition() const { return fde_lsda_addr_position; } + uint64_t getLSDAAddressSize() const { return fde_lsda_addr_size; } bool parse_fde( const uint32_t &fde_position,