PR11290, avr-ld "out of range error" is confusing
authorAlan Modra <amodra@gmail.com>
Thu, 25 Aug 2022 06:27:02 +0000 (15:57 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 25 Aug 2022 07:50:01 +0000 (17:20 +0930)
Don't overload bfd_reloc_outofrange with what is really a domain error
(target at odd address), or an overflow.

PR 11290
* reloc.c (bfd_reloc_other): Correct comment.
* elf32-avr.c (avr_final_link_relocate): Return bfd_reloc_other
for unaligned reloc target values.  Return bfd_reloc_overflow
when stubs are too far away and when R_AVR_LDS_STS_16,
R_AVR_PORT6, or R_AVR_PORT5 overflow.
(elf32_avr_relocate_section): Report more descriptive relocation
errors.
* bfd-in2.h: Regenerate.

bfd/bfd-in2.h
bfd/elf32-avr.c
bfd/reloc.c

index 4ab7e2d69347fc8d707094c18b29e1b32ecfcd69..6aefdd7cdb2dd84d6f5476cd00484597566fa07e 100644 (file)
@@ -1977,7 +1977,7 @@ typedef enum bfd_reloc_status
   /* Unsupported relocation size requested.  */
   bfd_reloc_notsupported,
 
-  /* Unused.  */
+  /* Target specific meaning.  */
   bfd_reloc_other,
 
   /* The symbol to relocate against was undefined.  */
index 8c003d0553b3eacc03811e9c85f633d07cd66a08..f8b89930ef5f3b33bf86956c80e37aae37d73d15 100644 (file)
@@ -1048,7 +1048,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
               input_section->output_offset);
 
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       if (srel > ((1 << 7) - 1) || (srel < - (1 << 7)))
        return bfd_reloc_overflow;
       x = bfd_get_16 (input_bfd, contents);
@@ -1066,7 +1066,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
               input_section->output_offset);
 
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
 
       srel = avr_relative_distance_considering_wrap_around (srel);
 
@@ -1228,11 +1228,11 @@ avr_final_link_relocate (reloc_howto_type *                 howto,
                    (unsigned int) reloc_addr);
 
          if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
-           return bfd_reloc_outofrange;
+           return bfd_reloc_overflow;
        }
 
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       x = bfd_get_16 (input_bfd, contents);
       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
@@ -1261,11 +1261,11 @@ avr_final_link_relocate (reloc_howto_type *                 howto,
                    (unsigned int) reloc_addr);
 
          if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
-           return bfd_reloc_outofrange;
+           return bfd_reloc_overflow;
        }
 
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       srel = (srel >> 8) & 0xff;
       x = bfd_get_16 (input_bfd, contents);
@@ -1277,7 +1277,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       contents += rel->r_offset;
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       srel = (srel >> 16) & 0xff;
       x = bfd_get_16 (input_bfd, contents);
@@ -1290,7 +1290,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       srel = -srel;
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       x = bfd_get_16 (input_bfd, contents);
       x = (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00);
@@ -1302,7 +1302,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       srel = -srel;
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       srel = (srel >> 8) & 0xff;
       x = bfd_get_16 (input_bfd, contents);
@@ -1315,7 +1315,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       srel = -srel;
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       srel = (srel >> 16) & 0xff;
       x = bfd_get_16 (input_bfd, contents);
@@ -1327,7 +1327,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       contents += rel->r_offset;
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       x = bfd_get_16 (input_bfd, contents);
       x |= ((srel & 0x10000) | ((srel << 3) & 0x1f00000)) >> 16;
@@ -1355,11 +1355,11 @@ avr_final_link_relocate (reloc_howto_type *                 howto,
                    (unsigned int) reloc_addr);
 
          if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr))
-           return bfd_reloc_outofrange;
+           return bfd_reloc_overflow;
        }
 
       if (srel & 1)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_other;
       srel = srel >> 1;
       bfd_put_16 (input_bfd, (bfd_vma) srel &0x00ffff, contents);
       break;
@@ -1375,7 +1375,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       contents += rel->r_offset;
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       if ((srel & 0xFFFF) < 0x40 || (srel & 0xFFFF) > 0xbf)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_overflow;
       srel = srel & 0x7f;
       x = bfd_get_16 (input_bfd, contents);
       x |= (srel & 0x0f) | ((srel & 0x30) << 5) | ((srel & 0x40) << 2);
@@ -1386,7 +1386,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       contents += rel->r_offset;
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       if ((srel & 0xffff) > 0x3f)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_overflow;
       x = bfd_get_16 (input_bfd, contents);
       x = (x & 0xf9f0) | ((srel & 0x30) << 5) | (srel & 0x0f);
       bfd_put_16 (input_bfd, x, contents);
@@ -1396,7 +1396,7 @@ avr_final_link_relocate (reloc_howto_type *                   howto,
       contents += rel->r_offset;
       srel = (bfd_signed_vma) relocation + rel->r_addend;
       if ((srel & 0xffff) > 0x1f)
-       return bfd_reloc_outofrange;
+       return bfd_reloc_overflow;
       x = bfd_get_16 (input_bfd, contents);
       x = (x & 0xff07) | ((srel & 0x1f) << 3);
       bfd_put_16 (input_bfd, x, contents);
@@ -1489,8 +1489,6 @@ elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
 
       if (r != bfd_reloc_ok)
        {
-         const char * msg = (const char *) NULL;
-
          switch (r)
            {
            case bfd_reloc_overflow:
@@ -1505,25 +1503,29 @@ elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
              break;
 
            case bfd_reloc_outofrange:
-             msg = _("internal error: out of range error");
+             /* xgettext:c-format */
+             (*info->callbacks->einfo)
+               (_("%X%H: %s against `%s':"
+                  " error: relocation applies outside section\n"),
+                input_bfd, input_section, rel->r_offset, howto->name, name);
              break;
 
-           case bfd_reloc_notsupported:
-             msg = _("internal error: unsupported relocation error");
-             break;
-
-           case bfd_reloc_dangerous:
-             msg = _("internal error: dangerous relocation");
+           case bfd_reloc_other:
+             /* xgettext:c-format */
+             (*info->callbacks->einfo)
+               (_("%X%H: %s against `%s':"
+                  " error: relocation target address is odd\n"),
+                input_bfd, input_section, rel->r_offset, howto->name, name);
              break;
 
            default:
-             msg = _("internal error: unknown error");
+             /* xgettext:c-format */
+             (*info->callbacks->einfo)
+               (_("%X%H: %s against `%s':"
+                  " internal error: unexpected relocation result %d\n"),
+                input_bfd, input_section, rel->r_offset, howto->name, name, r);
              break;
            }
-
-         if (msg)
-           (*info->callbacks->warning) (info, msg, name, input_bfd,
-                                        input_section, rel->r_offset);
        }
     }
 
index 268e4b13049d7695c20e56618cc7bc8435f6b6e7..89b6f7fd352ec79f995fc960fc168f065e4b0c7a 100644 (file)
@@ -82,7 +82,7 @@ CODE_FRAGMENT
 .  {* Unsupported relocation size requested.  *}
 .  bfd_reloc_notsupported,
 .
-.  {* Unused.  *}
+.  {* Target specific meaning.  *}
 .  bfd_reloc_other,
 .
 .  {* The symbol to relocate against was undefined.  *}