From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf1-x430.google.com (mail-pf1-x430.google.com [IPv6:2607:f8b0:4864:20::430]) by sourceware.org (Postfix) with ESMTPS id 42AFA3857C41 for ; Wed, 23 Aug 2023 01:42:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 42AFA3857C41 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-x430.google.com with SMTP id d2e1a72fcca58-68a40d8557eso2040440b3a.1 for ; Tue, 22 Aug 2023 18:42:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1692754927; x=1693359727; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :from:to:cc:subject:date:message-id:reply-to; bh=2FQh3c6GV3dd0LqkJoYDKHU+WWxxNX+GrpbZy5JJNKk=; b=rpVOXRqeDkLfftNSnmGjP0zCbX7ENO02h7TreqEzkj2GrP2QcFAOc8Bvv572N+N8Bw SYsTwf/Xeqft/CUO0hG38OgnqDAg8YcEfow3SEZN5pYHPMbPsKaC4NO9RP1gMdk8DJTl NgoH5ziWSDiFd6iGs3XBvYdJ+1IlQppdrToeN639q8lQ06+YNDmXJwZTWnW8m5bN9qRx NsFJBeRGxn4vnLl/o05wWLZV0oqYkfOF4UCCPFkI1ILBfCwOqJriVIA1JYvSst7gcPWY RZszePQg000amqJc2tW3PyqdO1tXIPyFCCjAWlnRu8uM9T0heNStvmR3Xkve+16HBQVy gTkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1692754927; x=1693359727; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=2FQh3c6GV3dd0LqkJoYDKHU+WWxxNX+GrpbZy5JJNKk=; b=T3Q2srxAc33SCakjTlKVUfXb+7PXwDTBdUUtONllZ0MGpxmUwsUEaxQq/9OOit/oNF k9H+7Mhj09Dk9jKb1Sc9ya1LUHMzxW2TzNUkGjGVutdR4+zMrb3GQvCnIz7Hj89d/Tbr C8kaXfEv4s6Uh6aTJZBCA1LNzY9HPqU9zmjvza2o7qsoeRm0v6awaD1YQWKlGH/3Patv qAJQHR6rEfZQx7AluFjo8AcYMHZnBAX+43/NFzmZvs5nw2Ur1wKz4Zjk/0sBmVfPyxka uIWzxYjtyKVTlRziDRnTFE6pyBele9B0a2H4ep2NpJNF569CVzVKMHniFdrpELpXHFCD nrUw== X-Gm-Message-State: AOJu0YzxeRYmMOHjljoqkhiT4y0aF6ZiX2e/2Vx9qojZOrhSMUhZIu4u r2AQv7nRexzMbiqAGLWIs6C/t8Se0LVaJg== X-Google-Smtp-Source: AGHT+IHPCW+qTtqyJXQ9ZTXzm0/p4Et5/vDI1IuOyj/TDBVt+Frjn+P2wKz0wDvXmOZ14M3AiKu6ig== X-Received: by 2002:a05:6a00:23d5:b0:687:9909:3c78 with SMTP id g21-20020a056a0023d500b0068799093c78mr14511262pfc.0.1692754927231; Tue, 22 Aug 2023 18:42:07 -0700 (PDT) Received: from squeak.grove.modra.org ([2406:3400:51d:8cc0:ead0:eed5:cfa5:cc5d]) by smtp.gmail.com with ESMTPSA id s26-20020a639e1a000000b0055b5f206ea2sm8521994pgd.39.2023.08.22.18.42.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 22 Aug 2023 18:42:06 -0700 (PDT) Received: by squeak.grove.modra.org (Postfix, from userid 1000) id B02D811423E0; Wed, 23 Aug 2023 11:12:03 +0930 (ACST) Date: Wed, 23 Aug 2023 11:12:03 +0930 From: Alan Modra To: binutils@sourceware.org Cc: Paul Iannetta Subject: kvx bfd signed calculations and _bfd_kvx_elf_resolve_relocation Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-3033.7 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 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: It is generally a good idea to avoid signed arithmetic on values extracted from object files, to avoid ubsan warnings on overflow. This patch replaces some uses of bfd_signed_vma in the kvx backend with bfd_vma, and removes _bfd_kvx_elf_resolve_relocation, a do-nothing function. In the process of making this patch I noticed some dead code in the GOT entry handling, setting value to got_entry_addr but using "off" in the _bfd_final_link_relocate call. Since kvx_calculate_got_entry_vma also returns the GOT offset, I presume the code is correct, but I've left the dead code and comment there for someone else to fix. * elfxx-kvx.h (_bfd_kvx_elf_resolve_relocation): Delete. * elfxx-kvx.c (kvx_signed_overflow): Rewrite using unsigned arithmetic. (_bfd_kvx_elf_resolve_relocation): Delete. * elfnn-kvx.c (kvx_relocate): Update for _bfd_kvx_elf_resolve_relocation removal. (elfNN_kvx_final_link_relocate): Likewise. Don't use a signed addend. diff --git a/bfd/elfnn-kvx.c b/bfd/elfnn-kvx.c index ff2bdb64894..467d91fea53 100644 --- a/bfd/elfnn-kvx.c +++ b/bfd/elfnn-kvx.c @@ -670,14 +670,9 @@ kvx_relocate (unsigned int r_type, bfd *input_bfd, asection *input_section, bfd_vma offset, bfd_vma value) { reloc_howto_type *howto; - bfd_vma place; howto = elfNN_kvx_howto_from_type (input_bfd, r_type); - place = (input_section->output_section->vma + input_section->output_offset - + offset); - r_type = elfNN_kvx_bfd_reloc_from_type (input_bfd, r_type); - value = _bfd_kvx_elf_resolve_relocation (r_type, place, value, 0, false); return _bfd_kvx_elf_put_addend (input_bfd, input_section->contents + offset, r_type, howto, value); @@ -2000,7 +1995,7 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, unsigned long r_symndx; bfd_byte *hit_data = contents + rel->r_offset; bfd_vma place, off; - bfd_signed_vma signed_addend; + bfd_vma addend; struct elf_kvx_link_hash_table *globals; bool weak_undef_p; asection *base_got; @@ -2030,8 +2025,8 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, /* Get addend, accumulating the addend for consecutive relocs which refer to the same offset. */ - signed_addend = saved_addend ? *saved_addend : 0; - signed_addend += rel->r_addend; + addend = saved_addend ? *saved_addend : 0; + addend += rel->r_addend; weak_undef_p = (h ? h->root.type == bfd_link_hash_undefweak : bfd_is_und_section (sym_sec)); @@ -2078,7 +2073,7 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, skip = false; relocate = false; - outrel.r_addend = signed_addend; + outrel.r_addend = addend; outrel.r_offset = _bfd_elf_section_offset (output_bfd, info, input_section, rel->r_offset); @@ -2160,24 +2155,24 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, return bfd_reloc_ok; rret = check_signed_overflow (complain_overflow_signed, bfd_r_type, - input_bfd, value + signed_addend); + input_bfd, value + addend); if (rret != bfd_reloc_ok) return rret; return _bfd_final_link_relocate (howto, input_bfd, input_section, contents, rel->r_offset, value, - signed_addend); + addend); } skip_because_pic: rret = check_signed_overflow (complain_overflow_signed, bfd_r_type, - input_bfd, value + signed_addend); + input_bfd, value + addend); if (rret != bfd_reloc_ok) return rret; return _bfd_final_link_relocate (howto, input_bfd, input_section, contents, rel->r_offset, value, - signed_addend); + addend); break; case BFD_RELOC_KVX_PCREL17: @@ -2231,7 +2226,7 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, + stub_entry->stub_sec->output_section->vma); /* We have redirected the destination to stub entry address, so ignore any addend record in the original rela entry. */ - signed_addend = 0; + addend = 0; } } *unresolved_reloc_p = false; @@ -2250,7 +2245,7 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, case BFD_RELOC_KVX_S43_PCREL_EX6: return _bfd_final_link_relocate (howto, input_bfd, input_section, contents, rel->r_offset, value, - signed_addend); + addend); break; case BFD_RELOC_KVX_S37_TLS_LE_LO10: @@ -2261,8 +2256,7 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, case BFD_RELOC_KVX_S43_TLS_LE_EX6: return _bfd_final_link_relocate (howto, input_bfd, input_section, contents, rel->r_offset, - value - tpoff_base (info), - signed_addend); + value - tpoff_base (info), addend); break; case BFD_RELOC_KVX_S37_TLS_DTPOFF_LO10: @@ -2273,8 +2267,7 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, case BFD_RELOC_KVX_S43_TLS_DTPOFF_EX6: return _bfd_final_link_relocate (howto, input_bfd, input_section, contents, rel->r_offset, - value - dtpoff_base (info), - signed_addend); + value - dtpoff_base (info), addend); case BFD_RELOC_KVX_S37_TLS_GD_UP27: case BFD_RELOC_KVX_S37_TLS_GD_LO10: @@ -2302,8 +2295,7 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, value = symbol_got_offset (input_bfd, h, r_symndx); _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, value, - signed_addend); + contents, rel->r_offset, value, addend); *unresolved_reloc_p = false; break; @@ -2326,7 +2318,7 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, return _bfd_final_link_relocate (howto, input_bfd, input_section, contents, rel->r_offset, value, - signed_addend); + addend); } break; @@ -2347,7 +2339,7 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, value -= basegot->output_section->vma + basegot->output_offset; return _bfd_final_link_relocate (howto, input_bfd, input_section, contents, rel->r_offset, value, - signed_addend); + addend); } break; @@ -2373,18 +2365,15 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, printf("GOT_LO/HI for %s, value %x\n", h->root.root.string, value); #endif - /* value = _bfd_kvx_elf_resolve_relocation (bfd_r_type, place, value, */ - /* 0, weak_undef_p); */ return _bfd_final_link_relocate (howto, input_bfd, input_section, contents, rel->r_offset, value, - signed_addend); + addend); } else { #ifdef UGLY_DEBUG printf("GOT_LO/HI with h NULL, initial value %x\n", value); #endif - bfd_vma addend = 0; struct elf_kvx_local_symbol *locals = elf_kvx_locals (input_bfd); if (locals == NULL) @@ -2433,8 +2422,7 @@ elfNN_kvx_final_link_relocate (reloc_howto_type *howto, value = got_entry_addr; return _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, off, - addend); + contents, rel->r_offset, off, 0); } break; diff --git a/bfd/elfxx-kvx.c b/bfd/elfxx-kvx.c index 8b41e26d027..c3c6cdad282 100644 --- a/bfd/elfxx-kvx.c +++ b/bfd/elfxx-kvx.c @@ -46,13 +46,12 @@ kvx_unsigned_overflow (bfd_vma value, unsigned int bits) static bfd_reloc_status_type kvx_signed_overflow (bfd_vma value, unsigned int bits) { - bfd_signed_vma svalue = (bfd_signed_vma) value; - bfd_signed_vma lim; + bfd_vma lim; if (bits >= sizeof (bfd_vma) * 8) return bfd_reloc_ok; - lim = (bfd_signed_vma) 1 << (bits - 1); - if (svalue < -lim || svalue >= lim) + lim = (bfd_vma) 1 << (bits - 1); + if (value + lim >= lim * 2) return bfd_reloc_overflow; return bfd_reloc_ok; } @@ -150,14 +149,6 @@ _bfd_kvx_elf_put_addend (bfd *abfd, return status; } -bfd_vma -_bfd_kvx_elf_resolve_relocation (bfd_reloc_code_real_type r_type ATTRIBUTE_UNUSED, - bfd_vma place ATTRIBUTE_UNUSED, bfd_vma value, - bfd_vma addend ATTRIBUTE_UNUSED, bool weak_undef_p ATTRIBUTE_UNUSED) -{ - return value; -} - bool _bfd_kvx_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) { diff --git a/bfd/elfxx-kvx.h b/bfd/elfxx-kvx.h index 06ddc3c8616..0e8d800dd48 100644 --- a/bfd/elfxx-kvx.h +++ b/bfd/elfxx-kvx.h @@ -51,11 +51,6 @@ extern bfd_reloc_status_type _bfd_kvx_elf_put_addend (bfd *, bfd_byte *, bfd_reloc_code_real_type, reloc_howto_type *, bfd_signed_vma); -bfd_vma -_bfd_kvx_elf_resolve_relocation (bfd_reloc_code_real_type r_type, - bfd_vma place, bfd_vma value, - bfd_vma addend, bool weak_undef_p); - bool kvx_elf32_init_stub_bfd (struct bfd_link_info *info, bfd *stub_bfd); -- Alan Modra Australia Development Lab, IBM