From bd396bff642ca89bc4c169749f721d8652ec8b79 Mon Sep 17 00:00:00 2001 From: Jason Hiser <jdhiser@gmail.com> Date: Mon, 17 Dec 2018 21:40:45 -0500 Subject: [PATCH] updates for arm --- include/ehp.hpp | 4 ++-- src/ehp.cpp | 22 ++++++++++++++-------- src/ehp_priv.hpp | 6 +++--- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/include/ehp.hpp b/include/ehp.hpp index a530905..a37f757 100644 --- a/include/ehp.hpp +++ b/include/ehp.hpp @@ -55,7 +55,7 @@ class EHProgram_t EHProgram_t(const EHProgram_t&) {} public: virtual ~EHProgram_t() {} - virtual void print(const uint64_t start_addr=0) const=0; + virtual void print(const uint64_t start_addr, const int64_t caf) const=0; virtual shared_ptr<EHProgramInstructionVector_t> getInstructions() const =0; }; @@ -74,7 +74,7 @@ class CIEContents_t virtual string getAugmentation() const =0; virtual uint8_t getLSDAEncoding() const =0; virtual uint8_t getFDEEncoding() const =0; - virtual void print() const =0; + virtual void print(const uint64_t startAddr) const =0; }; class LSDACallSiteAction_t diff --git a/src/ehp.cpp b/src/ehp.cpp index 2f2f4fa..81b5bab 100644 --- a/src/ehp.cpp +++ b/src/ehp.cpp @@ -824,14 +824,14 @@ template <int ptrsize> void eh_program_t<ptrsize>::push_insn(const eh_program_insn_t<ptrsize> &i) { instructions.push_back(i); } template <int ptrsize> -void eh_program_t<ptrsize>::print(const uint64_t start_addr) const +void eh_program_t<ptrsize>::print(const uint64_t start_addr, const int64_t caf) const { auto pc=start_addr; cout << " Program: " << endl ; - for_each(instructions.begin(), instructions.end(), [&](const eh_program_insn_t<ptrsize>& i) + for (const auto &i : instructions) { - i.print(pc); - }); + i.print(pc,caf); + } } template <int ptrsize> @@ -1034,7 +1034,7 @@ bool cie_contents_t<ptrsize>::parse_cie( } template <int ptrsize> -void cie_contents_t<ptrsize>::print() const +void cie_contents_t<ptrsize>::print(const uint64_t startAddr) const { cout << "["<<setw(6)<<hex<<cie_position<<"] CIE length="<<dec<<length<<endl; cout << " CIE_id: " << +cie_id << endl; @@ -1050,7 +1050,7 @@ void cie_contents_t<ptrsize>::print() const cout << " lsda_encoding: " << hex << +lsda_encoding << endl; cout << " fde_encoding: " << hex << +fde_encoding << endl; cout << " Program: " << endl ; - eh_pgm.print(); + eh_pgm.print(startAddr,getCAF()); } @@ -1539,6 +1539,7 @@ bool fde_contents_t<ptrsize>::parse_fde( template <int ptrsize> void fde_contents_t<ptrsize>::print() const { + const auto caf=cie_info.getCAF(); cout << "["<<setw(6)<<hex<<fde_position<<"] FDE length="<<dec<<length; cout <<" cie=["<<setw(6)<<hex<<cie_position<<"]"<<endl; @@ -1547,7 +1548,7 @@ void fde_contents_t<ptrsize>::print() const cout<<" FDE End addr: "<<hex<<fde_end_addr<<endl; cout<<" FDE len: "<<dec<<fde_range_len<<endl; cout<<" FDE LSDA: "<<hex<<lsda_addr<<endl; - eh_pgm.print(fde_start_addr); + eh_pgm.print(fde_start_addr, caf); if(getCIE().getLSDAEncoding()!= DW_EH_PE_omit && lsda_addr!=0 /* indicator of nullptr for lsda */) lsda.print(); else @@ -1578,6 +1579,11 @@ bool split_eh_frame_impl_t<ptrsize>::iterate_fdes() if(eh_frame_util_t<ptrsize>::read_length(act_length, position, eh_frame_scoop_data, max)) break; + // length field has to be meaningful, 0 or -1 indicates end of segment + // the exact end-of-segment marker varies platform to platform. + if(act_length==0 || act_length==0xffffffff || act_length == decltype(act_length)(-1)) + break; + auto next_position=position + act_length; auto cie_offset=uint32_t(0); auto cie_offset_position=position; @@ -1639,7 +1645,7 @@ void split_eh_frame_impl_t<ptrsize>::print() const { for_each(cies.begin(), cies.end(), [&](const cie_contents_t<ptrsize> &p) { - p.print(); + p.print(0 /* cie has no start address on its own */); }); for_each(fdes.begin(), fdes.end(), [&](const fde_contents_t<ptrsize> &p) { diff --git a/src/ehp_priv.hpp b/src/ehp_priv.hpp index 11e5883..d8678d3 100644 --- a/src/ehp_priv.hpp +++ b/src/ehp_priv.hpp @@ -88,7 +88,7 @@ class eh_program_insn_t : public EHProgramInstruction_t eh_program_insn_t() ; eh_program_insn_t(const std::string &s) ; - void print(uint64_t &pc, int64_t caf=1) const; + void print(uint64_t &pc, int64_t caf) const; void push_byte(uint8_t c) ; @@ -131,7 +131,7 @@ class eh_program_t : public EHProgram_t public: void push_insn(const eh_program_insn_t<ptrsize> &i); - void print(const uint64_t start_addr=0) const; + void print(const uint64_t start_addr, const int64_t caf) const; bool parse_program( const uint32_t& program_start_position, @@ -186,7 +186,7 @@ class cie_contents_t : public CIEContents_t, private eh_frame_util_t<ptrsize> const uint8_t* const data, const uint32_t max, const uint64_t eh_addr); - void print() const ; + void print(const uint64_t startAddr) const ; }; template <int ptrsize> -- GitLab