d570a8
diff -Nrup a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi
d570a8
--- a/binutils/doc/binutils.texi	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/binutils/doc/binutils.texi	2015-06-23 09:44:23.938269022 -0600
d570a8
@@ -1957,6 +1957,15 @@ expected to contain instructions.
d570a8
 Like @option{-d}, but disassemble the contents of all sections, not just
d570a8
 those expected to contain instructions.
d570a8
 
d570a8
+This option also has a subtle effect on the disassembly of
d570a8
+instructions in code sections.  When option @option{-d} is in effect
d570a8
+objdump will assume that any symbols present in a code section occur
d570a8
+on the boundary between instructions and it will refuse to disassemble
d570a8
+across such a boundary.  When option @option{-D} is in effect however
d570a8
+this assumption is supressed.  This means that it is possible for the
d570a8
+output of @option{-d} and @option{-D} to differ if, for example, data
d570a8
+is stored in code sections.
d570a8
+
d570a8
 If the target is an ARM architecture this switch also has the effect
d570a8
 of forcing the disassembler to decode pieces of data found in code
d570a8
 sections as if they were instructions.
d570a8
diff -Nrup a/binutils/objdump.c b/binutils/objdump.c
d570a8
--- a/binutils/objdump.c	2015-06-23 07:38:21.000000000 -0600
d570a8
+++ b/binutils/objdump.c	2015-06-23 09:44:23.939269001 -0600
d570a8
@@ -1667,7 +1667,18 @@ disassemble_bytes (struct disassemble_in
d570a8
 		    }
d570a8
 		}
d570a8
 
