Skip to content
Snippets Groups Projects
Commit 59b7b906 authored by Jason Hiser's avatar Jason Hiser :tractor:
Browse files

added file-base conversion factor into absptr. may need it for others in the future

parent c129d094
No related branches found
No related tags found
No related merge requests found
...@@ -149,34 +149,47 @@ void UnpinX86_t::HandlePcrelReloc(Instruction_t* from_insn, Relocation_t* reloc) ...@@ -149,34 +149,47 @@ void UnpinX86_t::HandlePcrelReloc(Instruction_t* from_insn, Relocation_t* reloc)
void UnpinX86_t::HandleAbsptrReloc(Instruction_t* from_insn, Relocation_t* reloc) void UnpinX86_t::HandleAbsptrReloc(Instruction_t* from_insn, Relocation_t* reloc)
{ {
// decode the instruction
const auto disasm=DecodedInstruction_t::factory(from_insn); const auto disasm=DecodedInstruction_t::factory(from_insn);
const auto operands=disasm->getOperands(); const auto operands=disasm->getOperands();
// find the memory operand
// push/pop from memory might have a memory operand with no string to represent the implicit stack operand. // push/pop from memory might have a memory operand with no string to represent the implicit stack operand.
const auto the_arg_it=find_if(ALLOF(operands),[](const shared_ptr<DecodedOperand_t>& op){ return op->isMemory() && op->getString()!=""; }); const auto the_arg_it=find_if(ALLOF(operands),[](const shared_ptr<DecodedOperand_t>& op){ return op->isMemory() && op->getString()!=""; });
DataScoop_t* wrt=dynamic_cast<DataScoop_t*>(reloc->getWRT()); const auto wrt=dynamic_cast<DataScoop_t*>(reloc->getWRT());
// assert we found the right thing
assert(wrt); assert(wrt);
assert(the_arg_it!=operands.end()); assert(the_arg_it!=operands.end());
const auto &the_arg=*the_arg_it; const auto &the_arg=*the_arg_it;
int disp_offset=disasm->getMemoryDisplacementOffset(the_arg.get(),from_insn); // extract the info about where the displacement encoding is
int disp_size=the_arg->getMemoryDisplacementEncodingSize(); const auto disp_offset = uint32_t(disasm->getMemoryDisplacementOffset(the_arg.get(),from_insn));
const auto disp_size = uint32_t(the_arg->getMemoryDisplacementEncodingSize());
assert(disp_size==4); assert(disp_size==4);
assert(0<disp_offset && (int64_t)disp_offset<=(int64_t)from_insn->getDataBits().size() - disp_size); assert(0<disp_offset && (int64_t)disp_offset<=(int64_t)from_insn->getDataBits().size() - disp_size);
assert(reloc->getWRT()); assert(reloc->getWRT());
unsigned int new_disp=the_arg->getMemoryDisplacement() + wrt->getStart()->getVirtualOffset(); // calculate the new displcement
const auto new_disp=uint32_t(the_arg->getMemoryDisplacement() + wrt->getStart()->getVirtualOffset() + reloc->getAddend() - firp.getArchitecture()->getFileBase());
// update the instruction
from_insn->setDataBits(from_insn->getDataBits().replace(disp_offset, disp_size, (char*)&new_disp, disp_size)); from_insn->setDataBits(from_insn->getDataBits().replace(disp_offset, disp_size, (char*)&new_disp, disp_size));
// update the instruction in the memory space. // update the instruction in the memory space.
IRDB_SDK::VirtualOffset_t from_insn_location=locMap[from_insn]; const auto from_insn_location=locMap[from_insn];
for(unsigned int i=0;i<from_insn->getDataBits().size();i++) for(unsigned int i=0;i<from_insn->getDataBits().size();i++)
{ {
unsigned char newbyte=from_insn->getDataBits()[i]; const auto newbyte=from_insn->getDataBits()[i];
ms[from_insn_location+i]=newbyte; ms[from_insn_location+i]=newbyte;
//cout<<"Updating push["<<i<<"] from "<<hex<<oldbyte<<" to "<<newbyte<<endl; //cout<<"Updating push["<<i<<"] from "<<hex<<oldbyte<<" to "<<newbyte<<endl;
} }
// decode again for logging
const auto disasm2=DecodedInstruction_t::factory(from_insn); const auto disasm2=DecodedInstruction_t::factory(from_insn);
// log
cout<<"unpin:absptr_to_scoop:Converting "<<hex<<from_insn->getBaseID()<<":"<<disasm->getDisassembly() cout<<"unpin:absptr_to_scoop:Converting "<<hex<<from_insn->getBaseID()<<":"<<disasm->getDisassembly()
<<" to "<<disasm2->getDisassembly() <<" for scoop: "<<wrt->getName()<<endl; <<" to "<<disasm2->getDisassembly() <<" for scoop: "<<wrt->getName()<<endl;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment