arm64: set absolute (rather than relative) address B/BL. issue reported by Pancake

This commit is contained in:
Nguyen Anh Quynh 2014-12-12 22:06:06 +08:00
parent c2925e9034
commit 03a1836454
3 changed files with 13 additions and 2 deletions

View File

@ -61,6 +61,14 @@ void printInt64Bang(SStream *O, int64_t val)
}
}
void printUInt64Bang(SStream *O, uint64_t val)
{
if (val > HEX_THRESHOLD)
SStream_concat(O, "#0x%"PRIx64, val);
else
SStream_concat(O, "#%"PRIu64, val);
}
// print number
void printInt64(SStream *O, int64_t val)
{

View File

@ -17,6 +17,8 @@ void SStream_concat0(SStream *ss, char *s);
void printInt64Bang(SStream *O, int64_t val);
void printUInt64Bang(SStream *O, uint64_t val);
void printInt64(SStream *O, int64_t val);
void printInt32Bang(SStream *O, int32_t val);

View File

@ -1238,10 +1238,11 @@ static void printAlignedLabel(MCInst *MI, unsigned OpNum, SStream *O)
// If the label has already been resolved to an immediate offset (say, when
// we're running the disassembler), just print the immediate.
if (MCOperand_isImm(Op)) {
printInt64Bang(O, MCOperand_getImm(Op) << 2);
uint64_t imm = (MCOperand_getImm(Op) << 2) + MI->address;
printUInt64Bang(O, imm);
if (MI->csh->detail) {
MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = (int)MCOperand_getImm(Op) << 2;
MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = imm;
MI->flat_insn->detail->arm64.op_count++;
}
return;