aboutsummaryrefslogtreecommitdiff
path: root/opcodes
diff options
context:
space:
mode:
authorPhillipe Antoine <p.antoine@catenacyber.fr>2019-08-07 17:22:29 +0100
committerNick Clifton <nickc@redhat.com>2019-08-07 17:22:29 +0100
commitd88bdcb4a52bc041ed9b607dda22f478ec61a67b (patch)
tree3cc83e5666f0e4b2627053d9d695ec255c6eeabb /opcodes
parent7c1c1904bedb8f873731651b420a23f573785728 (diff)
downloadgdb-d88bdcb4a52bc041ed9b607dda22f478ec61a67b.zip
gdb-d88bdcb4a52bc041ed9b607dda22f478ec61a67b.tar.gz
gdb-d88bdcb4a52bc041ed9b607dda22f478ec61a67b.tar.bz2
Prevent objdump from aborting when asked to disassemble an unknown type of ARC binary file.
PR 24854 * arc-dis.c (arc_insn_length): Return 0 rather than aborting when encountering an unknown machine type. (print_insn_arc): Handle arc_insn_length returning 0. In error cases return -1 rather than calling abort.
Diffstat (limited to 'opcodes')
-rw-r--r--opcodes/ChangeLog8
-rw-r--r--opcodes/arc-dis.c17
2 files changed, 19 insertions, 6 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 4611445..97c2942 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,11 @@
+2019-08-07 Phillipe Antoine <p.antoine@catenacyber.fr>
+
+ PR 24854
+ * arc-dis.c (arc_insn_length): Return 0 rather than aborting when
+ encountering an unknown machine type.
+ (print_insn_arc): Handle arc_insn_length returning 0. In error
+ cases return -1 rather than calling abort.
+
2019-08-07 Jan Beulich <jbeulich@suse.com>
* i386-opc.tbl (fld, fstp): Drop FloatMF from extended forms.
diff --git a/opcodes/arc-dis.c b/opcodes/arc-dis.c
index 8207c05..3c88c33 100644
--- a/opcodes/arc-dis.c
+++ b/opcodes/arc-dis.c
@@ -672,7 +672,7 @@ arc_insn_length (bfd_byte msb, bfd_byte lsb, struct disassemble_info *info)
break;
default:
- abort ();
+ return 0;
}
}
@@ -1009,7 +1009,6 @@ print_insn_arc (bfd_vma memaddr,
the number of bytes objdump should display on a single line. If
the instruction decoder sets this, it should always set it to
the same value in order to get reasonable looking output. */
-
info->bytes_per_line = 8;
/* In the next lines, we set two info variables control the way
@@ -1017,7 +1016,6 @@ print_insn_arc (bfd_vma memaddr,
8 and bytes_per_chunk is 4, the output will look like this:
00: 00000000 00000000
with the chunks displayed according to "display_endian". */
-
if (info->section
&& !(info->section->flags & SEC_CODE))
{
@@ -1072,13 +1070,16 @@ print_insn_arc (bfd_vma memaddr,
(*info->fprintf_func) (info->stream, ".word\t0x%08lx", data);
break;
default:
- abort ();
+ return -1;
}
return size;
}
insn_len = arc_insn_length (buffer[highbyte], buffer[lowbyte], info);
pr_debug ("instruction length = %d bytes\n", insn_len);
+ if (insn_len == 0)
+ return -1;
+
arc_infop = info->private_data;
arc_infop->insn_len = insn_len;
@@ -1131,7 +1132,7 @@ print_insn_arc (bfd_vma memaddr,
default:
/* There is no instruction whose length is not 2, 4, 6, or 8. */
- abort ();
+ return -1;
}
pr_debug ("instruction value = %llx\n", insn);
@@ -1159,24 +1160,28 @@ print_insn_arc (bfd_vma memaddr,
(*info->fprintf_func) (info->stream, ".shor\t%#04llx",
insn & 0xffff);
break;
+
case 4:
(*info->fprintf_func) (info->stream, ".word\t%#08llx",
insn & 0xffffffff);
break;
+
case 6:
(*info->fprintf_func) (info->stream, ".long\t%#08llx",
insn & 0xffffffff);
(*info->fprintf_func) (info->stream, ".long\t%#04llx",
(insn >> 32) & 0xffff);
break;
+
case 8:
(*info->fprintf_func) (info->stream, ".long\t%#08llx",
insn & 0xffffffff);
(*info->fprintf_func) (info->stream, ".long\t%#08llx",
insn >> 32);
break;
+
default:
- abort ();
+ return -1;
}
info->insn_type = dis_noninsn;