From patchwork Tue Sep 1 02:33:17 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matt Turner X-Patchwork-Id: 142578 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4E5264BA79BA for ; Tue, 1 Sep 2026 02:38:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4E5264BA79BA Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=AU+Fw/il X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-yw1-x112f.google.com (mail-yw1-x112f.google.com [IPv6:2607:f8b0:4864:20::112f]) by sourceware.org (Postfix) with ESMTPS id AB10C4BA9019 for ; Tue, 1 Sep 2026 02:33:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AB10C4BA9019 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org AB10C4BA9019 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::112f ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788230021; cv=none; b=j2QFYkH+MduuD3DW46OOkgdtj4iJSWQTTGmtuZfwMGPdKp8tqEpBNqGaBPeu2NJmjdk3sSkssB3Nrx0mJuzoIAT3Eq+kYPhuJWitgGD5YdtgsbtmHGm300+YTXINhlmgiZl4YYU56vYxOBRNTWuWPAn/Dh2ZQgVXpzzperhZtLg= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788230021; c=relaxed/simple; bh=K2FEwqo7b5rd5PF1Lp/DPs/j6sHOPx7CxSEZsBYMHlo=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=n46LYdh5/4IOoDQ6ARykkpP9WxrtgOnNHKpjOxvtPuE/v60z3GX26FPqNYjErjKayPhJI5AagBBCc82I6B+f7uXWYtuEaE418FtaRV/qR8dO95iBkKQOoyOT4BhcdpNc4qUNYVD3ah60dsMX00Un2pcLAQqNG1I7U/lt6+WiR+c= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=AU+Fw/il DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AB10C4BA9019 Received: by mail-yw1-x112f.google.com with SMTP id 00721157ae682-855de2d0d4dso8560337b3.0 for ; Mon, 31 Aug 2026 19:33:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788230021; x=1788834821; darn=sourceware.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=lgqmmSwtF0bXMuqSjWRgImH6ZdYCtVx4oCvJ7W6zPdU=; b=AU+Fw/ilMBQwtnz9E3W6SMb8Oc2a/LBmIXBerYz7+dV25lLHXeMdCWH0TnkPK+JsRR y1G3PwfxWpaofBE+R0g03/o1cvUQWw3yTLgNo+li/tcCSyb58q+CFTne2F9EEnsW+SuH m6cZn5IG6JDagq0twysAN5AIExd67NIumpwwSKu6CJNd76G4Z356jsfkXGdlmir0jGXU Tk7i77Ci4eHIiEc+VNJlhp0YX86agiPiSAmotSKNlnBTDU210GJAqlI8DSs45O7CMGs3 t3Odj+jaRAkiLnMXkoqta5lh6+p9JbwjdpDbFa33pyoSZlpZxCM/TRvc6SIeXvpFaptb en5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788230021; x=1788834821; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=lgqmmSwtF0bXMuqSjWRgImH6ZdYCtVx4oCvJ7W6zPdU=; b=PbI39qnZipXzyek9vcwbMVJxPe6kTGYXPJAd1ZyTS3XjqOp70luFO5QBe4uO6s2QMG T0YfuEmYyPxY9Xnv8KAirG5z8cjAXQlZhRpmx/q6G/bBhEDlfRfClU7J5Pp242Ejll2g 0oQfGhiI+g/rS4ocsg/WGV0NT7Bib57J+pUY0ifQrlN5nLuyph4vQCk+v+231Qs6MTl8 hGYbA/sMzL8yCwmtLdhJQ+asvY2Y32tasZQt1yYmb6S/xQmmNZBzjWakJobZWB4q58lf /IYmeLoFFdJDboQKc5+JBDXvuErNtYoEnrHEIn0TWKh2sAdwkCOPGU/uDHVwjEV34CtU /lNw== X-Gm-Message-State: AFuF++nuP/ogkmm9CSYWYM9XRhOyu6GdeC9u6zLqpOsc/Tdrwlr8nDUK VkmwTouKyCshfnY/iXdlmqcNGQQMb8zMjz5/BsDeoL9SjNx9GtEFbRlQSmYbkQ== X-Gm-Gg: AYBFou3LuHhEfv3fUw1sIS83J+GnHJDOyzghAjmLrSb64yUreeBCmhFF0RBGZooXKsF gb2X9IESsaqIB3EJ+7EUPdPxaRzkDFf5Tk14s24qfzfEuxr10xs0MPIhn3GK72km/p0eAJo6N0V rQwz3JRvPAu4Hr8drPIDDTnKmZBXhZl+PpErb3PtHTv6mSrBmjuANqMVSuFJAMqV/LFUuVg68U0 NgyU58DvLk5KfVprGlSyZ2ViGow/Yd42W09W+CX+1ck1HmYCRIEK56UY28fciyi2z/Sc+tCWUcI IUylzktKHglZSEN4FkKRAKKR5BJvxcECwPtWjYNKJ6pBUdSqJnKotcs1YN7Wy0mShjJI7NKuYRH GLlx21hrs/Xu5lSyjNhUNa9/+9vomjlMgRsXhxgXUE2aEWtdHyqTQdXGvvpopS3PuwIZuW2Zdwm mNEp1cqc/nFxewKg7rtbqRVO6je7gzia4IB3WW2mmhN4ZNBMb67pwc40dqQsnwcHR7AEOg76Omo cNoLkVnYPhWlzBhLf7kLBwyOZWkPkxUMBfSiz+L X-Received: by 2002:a05:690c:83:b0:861:7cb6:5790 with SMTP id 00721157ae682-869487f617amr10433527b3.4.1788230020954; Mon, 31 Aug 2026 19:33:40 -0700 (PDT) Received: from localhost (107-220-129-194.lightspeed.chrlnc.sbcglobal.net. [107.220.129.194]) by smtp.gmail.com with ESMTPSA id 00721157ae682-85e65f146f8sm65271647b3.29.2026.08.31.19.33.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2026 19:33:40 -0700 (PDT) From: Matt Turner To: binutils@sourceware.org Cc: Magnus Lindholm , Alan Modra , Matt Turner Subject: [PATCH 10/11] alpha: reject a non-zero addend on a reference to an IFUNC Date: Mon, 31 Aug 2026 22:33:17 -0400 Message-ID: <20260901023318.3503991-11-mattst88@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260901023318.3503991-1-mattst88@gmail.com> References: <20260901023318.3503991-1-mattst88@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org An R_ALPHA_IRELATIVE carries the address of the resolver in its addend, so there is no room in it for an offset from the symbol. A reference that gets one, from an R_ALPHA_LITERAL or an R_ALPHA_REFQUAD, therefore cannot have an addend. Nothing diagnosed that. A reference that the dynamic linker resolves is not affected: it keeps the addend of the symbolic relocation it gets instead, and a shared library that takes the address of one of its own IFUNCs at an offset still links. A local symbol in such a library does not bind dynamically, though, so it is rejected there too. --- bfd/elf64-alpha.c | 21 +++++++++++++++++++ ld/testsuite/ld-alpha/ifunc-addend-literal.d | 3 +++ ld/testsuite/ld-alpha/ifunc-addend-literal.s | 19 +++++++++++++++++ ld/testsuite/ld-alpha/ifunc-addend-local.s | 13 ++++++++++++ ld/testsuite/ld-alpha/ifunc-addend-refquad.d | 3 +++ ld/testsuite/ld-alpha/ifunc-addend-refquad.s | 20 ++++++++++++++++++ .../ld-alpha/ifunc-addend-shared-local.d | 3 +++ ld/testsuite/ld-alpha/ifunc-addend-shared.d | 11 ++++++++++ 8 files changed, 93 insertions(+) create mode 100644 ld/testsuite/ld-alpha/ifunc-addend-literal.d create mode 100644 ld/testsuite/ld-alpha/ifunc-addend-literal.s create mode 100644 ld/testsuite/ld-alpha/ifunc-addend-local.s create mode 100644 ld/testsuite/ld-alpha/ifunc-addend-refquad.d create mode 100644 ld/testsuite/ld-alpha/ifunc-addend-refquad.s create mode 100644 ld/testsuite/ld-alpha/ifunc-addend-shared-local.d create mode 100644 ld/testsuite/ld-alpha/ifunc-addend-shared.d diff --git ./bfd/elf64-alpha.c ./bfd/elf64-alpha.c index 09e3778f3a9..d8f1a3bbf48 100644 --- ./bfd/elf64-alpha.c +++ ./bfd/elf64-alpha.c @@ -4686,6 +4686,27 @@ elf64_alpha_relocate_section (struct bfd_link_info *info, break; } + /* An R_ALPHA_IRELATIVE carries the address of the resolver in its + addend, so there is no room in it for an offset from the symbol. + A reference the dynamic linker resolves is not affected: it keeps + the addend of the symbolic relocation it gets instead. */ + if (addend != 0 + && elf64_alpha_ifunc_reloc_p (r_type) + && elf64_alpha_ifunc_p (h, sym) + && (input_section->flags & SEC_ALLOC) + && (elf64_alpha_ifunc_irelplt_p (h, sym, info) + || (bfd_link_pic (info) && !dynamic_symbol_p))) + { + _bfd_error_handler + /* xgettext:c-format */ + (_("%pB: %s relocation against STT_GNU_IFUNC symbol `%s' has a " + "non-zero addend"), + input_bfd, howto->name, + elf64_alpha_sym_name (input_bfd, symtab_hdr, h, sym, sec)); + ret_val = false; + continue; + } + switch (r_type) { case R_ALPHA_GPDISP: diff --git ./ld/testsuite/ld-alpha/ifunc-addend-literal.d ./ld/testsuite/ld-alpha/ifunc-addend-literal.d new file mode 100644 index 00000000000..2ea6b7df5a5 --- /dev/null +++ ./ld/testsuite/ld-alpha/ifunc-addend-literal.d @@ -0,0 +1,3 @@ +#source: ifunc-addend-literal.s +#ld: -melf64alpha +#error: \A[^\n]*: ELF_LITERAL relocation against STT_GNU_IFUNC symbol `global_ifunc' has a non-zero addend\n[^\n]*: final link failed[^\n]*\n?\Z diff --git ./ld/testsuite/ld-alpha/ifunc-addend-literal.s ./ld/testsuite/ld-alpha/ifunc-addend-literal.s new file mode 100644 index 00000000000..c7c96d2f460 --- /dev/null +++ ./ld/testsuite/ld-alpha/ifunc-addend-literal.s @@ -0,0 +1,19 @@ + .text + + .globl global_ifunc + .type global_ifunc, @gnu_indirect_function +global_ifunc: + ret + ret + + # An IRELATIVE's addend is the address of the resolver, so a + # reference to an IFUNC cannot carry an offset. + .globl _start + .ent _start +_start: + ldgp $29, 0($27) + ldq $27, global_ifunc+4($29) !literal!1 + jsr $26, ($27), 0 !lituse_jsr!1 + ldgp $29, 0($26) + ret + .end _start diff --git ./ld/testsuite/ld-alpha/ifunc-addend-local.s ./ld/testsuite/ld-alpha/ifunc-addend-local.s new file mode 100644 index 00000000000..1aa9138979a --- /dev/null +++ ./ld/testsuite/ld-alpha/ifunc-addend-local.s @@ -0,0 +1,13 @@ + .text + + .type local_ifunc, @gnu_indirect_function +local_ifunc: + ret + ret + + # A local symbol is not preemptible, so even in a shared library the + # reference becomes an R_ALPHA_IRELATIVE and cannot carry an offset. + .data + .globl ptr +ptr: + .quad local_ifunc+4 diff --git ./ld/testsuite/ld-alpha/ifunc-addend-refquad.d ./ld/testsuite/ld-alpha/ifunc-addend-refquad.d new file mode 100644 index 00000000000..d4a912a9438 --- /dev/null +++ ./ld/testsuite/ld-alpha/ifunc-addend-refquad.d @@ -0,0 +1,3 @@ +#source: ifunc-addend-refquad.s +#ld: -melf64alpha +#error: \A[^\n]*: REFQUAD relocation against STT_GNU_IFUNC symbol `global_ifunc' has a non-zero addend\n[^\n]*: final link failed[^\n]*\n?\Z diff --git ./ld/testsuite/ld-alpha/ifunc-addend-refquad.s ./ld/testsuite/ld-alpha/ifunc-addend-refquad.s new file mode 100644 index 00000000000..95d6dfc1daa --- /dev/null +++ ./ld/testsuite/ld-alpha/ifunc-addend-refquad.s @@ -0,0 +1,20 @@ + .text + + .globl global_ifunc + .type global_ifunc, @gnu_indirect_function +global_ifunc: + ret + ret + + .globl _start + .ent _start +_start: + ret + .end _start + + # An IRELATIVE's addend is the address of the resolver, so a + # reference to an IFUNC cannot carry an offset. + .data + .globl ptr +ptr: + .quad global_ifunc+4 diff --git ./ld/testsuite/ld-alpha/ifunc-addend-shared-local.d ./ld/testsuite/ld-alpha/ifunc-addend-shared-local.d new file mode 100644 index 00000000000..d3c25eb82aa --- /dev/null +++ ./ld/testsuite/ld-alpha/ifunc-addend-shared-local.d @@ -0,0 +1,3 @@ +#source: ifunc-addend-local.s +#ld: -shared -melf64alpha +#error: \A[^\n]*: REFQUAD relocation against STT_GNU_IFUNC symbol `local_ifunc' has a non-zero addend\n[^\n]*: final link failed[^\n]*\n?\Z diff --git ./ld/testsuite/ld-alpha/ifunc-addend-shared.d ./ld/testsuite/ld-alpha/ifunc-addend-shared.d new file mode 100644 index 00000000000..31bc77ba4c9 --- /dev/null +++ ./ld/testsuite/ld-alpha/ifunc-addend-shared.d @@ -0,0 +1,11 @@ +#source: ifunc-addend-refquad.s +#ld: -shared -melf64alpha +#readelf: -Wr + +# The IFUNC is preemptible here, so the dynamic linker resolves it and the +# relocation keeps its addend. Nothing turns into an IRELATIVE, so the +# addend is not rejected. +Relocation section '\.rela\.dyn' .* contains 1 entry: +#... +[0-9a-f]+ +[0-9a-f]+ +R_ALPHA_REFQUAD .*global_ifunc \+ 4 +#pass