d570a8
+	      if (! disassemble_all
d570a8
+		  && (section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
d570a8
+		  == (SEC_CODE | SEC_HAS_CONTENTS))
d570a8
+		/* Set a stop_vma so that the disassembler will not read
d570a8
+		   beyond the next symbol.  We assume that symbols appear on
d570a8
+		   the boundaries between instructions.  We only do this when
d570a8
+		   disassembling code of course, and when -D is in effect.  */
d570a8
+		inf->stop_vma = section->vma + stop_offset;
d570a8
+	      
d570a8
 	      octets = (*disassemble_fn) (section->vma + addr_offset, inf);
d570a8
+
d570a8
+	      inf->stop_vma = 0;
d570a8
 	      inf->fprintf_func = (fprintf_ftype) fprintf;
d570a8
 	      inf->stream = stdout;
d570a8
 	      if (insn_width == 0 && inf->bytes_per_line != 0)
d570a8
@@ -1893,7 +1904,7 @@ disassemble_section (bfd *abfd, asection
d570a8
   arelent **                   rel_pp = NULL;
d570a8
   arelent **                   rel_ppstart = NULL;
d570a8
   arelent **                   rel_ppend;
d570a8
-  unsigned long                stop_offset;
d570a8
+  bfd_vma                      stop_offset;
d570a8
   asymbol *                    sym = NULL;
d570a8
   long                         place = 0;
d570a8
   long                         rel_count;
d570a8
@@ -2015,7 +2026,7 @@ disassemble_section (bfd *abfd, asection
d570a8
     {
d570a8
       bfd_vma addr;
d570a8
       asymbol *nextsym;
d570a8
-      unsigned long nextstop_offset;
d570a8
+      bfd_vma nextstop_offset;
d570a8
       bfd_boolean insns;
d570a8
 
d570a8
       addr = section->vma + addr_offset;
d570a8
@@ -2703,9 +2714,9 @@ dump_section (bfd *abfd, asection *secti
d570a8
 {
d570a8
   bfd_byte *data = 0;
d570a8
   bfd_size_type datasize;
d570a8
-  bfd_size_type addr_offset;
d570a8
-  bfd_size_type start_offset;
d570a8
-  bfd_size_type stop_offset;
d570a8
+  bfd_vma addr_offset;
d570a8
+  bfd_vma start_offset;
d570a8
+  bfd_vma stop_offset;
d570a8
   unsigned int opb = bfd_octets_per_byte (abfd);
d570a8
   /* Bytes per line.  */
d570a8
   const int onaline = 16;
d570a8
diff -Nrup a/gas/testsuite/gas/arm/backslash-at.d b/gas/testsuite/gas/arm/backslash-at.d
d570a8
--- a/gas/testsuite/gas/arm/backslash-at.d	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/gas/testsuite/gas/arm/backslash-at.d	2015-06-23 09:51:10.167721356 -0600
d570a8
@@ -5,13 +5,13 @@
d570a8
 
d570a8
 Disassembly of section .text:
d570a8
 0+000 <.*>.*615c.*
d570a8
-0+002 <foo> e3a00000 	mov	r0, #0
d570a8
-0+006 <foo\+0x4> e3a00000 	mov	r0, #0
d570a8
-0+00a <foo\+0x8> e3a00000 	mov	r0, #0
d570a8
-0+00e <foo\+0xc> e3a00001 	mov	r0, #1
d570a8
-0+012 <foo\+0x10> e3a00001 	mov	r0, #1
d570a8
-0+016 <foo\+0x14> e3a00001 	mov	r0, #1
d570a8
-0+01a <foo\+0x18> e3a00002 	mov	r0, #2
d570a8
-0+01e <foo\+0x1c> e3a00002 	mov	r0, #2
d570a8
-0+022 <foo\+0x20> e3a00002 	mov	r0, #2
d570a8
+0+004 <foo> e3a00000 	mov	r0, #0
d570a8
+0+008 <foo\+0x4> e3a00000 	mov	r0, #0
d570a8
+0+00c <foo\+0x8> e3a00000 	mov	r0, #0
d570a8
+0+010 <foo\+0xc> e3a00001 	mov	r0, #1
d570a8
+0+014 <foo\+0x10> e3a00001 	mov	r0, #1
d570a8
+0+018 <foo\+0x14> e3a00001 	mov	r0, #1
d570a8
+0+01c <foo\+0x18> e3a00002 	mov	r0, #2
d570a8
+0+020 <foo\+0x1c> e3a00002 	mov	r0, #2
d570a8
+0+024 <foo\+0x20> e3a00002 	mov	r0, #2
d570a8
 #...
d570a8
Binary files a/gas/testsuite/gas/arm/.backslash-at.d.rej.swp and b/gas/testsuite/gas/arm/.backslash-at.d.rej.swp differ
d570a8
diff -Nrup a/gas/testsuite/gas/arm/backslash-at.s b/gas/testsuite/gas/arm/backslash-at.s
d570a8
--- a/gas/testsuite/gas/arm/backslash-at.s	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/gas/testsuite/gas/arm/backslash-at.s	2015-06-23 09:44:23.939269001 -0600
d570a8
@@ -6,9 +6,10 @@
d570a8
 	mov	r0, #\@ @comment
d570a8
 .endm
d570a8
 
d570a8
-.byte	'\\
d570a8
-.byte	'\a
d570a8
-
d570a8
+	.byte	'\\
d570a8
+	.byte	'\a
d570a8
+	.byte 	0
d570a8
+	.byte	0
d570a8
 foo:
d570a8
 	bar
d570a8
 	bar
d570a8
diff -Nrup a/gas/testsuite/gas/i386/ilp32/x86-64-opcode-inval.d b/gas/testsuite/gas/i386/ilp32/x86-64-opcode-inval.d
d570a8
--- a/gas/testsuite/gas/i386/ilp32/x86-64-opcode-inval.d	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/gas/testsuite/gas/i386/ilp32/x86-64-opcode-inval.d	2015-06-23 09:44:23.940268980 -0600
d570a8
@@ -12,26 +12,26 @@ Disassembly of section .text:
d570a8
 
d570a8
 0+1 <aad0>:
d570a8
 [ 	]*[a-f0-9]+:	d5                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	0a d5                	or     %ch,%dl
d570a8
+[ 	]*[a-f0-9]+:	0a                   	.byte 0xa
d570a8
 
d570a8
 0+3 <aad1>:
d570a8
 [ 	]*[a-f0-9]+:	d5                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	02 d4                	add    %ah,%dl
d570a8
+[ 	]*[a-f0-9]+:	02                   	.byte 0x2
d570a8
 
d570a8
 0+5 <aam0>:
d570a8
 [ 	]*[a-f0-9]+:	d4                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	0a d4                	or     %ah,%dl
d570a8
+[ 	]*[a-f0-9]+:	0a                   	.byte 0xa
d570a8
 
d570a8
 0+7 <aam1>:
d570a8
 [ 	]*[a-f0-9]+:	d4                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	02 3f                	add    \(%rdi\),%bh
d570a8
+[ 	]*[a-f0-9]+:	02                   	.byte 0x2
d570a8
 
d570a8
 0+9 <aas>:
d570a8
 [ 	]*[a-f0-9]+:	3f                   	\(bad\)  
d570a8
 
d570a8
 0+a <bound>:
d570a8
-[ 	]*[a-f0-9]+:	62                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	10 27                	adc    %ah,\(%rdi\)
d570a8
+[ 	]*[a-f0-9]+:	62                   	.byte 0x62
d570a8
+[ 	]*[a-f0-9]+:	10                   	.byte 0x10
d570a8
 
d570a8
 0+c <daa>:
d570a8
 [ 	]*[a-f0-9]+:	27                   	\(bad\)  
d570a8
diff -Nrup a/gas/testsuite/gas/i386/ilp32/x86-64-opcode-inval-intel.d b/gas/testsuite/gas/i386/ilp32/x86-64-opcode-inval-intel.d
d570a8
--- a/gas/testsuite/gas/i386/ilp32/x86-64-opcode-inval-intel.d	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/gas/testsuite/gas/i386/ilp32/x86-64-opcode-inval-intel.d	2015-06-23 09:44:23.939269001 -0600
d570a8
@@ -12,26 +12,26 @@ Disassembly of section .text:
d570a8
 
d570a8
 0+1 <aad0>:
d570a8
 [ 	]*[a-f0-9]+:	d5                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	0a d5                	or     dl,ch
d570a8
+[ 	]*[a-f0-9]+:	0a                   	.byte 0xa
d570a8
 
d570a8
 0+3 <aad1>:
d570a8
 [ 	]*[a-f0-9]+:	d5                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	02 d4                	add    dl,ah
d570a8
+[ 	]*[a-f0-9]+:	02                   	.byte 0x2
d570a8
 
d570a8
 0+5 <aam0>:
d570a8
 [ 	]*[a-f0-9]+:	d4                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	0a d4                	or     dl,ah
d570a8
+[ 	]*[a-f0-9]+:	0a                   	.byte 0xa
d570a8
 
d570a8
 0+7 <aam1>:
d570a8
 [ 	]*[a-f0-9]+:	d4                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	02 3f                	add    bh,BYTE PTR \[rdi\]
d570a8
+[ 	]*[a-f0-9]+:	02                   	.byte 0x2
d570a8
 
d570a8
 0+9 <aas>:
d570a8
 [ 	]*[a-f0-9]+:	3f                   	\(bad\)  
d570a8
 
d570a8
 0+a <bound>:
d570a8
-[ 	]*[a-f0-9]+:	62                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	10 27                	adc    BYTE PTR \[rdi\],ah
d570a8
+[ 	]*[a-f0-9]+:	62                   	.byte 0x62
d570a8
+[ 	]*[a-f0-9]+:	10                   	.byte 0x10
d570a8
 
d570a8
 0+c <daa>:
d570a8
 [ 	]*[a-f0-9]+:	27                   	\(bad\)  
d570a8
diff -Nrup a/gas/testsuite/gas/i386/x86-64-opcode-inval.d b/gas/testsuite/gas/i386/x86-64-opcode-inval.d
d570a8
--- a/gas/testsuite/gas/i386/x86-64-opcode-inval.d	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/gas/testsuite/gas/i386/x86-64-opcode-inval.d	2015-06-23 09:44:23.940268980 -0600
d570a8
@@ -11,26 +11,26 @@ Disassembly of section .text:
d570a8
 
d570a8
 0+1 <aad0>:
d570a8
 [ 	]*[a-f0-9]+:	d5                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	0a d5                	or     %ch,%dl
d570a8
+[ 	]*[a-f0-9]+:	0a                   	.byte 0xa
d570a8
 
d570a8
 0+3 <aad1>:
d570a8
 [ 	]*[a-f0-9]+:	d5                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	02 d4                	add    %ah,%dl
d570a8
+[ 	]*[a-f0-9]+:	02                   	.byte 0x2
d570a8
 
d570a8
 0+5 <aam0>:
d570a8
 [ 	]*[a-f0-9]+:	d4                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	0a d4                	or     %ah,%dl
d570a8
+[ 	]*[a-f0-9]+:	0a                   	.byte 0xa
d570a8
 
d570a8
 0+7 <aam1>:
d570a8
 [ 	]*[a-f0-9]+:	d4                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	02 3f                	add    \(%rdi\),%bh
d570a8
+[ 	]*[a-f0-9]+:	02                   	.byte 0x2
d570a8
 
d570a8
 0+9 <aas>:
d570a8
 [ 	]*[a-f0-9]+:	3f                   	\(bad\)  
d570a8
 
d570a8
 0+a <bound>:
d570a8
-[ 	]*[a-f0-9]+:	62                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	10 27                	adc    %ah,\(%rdi\)
d570a8
+[ 	]*[a-f0-9]+:	62                   	.byte 0x62
d570a8
+[ 	]*[a-f0-9]+:	10                   	.byte 0x10
d570a8
 
d570a8
 0+c <daa>:
d570a8
 [ 	]*[a-f0-9]+:	27                   	\(bad\)  
d570a8
diff -Nrup a/gas/testsuite/gas/i386/x86-64-opcode-inval-intel.d b/gas/testsuite/gas/i386/x86-64-opcode-inval-intel.d
d570a8
--- a/gas/testsuite/gas/i386/x86-64-opcode-inval-intel.d	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/gas/testsuite/gas/i386/x86-64-opcode-inval-intel.d	2015-06-23 09:44:23.940268980 -0600
d570a8
@@ -12,26 +12,26 @@ Disassembly of section .text:
d570a8
 
d570a8
 0+1 <aad0>:
d570a8
 [ 	]*[a-f0-9]+:	d5                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	0a d5                	or     dl,ch
d570a8
+[ 	]*[a-f0-9]+:	0a                   	.byte 0xa
d570a8
 
d570a8
 0+3 <aad1>:
d570a8
 [ 	]*[a-f0-9]+:	d5                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	02 d4                	add    dl,ah
d570a8
+[ 	]*[a-f0-9]+:	02                   	.byte 0x2
d570a8
 
d570a8
 0+5 <aam0>:
d570a8
 [ 	]*[a-f0-9]+:	d4                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	0a d4                	or     dl,ah
d570a8
+[ 	]*[a-f0-9]+:	0a                   	.byte 0xa
d570a8
 
d570a8
 0+7 <aam1>:
d570a8
 [ 	]*[a-f0-9]+:	d4                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	02 3f                	add    bh,BYTE PTR \[rdi\]
d570a8
+[ 	]*[a-f0-9]+:	02                   	.byte 0x2
d570a8
 
d570a8
 0+9 <aas>:
d570a8
 [ 	]*[a-f0-9]+:	3f                   	\(bad\)  
d570a8
 
d570a8
 0+a <bound>:
d570a8
-[ 	]*[a-f0-9]+:	62                   	\(bad\)  
d570a8
-[ 	]*[a-f0-9]+:	10 27                	adc    BYTE PTR \[rdi\],ah
d570a8
+[ 	]*[a-f0-9]+:	62                   	.byte 0x62
d570a8
+[ 	]*[a-f0-9]+:	10                   	.byte 0x10
d570a8
 
d570a8
 0+c <daa>:
d570a8
 [ 	]*[a-f0-9]+:	27                   	\(bad\)  
d570a8
diff -Nrup a/include/dis-asm.h b/include/dis-asm.h
d570a8
--- a/include/dis-asm.h	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/include/dis-asm.h	2015-06-23 09:44:23.940268980 -0600
d570a8
@@ -213,6 +213,14 @@ typedef struct disassemble_info
d570a8
   /* Command line options specific to the target disassembler.  */
d570a8
   char * disassembler_options;
d570a8
 
d570a8
+  /* If non-zero then try not disassemble beyond this address, even if
d570a8
+     there are values left in the buffer.  This address is the address
d570a8
+     of the nearest symbol forwards from the start of the disassembly,
d570a8
+     and it is assumed that it lies on the boundary between instructions.
d570a8
+     If an instruction spans this address then this is an error in the
d570a8
+     file being disassembled.  */
d570a8
+  bfd_vma stop_vma;
d570a8
+
d570a8
 } disassemble_info;
d570a8
 
d570a8
 
d570a8
diff -Nrup a/opcodes/dis-buf.c b/opcodes/dis-buf.c
d570a8
--- a/opcodes/dis-buf.c	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/opcodes/dis-buf.c	2015-06-23 09:44:23.941268959 -0600
d570a8
@@ -39,7 +39,9 @@ buffer_read_memory (bfd_vma memaddr,
d570a8
 
d570a8
   if (memaddr < info->buffer_vma
d570a8
       || memaddr - info->buffer_vma > max_addr_offset
d570a8
-      || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset)
d570a8
+      || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset
d570a8
+      || (info->stop_vma && (memaddr >= info->stop_vma
d570a8
+			     || memaddr + end_addr_offset > info->stop_vma)))
d570a8
     /* Out of bounds.  Use EIO because GDB uses it.  */
d570a8
     return EIO;
d570a8
   memcpy (myaddr, info->buffer + octets, length);
d570a8
diff -Nrup a/opcodes/mcore-dis.c b/opcodes/mcore-dis.c
d570a8
--- a/opcodes/mcore-dis.c	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/opcodes/mcore-dis.c	2015-06-23 09:44:23.941268959 -0600
d570a8
@@ -89,9 +89,8 @@ static const char *crname[] = {
d570a8
 static const unsigned isiz[] = { 2, 0, 1, 0 };
d570a8
 
d570a8
 int
d570a8
-print_insn_mcore (memaddr, info)
d570a8
-     bfd_vma memaddr;
d570a8
-     struct disassemble_info *info;
d570a8
+print_insn_mcore (bfd_vma memaddr,
d570a8
+		  struct disassemble_info *info)
d570a8
 {
d570a8
   unsigned char ibytes[4];
d570a8
   fprintf_ftype print_func = info->fprintf_func;
d570a8
@@ -234,6 +233,9 @@ print_insn_mcore (memaddr, info)
d570a8
 
d570a8
 	    val = (memaddr + 2 + ((inst & 0xFF) << 2)) & 0xFFFFFFFC;
d570a8
 
d570a8
+	    /* We are not reading an instruction, so allow
d570a8
+	       reads to extend beyond the next symbol.  */
d570a8
+	    info->stop_vma = 0;
d570a8
 	    status = info->read_memory_func (val, ibytes, 4, info);
d570a8
 	    if (status != 0)
d570a8
 	      {
d570a8
@@ -264,6 +266,9 @@ print_insn_mcore (memaddr, info)
d570a8
 
d570a8
 	    val = (memaddr + 2 + ((inst & 0xFF) << 2)) & 0xFFFFFFFC;
d570a8
 
d570a8
+	    /* We are not reading an instruction, so allow
d570a8
+	       reads to extend beyond the next symbol.  */
d570a8
+	    info->stop_vma = 0;
d570a8
 	    status = info->read_memory_func (val, ibytes, 4, info);
d570a8
 	    if (status != 0)
d570a8
 	      {
d570a8
diff -Nrup a/opcodes/sh-dis.c b/opcodes/sh-dis.c
d570a8
--- a/opcodes/sh-dis.c	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/opcodes/sh-dis.c	2015-06-23 09:44:23.941268959 -0600
d570a8
@@ -906,6 +906,8 @@ print_insn_sh (bfd_vma memaddr, struct d
d570a8
 	    size = 2;
d570a8
 	  else
d570a8
 	    size = 4;
d570a8
+	  /* Not reading an instruction - disable stop_vma.  */
d570a8
+	  info->stop_vma = 0;
d570a8
 	  status = info->read_memory_func (disp_pc_addr, bytes, size, info);
d570a8
 	  if (status == 0)
d570a8
 	    {
d570a8
diff -Nrup a/opcodes/tic6x-dis.c b/opcodes/tic6x-dis.c
d570a8
--- a/opcodes/tic6x-dis.c	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/opcodes/tic6x-dis.c	2015-06-23 09:44:23.941268959 -0600
d570a8
@@ -178,6 +178,9 @@ print_insn_tic6x (bfd_vma addr, struct d
d570a8
 
d570a8
   fp_offset = addr & 0x1f;
d570a8
   fp_addr = addr - fp_offset;
d570a8
+  /* Read in a block of instructions.  Since there might be a
d570a8
+     symbol in the middle of this block, disable stop_vma.  */
d570a8
+  info->stop_vma = 0;
d570a8
   status = info->read_memory_func (fp_addr, fp, 32, info);
d570a8
   if (status)
d570a8
     {
d570a8
diff -Nrup a/opcodes/vax-dis.c b/opcodes/vax-dis.c
d570a8
--- a/opcodes/vax-dis.c	2013-02-27 13:28:03.000000000 -0700
d570a8
+++ b/opcodes/vax-dis.c	2015-06-23 09:44:23.941268959 -0600
d570a8
@@ -403,7 +403,8 @@ print_insn_vax (bfd_vma memaddr, disasse
d570a8
   argp = NULL;
d570a8
   /* Check if the info buffer has more than one byte left since
d570a8
      the last opcode might be a single byte with no argument data.  */
d570a8
-  if (info->buffer_length - (memaddr - info->buffer_vma) > 1)
d570a8
+  if (info->buffer_length - (memaddr - info->buffer_vma) > 1
d570a8
+      && (info->stop_vma == 0 || memaddr < (info->stop_vma - 1)))
d570a8
     {
d570a8
       FETCH_DATA (info, buffer + 2);
d570a8
     }