From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1062) id CAB0F385381B; Thu, 25 Aug 2022 07:52:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CAB0F385381B Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Alan Modra To: bfd-cvs@sourceware.org Subject: [binutils-gdb] PR11290, avr-ld "out of range error" is confusing X-Act-Checkin: binutils-gdb X-Git-Author: Alan Modra X-Git-Refname: refs/heads/master X-Git-Oldrev: 45692d91e733233d667665750eabdba8ba98b227 X-Git-Newrev: c2d7de232bb9483af7a0633151edfec4ee52eeda Message-Id: <20220825075216.CAB0F385381B@sourceware.org> Date: Thu, 25 Aug 2022 07:52:16 +0000 (GMT) X-BeenThere: binutils-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Aug 2022 07:52:16 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3Dc2d7de232bb9= 483af7a0633151edfec4ee52eeda commit c2d7de232bb9483af7a0633151edfec4ee52eeda Author: Alan Modra Date: Thu Aug 25 15:57:02 2022 +0930 PR11290, avr-ld "out of range error" is confusing =20 Don't overload bfd_reloc_outofrange with what is really a domain error (target at odd address), or an overflow. =20 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. Diff: --- bfd/bfd-in2.h | 2 +- bfd/elf32-avr.c | 62 +++++++++++++++++++++++++++++------------------------= ---- bfd/reloc.c | 2 +- 3 files changed, 34 insertions(+), 32 deletions(-) diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 4ab7e2d6934..6aefdd7cdb2 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -1977,7 +1977,7 @@ typedef enum bfd_reloc_status /* Unsupported relocation size requested. */ bfd_reloc_notsupported, =20 - /* Unused. */ + /* Target specific meaning. */ bfd_reloc_other, =20 /* The symbol to relocate against was undefined. */ diff --git a/bfd/elf32-avr.c b/bfd/elf32-avr.c index 8c003d0553b..f8b89930ef5 100644 --- a/bfd/elf32-avr.c +++ b/bfd/elf32-avr.c @@ -1048,7 +1048,7 @@ avr_final_link_relocate (reloc_howto_type * howt= o, input_section->output_offset); =20 if (srel & 1) - return bfd_reloc_outofrange; + return bfd_reloc_other; if (srel > ((1 << 7) - 1) || (srel < - (1 << 7))) return bfd_reloc_overflow; x =3D bfd_get_16 (input_bfd, contents); @@ -1066,7 +1066,7 @@ avr_final_link_relocate (reloc_howto_type * howt= o, input_section->output_offset); =20 if (srel & 1) - return bfd_reloc_outofrange; + return bfd_reloc_other; =20 srel =3D avr_relative_distance_considering_wrap_around (srel); =20 @@ -1228,11 +1228,11 @@ avr_final_link_relocate (reloc_howto_type * ho= wto, (unsigned int) reloc_addr); =20 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr)) - return bfd_reloc_outofrange; + return bfd_reloc_overflow; } =20 if (srel & 1) - return bfd_reloc_outofrange; + return bfd_reloc_other; srel =3D srel >> 1; x =3D bfd_get_16 (input_bfd, contents); x =3D (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00); @@ -1261,11 +1261,11 @@ avr_final_link_relocate (reloc_howto_type * ho= wto, (unsigned int) reloc_addr); =20 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr)) - return bfd_reloc_outofrange; + return bfd_reloc_overflow; } =20 if (srel & 1) - return bfd_reloc_outofrange; + return bfd_reloc_other; srel =3D srel >> 1; srel =3D (srel >> 8) & 0xff; x =3D bfd_get_16 (input_bfd, contents); @@ -1277,7 +1277,7 @@ avr_final_link_relocate (reloc_howto_type * howt= o, contents +=3D rel->r_offset; srel =3D (bfd_signed_vma) relocation + rel->r_addend; if (srel & 1) - return bfd_reloc_outofrange; + return bfd_reloc_other; srel =3D srel >> 1; srel =3D (srel >> 16) & 0xff; x =3D bfd_get_16 (input_bfd, contents); @@ -1290,7 +1290,7 @@ avr_final_link_relocate (reloc_howto_type * howt= o, srel =3D (bfd_signed_vma) relocation + rel->r_addend; srel =3D -srel; if (srel & 1) - return bfd_reloc_outofrange; + return bfd_reloc_other; srel =3D srel >> 1; x =3D bfd_get_16 (input_bfd, contents); x =3D (x & 0xf0f0) | (srel & 0xf) | ((srel << 4) & 0xf00); @@ -1302,7 +1302,7 @@ avr_final_link_relocate (reloc_howto_type * howt= o, srel =3D (bfd_signed_vma) relocation + rel->r_addend; srel =3D -srel; if (srel & 1) - return bfd_reloc_outofrange; + return bfd_reloc_other; srel =3D srel >> 1; srel =3D (srel >> 8) & 0xff; x =3D bfd_get_16 (input_bfd, contents); @@ -1315,7 +1315,7 @@ avr_final_link_relocate (reloc_howto_type * howt= o, srel =3D (bfd_signed_vma) relocation + rel->r_addend; srel =3D -srel; if (srel & 1) - return bfd_reloc_outofrange; + return bfd_reloc_other; srel =3D srel >> 1; srel =3D (srel >> 16) & 0xff; x =3D bfd_get_16 (input_bfd, contents); @@ -1327,7 +1327,7 @@ avr_final_link_relocate (reloc_howto_type * howt= o, contents +=3D rel->r_offset; srel =3D (bfd_signed_vma) relocation + rel->r_addend; if (srel & 1) - return bfd_reloc_outofrange; + return bfd_reloc_other; srel =3D srel >> 1; x =3D bfd_get_16 (input_bfd, contents); x |=3D ((srel & 0x10000) | ((srel << 3) & 0x1f00000)) >> 16; @@ -1355,11 +1355,11 @@ avr_final_link_relocate (reloc_howto_type * ho= wto, (unsigned int) reloc_addr); =20 if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr)) - return bfd_reloc_outofrange; + return bfd_reloc_overflow; } =20 if (srel & 1) - return bfd_reloc_outofrange; + return bfd_reloc_other; srel =3D srel >> 1; bfd_put_16 (input_bfd, (bfd_vma) srel &0x00ffff, contents); break; @@ -1375,7 +1375,7 @@ avr_final_link_relocate (reloc_howto_type * howt= o, contents +=3D rel->r_offset; srel =3D (bfd_signed_vma) relocation + rel->r_addend; if ((srel & 0xFFFF) < 0x40 || (srel & 0xFFFF) > 0xbf) - return bfd_reloc_outofrange; + return bfd_reloc_overflow; srel =3D srel & 0x7f; x =3D bfd_get_16 (input_bfd, contents); x |=3D (srel & 0x0f) | ((srel & 0x30) << 5) | ((srel & 0x40) << 2); @@ -1386,7 +1386,7 @@ avr_final_link_relocate (reloc_howto_type * howt= o, contents +=3D rel->r_offset; srel =3D (bfd_signed_vma) relocation + rel->r_addend; if ((srel & 0xffff) > 0x3f) - return bfd_reloc_outofrange; + return bfd_reloc_overflow; x =3D bfd_get_16 (input_bfd, contents); x =3D (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 * howt= o, contents +=3D rel->r_offset; srel =3D (bfd_signed_vma) relocation + rel->r_addend; if ((srel & 0xffff) > 0x1f) - return bfd_reloc_outofrange; + return bfd_reloc_overflow; x =3D bfd_get_16 (input_bfd, contents); x =3D (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, =20 if (r !=3D bfd_reloc_ok) { - const char * msg =3D (const char *) NULL; - switch (r) { case bfd_reloc_overflow: @@ -1505,25 +1503,29 @@ elf32_avr_relocate_section (bfd *output_bfd ATTRIBU= TE_UNUSED, break; =20 case bfd_reloc_outofrange: - msg =3D _("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; =20 - case bfd_reloc_notsupported: - msg =3D _("internal error: unsupported relocation error"); - break; - - case bfd_reloc_dangerous: - msg =3D _("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; =20 default: - msg =3D _("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); } } =20 diff --git a/bfd/reloc.c b/bfd/reloc.c index 268e4b13049..89b6f7fd352 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -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. *}