diff --git a/include/ehp.hpp b/include/ehp.hpp index 4301bb1e839d6ced3c63174437f9a2bab3f1e613..0dd31dd50b255d8239d715414bda7c97fecfe6dc 100644 --- a/include/ehp.hpp +++ b/include/ehp.hpp @@ -147,6 +147,7 @@ class EHFrameParser_t virtual void print() const=0; virtual const shared_ptr<FDEVector_t> getFDEs() const =0; virtual const shared_ptr<CIEVector_t> getCIEs() const =0; + virtual const shared_ptr<FDEContents_t> findFDE(uint64_t addr) const =0; static unique_ptr<const EHFrameParser_t> factory(const string filename); static unique_ptr<const EHFrameParser_t> factory( diff --git a/src/ehp.cpp b/src/ehp.cpp index ddb1ac73ed8200fa591a1487e40f7d9c710b4595..2961e3b9b344bd376daff5125d0d556a0229e82c 100644 --- a/src/ehp.cpp +++ b/src/ehp.cpp @@ -1675,8 +1675,16 @@ const shared_ptr<CIEVector_t> split_eh_frame_impl_t<ptrsize>::getCIEs() const [](const cie_contents_t<ptrsize> &a){ return shared_ptr<CIEContents_t>(new cie_contents_t<ptrsize>(a));}); return ret; } - +template <int ptrsize> +const shared_ptr<FDEContents_t> split_eh_frame_impl_t<ptrsize>::findFDE(uint64_t addr) const +{ + + const auto tofind=fde_contents_t<ptrsize>( addr, addr+1); + const auto fde_it=fdes.find(tofind); + const auto raw_ret_ptr = (fde_it==fdes.end()) ? nullptr : new fde_contents_t<ptrsize>(*fde_it); + return shared_ptr<FDEContents_t>(raw_ret_ptr); +} unique_ptr<const EHFrameParser_t> EHFrameParser_t::factory(const string filename) { diff --git a/src/ehp_priv.hpp b/src/ehp_priv.hpp index e6bc9228c44d942fa4d197cd831d4a38f750aaf6..1f6c53d1bf812a5305c692dbf7d628f565a7a8d6 100644 --- a/src/ehp_priv.hpp +++ b/src/ehp_priv.hpp @@ -403,6 +403,8 @@ class split_eh_frame_impl_t : public EHFrameParser_t virtual const shared_ptr<FDEVector_t> getFDEs() const; virtual const shared_ptr<CIEVector_t> getCIEs() const; + virtual const shared_ptr<FDEContents_t> findFDE(uint64_t addr) const; + };