AArch64: Fix disassembler bug with out-of-order sections
authorTamar Christina <tamar.christina@arm.com>
Mon, 25 Mar 2019 12:08:53 +0000 (12:08 +0000)
committerTamar Christina <tamar.christina@arm.com>
Mon, 25 Mar 2019 15:05:53 +0000 (15:05 +0000)
commit53b2f36bf6aa939feab6f82f05d7dad52f82660d
tree3ea5018d4dee6a17be4eae4bacbcb70f0bbbbb51
parent9a93502fa81734d39f213ccb33b497bc40e1423d
AArch64: Fix disassembler bug with out-of-order sections

The AArch64 disassembler has an optimization that it uses to reduce the amount
it has to search for mapping symbols during disassembly.  This optimization
assumes that sections are listed in the section header in monotonic increasing
VMAs.  However this is not a requirement for the ELF specification.

Because of this when such "out of order" sections occur the disassembler would
pick the wrong mapping symbol to disassemble the section with.

This fixes it by explicitly passing along the stop offset for the current
disassembly glob and when this changes compared to the previous one we've seen
the optimization won't be performed.  In effect this restarts the search from
a well defined starting point.  Usually the symbol's address.

The existing stop_vma can't be used for this as it is allowed to be unset and
setting this unconditionally would change the semantics of this field.

binutils/ChangeLog:

* objdump.c (disassemble_bytes): Pass stop_offset.
* testsuite/binutils-all/aarch64/out-of-order.T: New test.
* testsuite/binutils-all/aarch64/out-of-order.d: New test.
* testsuite/binutils-all/aarch64/out-of-order.s: New test.

include/ChangeLog:

* dis-asm.h (struct disassemble_info): Add stop_offset.

opcodes/ChangeLog:

* aarch64-dis.c (last_stop_offset): New.
(print_insn_aarch64): Use stop_offset.
binutils/ChangeLog
binutils/objdump.c
binutils/testsuite/binutils-all/aarch64/out-of-order.T [new file with mode: 0644]
binutils/testsuite/binutils-all/aarch64/out-of-order.d [new file with mode: 0644]
binutils/testsuite/binutils-all/aarch64/out-of-order.s [new file with mode: 0644]
include/ChangeLog
include/dis-asm.h
opcodes/ChangeLog
opcodes/aarch64-dis.c
This page took 0.027379 seconds and 4 git commands to generate.