X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bfd%2Fihex.c;h=101e0a76155fc48f95312c08307739cf9c1ee5eb;hb=ed7fe196c6871115e9c5031c45682063a3eb7f1c;hp=5d7d8fffeaaabc992e3923866e679e7e1daaf644;hpb=827041555ac443bd57340060f3e034fd7b199dd8;p=external%2Fbinutils.git diff --git a/bfd/ihex.c b/bfd/ihex.c index 5d7d8ff..101e0a7 100644 --- a/bfd/ihex.c +++ b/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;