PR24065, 32-bit objcopy fails with 64-bit address ... out of range
PR 23699 PR 24065 * ihex.c (ihex_write_object_contents): Properly check 32-bit address range.
This commit is contained in:
parent
171b8e1957
commit
a9859e0172
|
@ -1,3 +1,10 @@
|
|||
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.
|
||||
|
|
34
bfd/ihex.c
34
bfd/ihex.c
|
@ -775,25 +775,29 @@ ihex_write_object_contents (bfd *abfd)
|
|||
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;
|
||||
|
|
Loading…
Reference in New Issue