From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf1-x434.google.com (mail-pf1-x434.google.com [IPv6:2607:f8b0:4864:20::434]) by sourceware.org (Postfix) with ESMTPS id 767823850849 for ; Thu, 25 Aug 2022 07:49:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 767823850849 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-pf1-x434.google.com with SMTP id g19so639529pfb.0 for ; Thu, 25 Aug 2022 00:49:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :from:to:cc; bh=N5Jicq5A82HBpeiC7TUmIl8zh1eFsB4N5P/8qOPkoaQ=; b=fKMNMvr1T0RAOVEaqb1kqnv7cSKBlL5g3Q2UdI8DrnUE8sXfriwNx7ptDJk/m6cR75 Oy0RySkL1kofV9oP/GA57Vfaa6cZtFoeIevno/hZrc07vrB9qfam/bWe9rID668degdZ 17NcXSgsP2I2EVAI/uR6H7mnpUirVJHK+SLS9rlEiAl+wIidnsjhRtTcDFAOQDo10Ye+ +q1HNjQjNU5GDyDVQLdL6pcGoW9ntxuh3zud8fzou1egrI89fKOAuffkhFEnQ3cNOkuG R4fD6qg+jIqksCKJ0VMPQuflhU/RW+hLWOgUqrlZ+OZ8NlVou0lpnwbPoh6/WGuuYvKm Zm2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc; bh=N5Jicq5A82HBpeiC7TUmIl8zh1eFsB4N5P/8qOPkoaQ=; b=PRbkTEndAy0AqNUvZveIKPDQhDJQf9t1miyjbLnAI3LPyvYqtu8Q6KbW4sdkfIh2kS JsMZhUKcFOApafNomReGD2Y/gqyndlvkwVSemjjfLvEB44ZimYMrvTWUFCO6zsBpIcOa j7mQSCo9dXNoZtmQwJw2jHIY6/iiFZnpGwFBhUIdDADIcWgNrR+UYrgbG4vz2G9TtjXr GhVRQ6eUk3+VR3ViZaBz1el81WvqdaW3cZBtSAGZ90+4Sha7U801ijq1YjE5fD4K/4Cd bSboP3DMqz66M8Dza+ijGqSumsFIlhC8dC/6kqOz51adf+44n0NrWWR9mOuS0B33x4pU TG2A== X-Gm-Message-State: ACgBeo3mF625wlZ5qYQ3vc/avhzd15MBOanUszOhFALN6bFFpeGArbri vFleioVBU1gxCNETZw1jIyhKCdzM/cs= X-Google-Smtp-Source: AA6agR7afXHL/nWB4+itH86fwuGXhi0bkcf8dVKJA/EerLY9SH5FS7yXEFcxRzZsMUBEnCmB5jbjTg== X-Received: by 2002:a63:65c7:0:b0:42b:1eca:2b23 with SMTP id z190-20020a6365c7000000b0042b1eca2b23mr2314190pgb.97.1661413751396; Thu, 25 Aug 2022 00:49:11 -0700 (PDT) Received: from squeak.grove.modra.org (158.106.96.58.static.exetel.com.au. [58.96.106.158]) by smtp.gmail.com with ESMTPSA id u16-20020a17090341d000b00172aa97b628sm13822536ple.186.2022.08.25.00.49.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Aug 2022 00:49:10 -0700 (PDT) Received: by squeak.grove.modra.org (Postfix, from userid 1000) id A59671140FEB; Thu, 25 Aug 2022 17:19:07 +0930 (ACST) Date: Thu, 25 Aug 2022 17:19:07 +0930 From: Alan Modra To: binutils@sourceware.org Cc: Denis Chertykov , Marek Michalkiewicz Subject: PR11290, avr-ld "out of range error" for unaligned relocations is confusing Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-3036.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is an old PR I thought I'd have a go at fixing. If either of the AVR maintainers intensely dislikes my patch, feel free to revert it. The main change here is to not overload bfd_reloc_outofrange. 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 --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, - /* Unused. */ + /* Target specific meaning. */ bfd_reloc_other, /* 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 * 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); } } 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. *} -- Alan Modra Australia Development Lab, IBM