From be60b5be0e531c9a2c8f30eef03f4a598ec11854 Mon Sep 17 00:00:00 2001 From: Matthew McGill <mm8bx@mega-techx41.maas> Date: Mon, 9 Jul 2018 19:26:17 +0000 Subject: [PATCH] Marking push64/32-bit and data_to_insn_ptr targets as unpinned in IR builder Former-commit-id: 05856b93444497e07a504e36d70584e86f9c7b94 --- libIRDB/test/fill_in_indtargs.cpp | 17 +++++++++++++++++ libIRDB/test/fix_calls.cpp | 2 ++ 2 files changed, 19 insertions(+) diff --git a/libIRDB/test/fill_in_indtargs.cpp b/libIRDB/test/fill_in_indtargs.cpp index 6628eb46d..54545f177 100644 --- a/libIRDB/test/fill_in_indtargs.cpp +++ b/libIRDB/test/fill_in_indtargs.cpp @@ -2344,6 +2344,11 @@ void unpin_elf_tables(FileIR_t *firp, int64_t do_unpin_opt) if(getenv("UNPIN_VERBOSE")!=0) cout<<"Unpinning "+scoop->GetName()+" entry at offset "<<dec<<i<<endl; + // mark as unpinned + if(insn->GetIndirectBranchTargetAddress()!=NULL) + { + insn->GetIndirectBranchTargetAddress()->SetVirtualOffset(0); + } } } else @@ -2451,6 +2456,12 @@ void unpin_elf_tables(FileIR_t *firp, int64_t do_unpin_opt) // add reloc to IR. firp->GetRelocations().insert(nr); scoop->GetRelocations().insert(nr); + + // mark as unpinned + if(insn->GetIndirectBranchTargetAddress()!=NULL) + { + insn->GetIndirectBranchTargetAddress()->SetVirtualOffset(0); + } } else { @@ -2603,6 +2614,12 @@ void unpin_type3_switchtable(FileIR_t* firp,Instruction_t* insn,DataScoop_t* sco // remove rodata reference for hell nodes. targets[table_entry]=newprov; switch_targs.insert(ibt); + + // mark as unpinned + if(ibt->GetIndirectBranchTargetAddress()!=NULL) + { + ibt->GetIndirectBranchTargetAddress()->SetVirtualOffset(0); + } } } } diff --git a/libIRDB/test/fix_calls.cpp b/libIRDB/test/fix_calls.cpp index 2510b4df5..ff35805b0 100644 --- a/libIRDB/test/fix_calls.cpp +++ b/libIRDB/test/fix_calls.cpp @@ -637,6 +637,8 @@ void fix_call(Instruction_t* insn, FileIR_t *firp, bool can_unpin) cout<<"Setting unpin for type="<< reloc->GetType()<< " address=" <<hex<<insn->GetBaseID()<<":"<<insn->getDisassembly()<<endl; } + // set newindirtarg as unpinned IBT + newindirtarg->GetIndirectBranchTargetAddress()->SetVirtualOffset(0); reloc->SetWRT(newindirtarg); } } -- GitLab