From ce74a798dd7365300dd26fafbd3a57f2d928fd3b Mon Sep 17 00:00:00 2001 From: Antonio Flores Montoya <afloresmontoya@grammatech.com> Date: Mon, 29 Jul 2019 11:47:13 -0400 Subject: [PATCH] collect additional pointer locations --- include/ehp.hpp | 4 ++++ src/ehp.cpp | 5 +++++ src/ehp_priv.hpp | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/include/ehp.hpp b/include/ehp.hpp index 14946ff..08446f0 100644 --- a/include/ehp.hpp +++ b/include/ehp.hpp @@ -142,9 +142,13 @@ class LSDA_t virtual void print() const=0; virtual uint64_t getLandingPadBaseAddress() const = 0; virtual const CallSiteVector_t* getCallSites() const =0; + virtual uint64_t getCallSiteTableAddress() const = 0; + virtual uint64_t getCallSiteTableAddressLocation() const = 0; virtual uint8_t getCallSiteTableEncoding() const = 0; virtual const TypeTableVector_t* getTypeTable() const =0; virtual uint64_t getTypeTableAddress() const = 0; + virtual uint64_t getTypeTableAddressLocation() const = 0; + virtual uint64_t getCallSiteTableLength() const = 0; virtual uint8_t getTypeTableEncoding() const = 0; unique_ptr<LSDA_t> factory(const string lsda_data, const uint64_t lsda_start_addr); }; diff --git a/src/ehp.cpp b/src/ehp.cpp index dda3976..9415e23 100644 --- a/src/ehp.cpp +++ b/src/ehp.cpp @@ -1348,17 +1348,22 @@ bool lsda_t<ptrsize>::parse_lsda( auto type_table_pos=0; if(type_table_encoding!=DW_EH_PE_omit) { + type_table_addr_location = pos + data_addr; if(this->read_uleb128(type_table_offset, pos, (const uint8_t* const)data.data(), max)) return true; type_table_addr=lsda_addr+type_table_offset+(pos-start_pos); type_table_pos=pos+type_table_offset; } else + { type_table_addr=0; + type_table_addr_location=0; + } if(this->read_type(cs_table_encoding, pos, (const uint8_t* const)data.data(), max)) return true; + cs_table_start_addr_location = pos + data_addr; if(this->read_uleb128(cs_table_length, pos, (const uint8_t* const)data.data(), max)) return true; diff --git a/src/ehp_priv.hpp b/src/ehp_priv.hpp index 492edd2..735bbde 100644 --- a/src/ehp_priv.hpp +++ b/src/ehp_priv.hpp @@ -309,9 +309,11 @@ class lsda_t : public LSDA_t, private eh_frame_util_t<ptrsize> uint8_t type_table_encoding; uint64_t type_table_offset; uint64_t type_table_addr; + uint64_t type_table_addr_location; uint8_t cs_table_encoding; uint64_t cs_table_start_offset; uint64_t cs_table_start_addr; + uint64_t cs_table_start_addr_location; uint64_t cs_table_length; uint64_t cs_table_end_addr; uint64_t action_table_start_addr; @@ -341,10 +343,14 @@ class lsda_t : public LSDA_t, private eh_frame_util_t<ptrsize> void print() const; uint64_t getLandingPadBaseAddress() const { return landing_pad_base_addr; } const CallSiteVector_t* getCallSites() const ; + uint64_t getCallSiteTableAddress() const { return cs_table_start_addr; } + uint64_t getCallSiteTableAddressLocation() const { return cs_table_start_addr_location; } + uint64_t getCallSiteTableLength() const { return cs_table_length; } 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; } + uint64_t getTypeTableAddressLocation() const { return type_table_addr_location; } uint8_t getTypeTableEncoding() const { return type_table_encoding; } }; -- GitLab