Merge branch 'master' into merge-job
[deliverable/binutils-gdb.git] / bfd / ihex.c
index 2ccc7073c0b7bc060b42e647e164d0678451bd5f..4c8c249032abef789ed3e7e456532dc8cf6f552d 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for Intel Hex objects.
-   Copyright (C) 1995-2018 Free Software Foundation, Inc.
+   Copyright (C) 1995-2020 Free Software Foundation, Inc.
    Written by Ian Lance Taylor of Cygnus Support <ian@cygnus.com>.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -227,7 +227,7 @@ ihex_bad_byte (bfd *abfd, unsigned int lineno, int c, bfd_boolean error)
        }
       _bfd_error_handler
        /* xgettext:c-format */
-       (_("%B:%d: unexpected character `%s' in Intel Hex file"),
+       (_("%pB:%d: unexpected character `%s' in Intel Hex file"),
         abfd, lineno, buf);
       bfd_set_error (bfd_error_bad_value);
     }
@@ -335,7 +335,7 @@ ihex_scan (bfd *abfd)
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B:%u: bad checksum in Intel Hex file (expected %u, found %u)"),
+               (_("%pB:%u: bad checksum in Intel Hex file (expected %u, found %u)"),
                 abfd, lineno,
                 (- chksum) & 0xff, (unsigned int) HEX2 (buf + 2 * i));
              bfd_set_error (bfd_error_bad_value);
@@ -391,7 +391,7 @@ ihex_scan (bfd *abfd)
                {
                  _bfd_error_handler
                    /* xgettext:c-format */
-                   (_("%B:%u: bad extended address record length in Intel Hex file"),
+                   (_("%pB:%u: bad extended address record length in Intel Hex file"),
                     abfd, lineno);
                  bfd_set_error (bfd_error_bad_value);
                  goto error_return;
@@ -409,7 +409,7 @@ ihex_scan (bfd *abfd)
                {
                  _bfd_error_handler
                    /* xgettext:c-format */
-                   (_("%B:%u: bad extended start address length in Intel Hex file"),
+                   (_("%pB:%u: bad extended start address length in Intel Hex file"),
                     abfd, lineno);
                  bfd_set_error (bfd_error_bad_value);
                  goto error_return;
@@ -427,7 +427,7 @@ ihex_scan (bfd *abfd)
                {
                  _bfd_error_handler
                    /* xgettext:c-format */
-                   (_("%B:%u: bad extended linear address record length in Intel Hex file"),
+                   (_("%pB:%u: bad extended linear address record length in Intel Hex file"),
                     abfd, lineno);
                  bfd_set_error (bfd_error_bad_value);
                  goto error_return;
@@ -445,7 +445,7 @@ ihex_scan (bfd *abfd)
                {
                  _bfd_error_handler
                    /* xgettext:c-format */
-                   (_("%B:%u: bad extended linear start address length in Intel Hex file"),
+                   (_("%pB:%u: bad extended linear start address length in Intel Hex file"),
                     abfd, lineno);
                  bfd_set_error (bfd_error_bad_value);
                  goto error_return;
@@ -463,7 +463,7 @@ ihex_scan (bfd *abfd)
            default:
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B:%u: unrecognized ihex type %u in Intel Hex file"),
+               (_("%pB:%u: unrecognized ihex type %u in Intel Hex file"),
                 abfd, lineno, type);
              bfd_set_error (bfd_error_bad_value);
              goto error_return;
@@ -582,7 +582,7 @@ ihex_read_section (bfd *abfd, asection *section, bfd_byte *contents)
       if (type != 0)
        {
          _bfd_error_handler
-           (_("%B: internal error in ihex_read_section"), abfd);
+           (_("%pB: internal error in ihex_read_section"), abfd);
          bfd_set_error (bfd_error_bad_value);
          goto error_return;
        }
@@ -616,7 +616,7 @@ ihex_read_section (bfd *abfd, asection *section, bfd_byte *contents)
   if ((bfd_size_type) (p - contents) < section->size)
     {
       _bfd_error_handler
-       (_("%B: bad section length in ihex_read_section"), abfd);
+       (_("%pB: bad section length in ihex_read_section"), abfd);
       bfd_set_error (bfd_error_bad_value);
       goto error_return;
     }
@@ -777,6 +777,28 @@ ihex_write_object_contents (bfd *abfd)
       bfd_size_type count;
 
       where = l->where;
+
+#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;
 
@@ -827,8 +849,9 @@ ihex_write_object_contents (bfd *abfd)
                    {
                      _bfd_error_handler
                        /* xgettext:c-format */
-                       (_("%B: address %#Lx out of range for Intel Hex file"),
-                        abfd, where);
+                       (_("%pB: address %#" PRIx64
+                          " out of range for Intel Hex file"),
+                        abfd, (uint64_t) where);
                      bfd_set_error (bfd_error_bad_value);
                      return FALSE;
                    }
@@ -939,9 +962,11 @@ ihex_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
 #define ihex_bfd_lookup_section_flags            bfd_generic_lookup_section_flags
 #define ihex_bfd_merge_sections                          bfd_generic_merge_sections
 #define ihex_bfd_is_group_section                bfd_generic_is_group_section
+#define ihex_bfd_group_name                      bfd_generic_group_name
 #define ihex_bfd_discard_group                   bfd_generic_discard_group
 #define ihex_section_already_linked              _bfd_generic_section_already_linked
 #define ihex_bfd_define_common_symbol            bfd_generic_define_common_symbol
+#define ihex_bfd_link_hide_symbol                _bfd_generic_link_hide_symbol
 #define ihex_bfd_define_start_stop               bfd_generic_define_start_stop
 #define ihex_bfd_link_hash_table_create                  _bfd_generic_link_hash_table_create
 #define ihex_bfd_link_add_symbols                _bfd_generic_link_add_symbols
This page took 0.026151 seconds and 4 git commands to generate.