From 03a183645456f898d159e5104c2e7ffa91d7057d Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Fri, 12 Dec 2014 22:06:06 +0800 Subject: [PATCH] arm64: set absolute (rather than relative) address B/BL. issue reported by Pancake --- SStream.c | 8 ++++++++ SStream.h | 2 ++ arch/AArch64/AArch64InstPrinter.c | 5 +++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/SStream.c b/SStream.c index 4a916c338..4ddfa9690 100644 --- a/SStream.c +++ b/SStream.c @@ -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) { diff --git a/SStream.h b/SStream.h index 87e5719b2..dad0e7fdb 100644 --- a/SStream.h +++ b/SStream.h @@ -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); diff --git a/arch/AArch64/AArch64InstPrinter.c b/arch/AArch64/AArch64InstPrinter.c index bd0194b9b..013db8b60 100644 --- a/arch/AArch64/AArch64InstPrinter.c +++ b/arch/AArch64/AArch64InstPrinter.c @@ -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;