PR binutils/14006
authorNick Clifton <nickc@redhat.com>
Fri, 11 May 2012 09:41:21 +0000 (09:41 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 11 May 2012 09:41:21 +0000 (09:41 +0000)
* arm-dis.c (print_insn): Fix detection of instruction mode in
files containing multiple executable sections.

opcodes/ChangeLog
opcodes/arm-dis.c

index a43dd3d3dacd25647d7481ad414b8e89f6b0b990..c1cc70b6c38eedb4527c5ff0650c87b1bd025e63 100644 (file)
@@ -1,3 +1,9 @@
+2012-05-11  Nick Clifton  <nickc@redhat.com>
+
+       PR binutils/14006
+       * arm-dis.c (print_insn): Fix detection of instruction mode in
+       files containing multiple executable sections.
+
 2012-05-03  Sean Keys  <skeys@ipdatasys.com>
 
        * Makefile.in, configure: regenerate
index 03062ad4d943d0bbd3882ef7e4e11766ba28fbc6..1269cf726acf0be4b6ff3aa0724c82e4ca9b51a2 100644 (file)
@@ -4697,9 +4697,19 @@ print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little)
 
       /* Start scanning at the start of the function, or wherever
         we finished last time.  */
-      start = info->symtab_pos + 1;
-      if (start < private_data->last_mapping_sym)
-       start = private_data->last_mapping_sym;
+      /* PR 14006.  When the address is 0 we are either at the start of the
+        very first function, or else the first function in a new, unlinked
+        executable section (eg because uf -ffunction-sections).  Either way
+        start scanning from the beginning of the symbol table, not where we
+        left off last time.  */
+      if (pc == 0)
+       start = 0;
+      else
+       {
+         start = info->symtab_pos + 1;
+         if (start < private_data->last_mapping_sym)
+           start = private_data->last_mapping_sym;
+       }
       found = FALSE;
 
       /* First, look for mapping symbols.  */