include * dis-asm.h (struct disassemble_info): Add stop_vma field.
binuti * objdump.c (disassemble_bytes): Set the stop_vma field in the
disassemble_info structure when disassembling code sections with
-d.
* doc/binutils.texi (objdump): Document the discrepancy between -d
and -D.
opcodes * dis-buf.c (buffer_read_memory): Fail is stop_vma is set and the
requested region lies beyond it.
* bfin-dis.c (print_insn_bfin): Ignore sysop instructions when
looking for 32-bit insns.
* mcore-dis.c (print_insn_mcore): Disable stop_vma when reading
data.
* sh-dis.c (print_insn_sh): Likewise.
* tic6x-dis.c (print_insn_tic6x): Disable stop_vma when reading
blocks of instructions.
* vax-dis.c (print_insn_vax): Check that the requested address
does not clash with the stop_vma.
tests * gas/arm/backslash-at.s: Add extra .byte directives so that the
foo symbol does not appear to point half way through an
instruction.
* gas/arm/backslash-at.d: Update expected disassembly.
* gas/i386/ilp32/x86-64-opcode-inval-intel.d: Likewise.
* gas/i386/ilp32/x86-64-opcode-inval.d: Likewise.
* gas/i386/x86-64-opcode-inval-intel.d: Likewise.
* gas/i386/x86-64-opcode-inval.d: Likewise.
+2015-06-22 Nick Clifton <nickc@redhat.com>
+
+ * objdump.c (disassemble_bytes): Set the stop_vma field in the
+ disassemble_info structure when disassembling code sections with
+ -d.
+ * doc/binutils.texi (objdump): Document the discrepancy between -d
+ and -D.
+
2015-06-05 Nick Clifton <nickc@redhat.com>
* dwarf.c (read_debug_line_header): Use reloc_at to detect
Like @option{-d}, but disassemble the contents of all sections, not just
those expected to contain instructions.
+This option also has a subtle effect on the disassembly of
+instructions in code sections. When option @option{-d} is in effect
+objdump will assume that any symbols present in a code section occur
+on the boundary between instructions and it will refuse to disassemble
+across such a boundary. When option @option{-D} is in effect however
+this assumption is supressed. This means that it is possible for the
+output of @option{-d} and @option{-D} to differ if, for example, data
+is stored in code sections.
+
If the target is an ARM architecture this switch also has the effect
of forcing the disassembler to decode pieces of data found in code
sections as if they were instructions.
}
}
+ if (! disassemble_all
+ && (section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
+ == (SEC_CODE | SEC_HAS_CONTENTS))
+ /* Set a stop_vma so that the disassembler will not read
+ beyond the next symbol. We assume that symbols appear on
+ the boundaries between instructions. We only do this when
+ disassembling code of course, and when -D is in effect. */
+ inf->stop_vma = section->vma + stop_offset;
+
octets = (*disassemble_fn) (section->vma + addr_offset, inf);
+
+ inf->stop_vma = 0;
inf->fprintf_func = (fprintf_ftype) fprintf;
inf->stream = stdout;
if (insn_width == 0 && inf->bytes_per_line != 0)
arelent ** rel_pp = NULL;
arelent ** rel_ppstart = NULL;
arelent ** rel_ppend;
- unsigned long stop_offset;
+ bfd_vma stop_offset;
asymbol * sym = NULL;
long place = 0;
long rel_count;
{
bfd_vma addr;
asymbol *nextsym;
- unsigned long nextstop_offset;
+ bfd_vma nextstop_offset;
bfd_boolean insns;
addr = section->vma + addr_offset;
section->num_relocs = reloc_count;
}
}
- }
+ }
return 1;
}
{
bfd_byte *data = 0;
bfd_size_type datasize;
- bfd_size_type addr_offset;
- bfd_size_type start_offset;
- bfd_size_type stop_offset;
+ bfd_vma addr_offset;
+ bfd_vma start_offset;
+ bfd_vma stop_offset;
unsigned int opb = bfd_octets_per_byte (abfd);
/* Bytes per line. */
const int onaline = 16;
{
bfd *arfile = NULL;
bfd *last_arfile = NULL;
-
+
if (level == 0)
printf (_("In archive %s:\n"), bfd_get_filename (file));
else if (level > 100)
+2015-06-22 Nick Clifton <nickc@redhat.com>
+
+ * gas/arm/backslash-at.s: Add extra .byte directives so that the
+ foo symbol does not appear to point half way through an
+ instruction.
+ * gas/arm/backslash-at.d: Update expected disassembly.
+ * gas/i386/ilp32/x86-64-opcode-inval-intel.d: Likewise.
+ * gas/i386/ilp32/x86-64-opcode-inval.d: Likewise.
+ * gas/i386/x86-64-opcode-inval-intel.d: Likewise.
+ * gas/i386/x86-64-opcode-inval.d: Likewise.
+
2015-06-19 Peter Bergner <bergner@vnet.ibm.com>
* gas/ppc/power8.d: Fixup rfebb test results.
Disassembly of section .text:
0+000 <.*>.*(615c|5c61).*
-0+002 <foo> e3a00000 mov r0, #0
-0+006 <foo\+0x4> e3a00000 mov r0, #0
-0+00a <foo\+0x8> e3a00000 mov r0, #0
-0+00e <foo\+0xc> e3a00001 mov r0, #1
-0+012 <foo\+0x10> e3a00001 mov r0, #1
-0+016 <foo\+0x14> e3a00001 mov r0, #1
-0+01a <foo\+0x18> e3a00002 mov r0, #2
-0+01e <foo\+0x1c> e3a00002 mov r0, #2
-0+022 <foo\+0x20> e3a00002 mov r0, #2
+0+004 <foo> e3a00000 mov r0, #0
+0+008 <foo\+0x4> e3a00000 mov r0, #0
+0+00c <foo\+0x8> e3a00000 mov r0, #0
+0+010 <foo\+0xc> e3a00001 mov r0, #1
+0+014 <foo\+0x10> e3a00001 mov r0, #1
+0+018 <foo\+0x14> e3a00001 mov r0, #1
+0+01c <foo\+0x18> e3a00002 mov r0, #2
+0+020 <foo\+0x1c> e3a00002 mov r0, #2
+0+024 <foo\+0x20> e3a00002 mov r0, #2
#...
mov r0, #\@ @comment
.endm
-.byte '\\
-.byte '\a
-
+ .byte '\\
+ .byte '\a
+ .byte 0
+ .byte 0
foo:
bar
bar
0+1 <aad0>:
[ ]*[a-f0-9]+: d5 \(bad\)
-[ ]*[a-f0-9]+: 0a d5 or dl,ch
+[ ]*[a-f0-9]+: 0a .byte 0xa
0+3 <aad1>:
[ ]*[a-f0-9]+: d5 \(bad\)
-[ ]*[a-f0-9]+: 02 d4 add dl,ah
+[ ]*[a-f0-9]+: 02 .byte 0x2
0+5 <aam0>:
[ ]*[a-f0-9]+: d4 \(bad\)
-[ ]*[a-f0-9]+: 0a d4 or dl,ah
+[ ]*[a-f0-9]+: 0a .byte 0xa
0+7 <aam1>:
[ ]*[a-f0-9]+: d4 \(bad\)
-[ ]*[a-f0-9]+: 02 3f add bh,BYTE PTR \[rdi\]
+[ ]*[a-f0-9]+: 02 .byte 0x2
0+9 <aas>:
[ ]*[a-f0-9]+: 3f \(bad\)
0+a <bound>:
-[ ]*[a-f0-9]+: 62 \(bad\)
-[ ]*[a-f0-9]+: 10 27 adc BYTE PTR \[rdi\],ah
+[ ]*[a-f0-9]+: 62 .byte 0x62
+[ ]*[a-f0-9]+: 10 .byte 0x10
0+c <daa>:
[ ]*[a-f0-9]+: 27 \(bad\)
0+1 <aad0>:
[ ]*[a-f0-9]+: d5 \(bad\)
-[ ]*[a-f0-9]+: 0a d5 or %ch,%dl
+[ ]*[a-f0-9]+: 0a .byte 0xa
0+3 <aad1>:
[ ]*[a-f0-9]+: d5 \(bad\)
-[ ]*[a-f0-9]+: 02 d4 add %ah,%dl
+[ ]*[a-f0-9]+: 02 .byte 0x2
0+5 <aam0>:
[ ]*[a-f0-9]+: d4 \(bad\)
-[ ]*[a-f0-9]+: 0a d4 or %ah,%dl
+[ ]*[a-f0-9]+: 0a .byte 0xa
0+7 <aam1>:
[ ]*[a-f0-9]+: d4 \(bad\)
-[ ]*[a-f0-9]+: 02 3f add \(%rdi\),%bh
+[ ]*[a-f0-9]+: 02 .byte 0x2
0+9 <aas>:
[ ]*[a-f0-9]+: 3f \(bad\)
0+a <bound>:
-[ ]*[a-f0-9]+: 62 \(bad\)
-[ ]*[a-f0-9]+: 10 27 adc %ah,\(%rdi\)
+[ ]*[a-f0-9]+: 62 .byte 0x62
+[ ]*[a-f0-9]+: 10 .byte 0x10
0+c <daa>:
[ ]*[a-f0-9]+: 27 \(bad\)
0+1 <aad0>:
[ ]*[a-f0-9]+: d5 \(bad\)
-[ ]*[a-f0-9]+: 0a d5 or dl,ch
+[ ]*[a-f0-9]+: 0a .byte 0xa
0+3 <aad1>:
[ ]*[a-f0-9]+: d5 \(bad\)
-[ ]*[a-f0-9]+: 02 d4 add dl,ah
+[ ]*[a-f0-9]+: 02 .byte 0x2
0+5 <aam0>:
[ ]*[a-f0-9]+: d4 \(bad\)
-[ ]*[a-f0-9]+: 0a d4 or dl,ah
+[ ]*[a-f0-9]+: 0a .byte 0xa
0+7 <aam1>:
[ ]*[a-f0-9]+: d4 \(bad\)
-[ ]*[a-f0-9]+: 02 3f add bh,BYTE PTR \[rdi\]
+[ ]*[a-f0-9]+: 02 .byte 0x2
0+9 <aas>:
[ ]*[a-f0-9]+: 3f \(bad\)
0+a <bound>:
-[ ]*[a-f0-9]+: 62 \(bad\)
-[ ]*[a-f0-9]+: 10 27 adc BYTE PTR \[rdi\],ah
+[ ]*[a-f0-9]+: 62 .byte 0x62
+[ ]*[a-f0-9]+: 10 .byte 0x10
0+c <daa>:
[ ]*[a-f0-9]+: 27 \(bad\)
0+1 <aad0>:
[ ]*[a-f0-9]+: d5 \(bad\)
-[ ]*[a-f0-9]+: 0a d5 or %ch,%dl
+[ ]*[a-f0-9]+: 0a .byte 0xa
0+3 <aad1>:
[ ]*[a-f0-9]+: d5 \(bad\)
-[ ]*[a-f0-9]+: 02 d4 add %ah,%dl
+[ ]*[a-f0-9]+: 02 .byte 0x2
0+5 <aam0>:
[ ]*[a-f0-9]+: d4 \(bad\)
-[ ]*[a-f0-9]+: 0a d4 or %ah,%dl
+[ ]*[a-f0-9]+: 0a .byte 0xa
0+7 <aam1>:
[ ]*[a-f0-9]+: d4 \(bad\)
-[ ]*[a-f0-9]+: 02 3f add \(%rdi\),%bh
+[ ]*[a-f0-9]+: 02 .byte 0x2
0+9 <aas>:
[ ]*[a-f0-9]+: 3f \(bad\)
0+a <bound>:
-[ ]*[a-f0-9]+: 62 \(bad\)
-[ ]*[a-f0-9]+: 10 27 adc %ah,\(%rdi\)
+[ ]*[a-f0-9]+: 62 .byte 0x62
+[ ]*[a-f0-9]+: 10 .byte 0x10
0+c <daa>:
[ ]*[a-f0-9]+: 27 \(bad\)
+2015-06-22 Nick Clifton <nickc@redhat.com>
+
+ * dis-asm.h (struct disassemble_info): Add stop_vma field.
+
2015-05-28 Catherine Moore <clm@codesourcery.com>
include/
/* Command line options specific to the target disassembler. */
char * disassembler_options;
+ /* If non-zero then try not disassemble beyond this address, even if
+ there are values left in the buffer. This address is the address
+ of the nearest symbol forwards from the start of the disassembly,
+ and it is assumed that it lies on the boundary between instructions.
+ If an instruction spans this address then this is an error in the
+ file being disassembled. */
+ bfd_vma stop_vma;
+
} disassemble_info;
\f
+2015-06-22 Nick Clifton <nickc@redhat.com>
+
+ * dis-buf.c (buffer_read_memory): Fail is stop_vma is set and the
+ requested region lies beyond it.
+ * bfin-dis.c (print_insn_bfin): Ignore sysop instructions when
+ looking for 32-bit insns.
+ * mcore-dis.c (print_insn_mcore): Disable stop_vma when reading
+ data.
+ * sh-dis.c (print_insn_sh): Likewise.
+ * tic6x-dis.c (print_insn_tic6x): Disable stop_vma when reading
+ blocks of instructions.
+ * vax-dis.c (print_insn_vax): Check that the requested address
+ does not clash with the stop_vma.
+
2015-06-19 Peter Bergner <bergner@vnet.ibm.com>
* ppc-dis.h (skip_optional_operands): Use ppc_optional_operand_value.
return -1;
priv->iw0 = iw0;
- if ((iw0 & 0xc000) == 0xc000)
+ if (((iw0 & 0xc000) == 0xc000) && ((iw0 & 0xff00) != 0xf800))
{
/* 32-bit insn. */
if (ifetch (pc + 2, outf, &iw1))
if (memaddr < info->buffer_vma
|| memaddr - info->buffer_vma > max_addr_offset
- || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset)
+ || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset
+ || (info->stop_vma && (memaddr >= info->stop_vma
+ || memaddr + end_addr_offset > info->stop_vma)))
/* Out of bounds. Use EIO because GDB uses it. */
return EIO;
memcpy (myaddr, info->buffer + octets, length);
static const unsigned isiz[] = { 2, 0, 1, 0 };
int
-print_insn_mcore (memaddr, info)
- bfd_vma memaddr;
- struct disassemble_info *info;
+print_insn_mcore (bfd_vma memaddr,
+ struct disassemble_info *info)
{
unsigned char ibytes[4];
fprintf_ftype print_func = info->fprintf_func;
val = (memaddr + 2 + ((inst & 0xFF) << 2)) & 0xFFFFFFFC;
+ /* We are not reading an instruction, so allow
+ reads to extend beyond the next symbol. */
+ info->stop_vma = 0;
status = info->read_memory_func (val, ibytes, 4, info);
if (status != 0)
{
val = (memaddr + 2 + ((inst & 0xFF) << 2)) & 0xFFFFFFFC;
+ /* We are not reading an instruction, so allow
+ reads to extend beyond the next symbol. */
+ info->stop_vma = 0;
status = info->read_memory_func (val, ibytes, 4, info);
if (status != 0)
{
size = 2;
else
size = 4;
+ /* Not reading an instruction - disable stop_vma. */
+ info->stop_vma = 0;
status = info->read_memory_func (disp_pc_addr, bytes, size, info);
if (status == 0)
{
fp_offset = addr & 0x1f;
fp_addr = addr - fp_offset;
+ /* Read in a block of instructions. Since there might be a
+ symbol in the middle of this block, disable stop_vma. */
+ info->stop_vma = 0;
status = info->read_memory_func (fp_addr, fp, 32, info);
if (status)
{
argp = NULL;
/* Check if the info buffer has more than one byte left since
the last opcode might be a single byte with no argument data. */
- if (info->buffer_length - (memaddr - info->buffer_vma) > 1)
+ if (info->buffer_length - (memaddr - info->buffer_vma) > 1
+ && (info->stop_vma == 0 || memaddr < (info->stop_vma - 1)))
{
FETCH_DATA (info, buffer + 2);
}