+2019-01-08 Alan Modra <amodra@gmail.com>
+
+ PR 23699
+ PR 24065
+ * ihex.c (ihex_write_object_contents): Properly check 32-bit
+ address range.
+
2019-01-05 Yoshinori Sato <ysato@users.sourceforge.jp>
* bfd/archures.c: Add bfd_mach_rx_v2 and bfd_mach_rx_v3.
bfd_vma where;
bfd_byte *p;
bfd_size_type count;
- const bfd_vma sign = (bfd_vma) 0xffffffff80000000ULL;
- const bfd_vma top = (bfd_vma) 0xffffffff00000000ULL;
where = l->where;
- /* Check for unacceptable addresses sign extension.
- See PR 23699 for more details. */
- if ((where & sign) == top
- || ((where & top) != 0 && (where & top) != top))
- {
- _bfd_error_handler
- /* xgettext:c-format */
- (_("%pB 64-bit address %#" PRIx64 " out of range for Intel Hex file"),
- abfd, (uint64_t) where);
- bfd_set_error (bfd_error_bad_value);
- return FALSE;
- }
-
+#ifdef BFD64
+ /* IHex only supports 32-bit addresses, and we want to check
+ that 64-bit addresses are in range. This isn't quite as
+ obvious as it may seem, since some targets have 32-bit
+ addresses that are sign extended to 64 bits. So complain
+ only if addresses overflow both unsigned and signed 32-bit
+ integers. */
+ if (where > 0xffffffff
+ && where + 0x80000000 > 0xffffffff)
+ {
+ _bfd_error_handler
+ /* xgettext:c-format */
+ (_("%pB 64-bit address %#" PRIx64
+ " out of range for Intel Hex file"),
+ abfd, (uint64_t) where);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
where &= 0xffffffff;
+#endif
p = l->data;
count = l->size;