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,