diff --git a/libIRDB/test/fill_in_indtargs.cpp b/libIRDB/test/fill_in_indtargs.cpp index 6628eb46d3c8b5ee03228f40b8472bac09119c83..54545f177ba287c210b45dd9b8bd3f1ccd838b65 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 2510b4df5f0dceea272d30b3cfeeff0dfbbd59b9..ff35805b0deb0f3b318f19a4f99f1f9ad7f17e8c 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); } }