From patchwork Fri Jun 23 11:39:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Modra X-Patchwork-Id: 112093 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp5704540vqr; Fri, 23 Jun 2023 04:39:23 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6Q9SYWoljq8BNmf+OatDpf5he/MBqUtzJiqVcHpmAb7/tzWS9IQSjf/uNAxfKK4Kkfioa5 X-Received: by 2002:a17:906:7953:b0:989:5a7d:f449 with SMTP id l19-20020a170906795300b009895a7df449mr8143782ejo.74.1687520362925; Fri, 23 Jun 2023 04:39:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687520362; cv=none; d=google.com; s=arc-20160816; b=bjJjUFqFVSEpJ+83RYhWKI02XqiG8PpKTkJl9UWV0Xb1UEZiKvH16AdjvtBA17o79t mYGbvLKbIoA9c07reoHlrbFmohy1vHHGiEq1kO+2zmaYww2t65wBm8uhwHEGJLa4Hy1q KJSaD961jfO060QSZpWs7pQf6OHnHmJ7aO6PRw1kkPaQ/PMsNESP0x04HpgnhV8yHuOR lwsxH/KMcXv7m7LbOmeC9EDxZujr8tbbgsdWRbNuOovG9OO0kid5Tr8vNt7Rk9fM0DCh Ic/IvSK7akzOGcx014GEl4YXLRptUgpaxkdrQoOYMxboOoG94fhSDDHoxpIuSqDLSKPT BE2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-disposition:mime-version:message-id:subject:to:date :dmarc-filter:delivered-to:dkim-signature:dkim-filter; bh=vVWW+VAaVAE0QB84p2tHdg0tyRI6EGnaIknFslhg7rY=; b=lttmHmz7hSLJK3izAjFPd+CW766HSaVi087sBLdHNmxmKUcdLwMxfVsACrbeaqzbVA V7CJZdUzFhRKhVg5ZZF57uSestCay5wpMWGuNPABTpWJt0fkM5hUSeSAYUsKm7zf1cNc YfoL0thacxLHkTdQvuuhD9HdvKnmFVj4Q2q7l5a7FIkqW/fdEA61BsjLeNw7vTP22ZlB Y+cvpQYw9jJPSjqPRHxum7eBw6sqCCHkz8PQYZ2knzUe70/X0BhJjMEwx1h3IH3EYwUW S/S9OB6qNrtvLVG2YQd3Mba+iDoS8+UBW5OzRcpz874fMoE5H6me8eo7zqEY+EjfA898 VIsQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=svmgd3Du; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id i6-20020a170906698600b0097434b00be4si2271905ejr.100.2023.06.23.04.39.22 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 Jun 2023 04:39:22 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=svmgd3Du; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0BF7E385800A for ; Fri, 23 Jun 2023 11:39:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0BF7E385800A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1687520360; bh=vVWW+VAaVAE0QB84p2tHdg0tyRI6EGnaIknFslhg7rY=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=svmgd3DuXQdhApHXg+WvXBtwi6SL9qU+E4lMAg0LhcZ70Ybyuo2Q6m76/oUmNYoDf u8PWJj7HT/QWRYEXBWSql2CI6m5RFwNedmwXzZ5jBEVT0gZLlcFL2jRKdbygw9h4p9 gCl+jxycqqyR/6tmNOFoIGcEppjLrRQr+Kni9VkI= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by sourceware.org (Postfix) with ESMTPS id F24703858CD1 for ; Fri, 23 Jun 2023 11:39:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org F24703858CD1 Received: by mail-pj1-x102e.google.com with SMTP id 98e67ed59e1d1-25e9e5f9e0cso254085a91.0 for ; Fri, 23 Jun 2023 04:39:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687520348; x=1690112348; h=content-disposition:mime-version:message-id:subject:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=vVWW+VAaVAE0QB84p2tHdg0tyRI6EGnaIknFslhg7rY=; b=Pt5raCJ9TECLwrOcp9Sfe0tHEIoNUnPcXv+w2wR0W2TKkl+ynbDJGrLbU30XjY/1So UbqDe7XRWmUYEf1xVIJaZNztr8Pgv4t4rDGDI9NDioHU01951qFUI/kBOzG3B9tx4NFl U/FQkjU4TBwtkM4WgZfXB2aoUoE7pHRFRw4Bc00GZKjMTWtKzqca5iWRHLsAyzCIbJNU In9+V2Df/yTIo121MbqV21V+XxSNjq0wT96EX1nRSoSbshQfbhwNF2x8VC+5/AfZjBlW oHU9AyjSRUNpOC3zByrAzBmocjFXBvBg5oZf2yasX0O1wJ7v7OWjxs3KqPUoIy6rIvW/ LE5A== X-Gm-Message-State: AC+VfDwXRZg1wrQI01Q6uXCxg72aYjuDbG9WhwpF0lqGlgI39nkpVwtt +vcETGsuwxCPP3Kam3DMdVUkGpP5mtQ= X-Received: by 2002:a17:90a:1a45:b0:256:2fd4:e238 with SMTP id 5-20020a17090a1a4500b002562fd4e238mr17325550pjl.38.1687520348265; Fri, 23 Jun 2023 04:39:08 -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 29-20020a17090a195d00b0025ef39c0f87sm1421784pjh.0.2023.06.23.04.39.07 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 Jun 2023 04:39:07 -0700 (PDT) Received: by squeak.grove.modra.org (Postfix, from userid 1000) id 2EF041141A3C; Fri, 23 Jun 2023 21:09:05 +0930 (ACST) Date: Fri, 23 Jun 2023 21:09:05 +0930 To: binutils@sourceware.org Subject: [GOLD] Support setting DT_RELACOUNT late Message-ID: MIME-Version: 1.0 Content-Disposition: inline X-Spam-Status: No, score=-3034.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 X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Alan Modra via Binutils From: Alan Modra Reply-To: Alan Modra Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1769493351846833180?= X-GMAIL-MSGID: =?utf-8?q?1769493351846833180?= PowerPC gold adds relative dynamic relocs in do_relax. These aren't accounted for in the value set in add_target_dynamic_tags, which is called before do_relax. Provide a way of setting DT_RELCOUNT and DT_RELACOUNT at the point where .dynamic is written. * layout.cc (Layout::add_target_dynamic_tags): Add custom_relcount parameter. Emit DT_RELCOUNT/RELACOUNT as a custom target handled dynamic tag if set. * layout.h(Layout::add_target_dynamic_tags): Update prototype. * aarch64.cc (Target_aarch64::do_finalize_sections): Adjust add_target_dynamic_tags call. * arm.cc (Target_arm::do_finalize_sections): Likewise. * i386.cc (Target_i386::do_finalize_sections): Likewise. * mips.cc (Target_mips::do_finalize_sections): Likewise. * s390.cc (Target_s390::do_finalize_sections): Likewise. * sparc.cc (Target_sparc::do_finalize_sections): Likewise. * tilegx.cc (Target_tilegx::do_finalize_sections): Likewise. * x86_64.cc (Target_x86_64::do_finalize_sections): Likewise. * powerpc.cc (Target_powerpc::do_finalize_sections): Likewise. (Target_powerpc::do_dynamic_tag_custom_value): New function. diff --git a/gold/aarch64.cc b/gold/aarch64.cc index 46a278bd466..7f95c0cf13b 100644 --- a/gold/aarch64.cc +++ b/gold/aarch64.cc @@ -6951,7 +6951,7 @@ Target_aarch64::do_finalize_sections( ? NULL : this->plt_->rela_plt()); layout->add_target_dynamic_tags(false, this->got_plt_, rel_plt, - this->rela_dyn_, true, false); + this->rela_dyn_, true, false, false); // Emit any relocs we saved in an attempt to avoid generating COPY // relocs. diff --git a/gold/arm.cc b/gold/arm.cc index 1ab8eb5db72..f787c28e0a7 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -9484,7 +9484,7 @@ Target_arm::do_finalize_sections( ? NULL : this->plt_->rel_plt()); layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt, - this->rel_dyn_, true, false); + this->rel_dyn_, true, false, false); // Emit any relocs we saved in an attempt to avoid generating COPY // relocs. diff --git a/gold/i386.cc b/gold/i386.cc index d97e818ba0d..c4ea8798a98 100644 --- a/gold/i386.cc +++ b/gold/i386.cc @@ -2672,7 +2672,7 @@ Target_i386::do_finalize_sections( ? NULL : this->plt_->rel_plt()); layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt, - this->rel_dyn_, true, false); + this->rel_dyn_, true, false, false); // Emit any relocs we saved in an attempt to avoid generating COPY // relocs. diff --git a/gold/layout.cc b/gold/layout.cc index a50086897bb..b94855f8662 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -5138,7 +5138,8 @@ void Layout::add_target_dynamic_tags(bool use_rel, const Output_data* plt_got, const Output_data* plt_rel, const Output_data_reloc_generic* dyn_rel, - bool add_debug, bool dynrel_includes_plt) + bool add_debug, bool dynrel_includes_plt, + bool custom_relcount) { Output_data_dynamic* odyn = this->dynamic_data_; if (odyn == NULL) @@ -5203,11 +5204,15 @@ Layout::add_target_dynamic_tags(bool use_rel, const Output_data* plt_got, if (parameters->options().combreloc() && have_dyn_rel) { size_t c = dyn_rel->relative_reloc_count(); - if (c > 0) - odyn->add_constant((use_rel - ? elfcpp::DT_RELCOUNT - : elfcpp::DT_RELACOUNT), - c); + if (c != 0) + { + elfcpp::DT tag + = use_rel ? elfcpp::DT_RELCOUNT : elfcpp::DT_RELACOUNT; + if (custom_relcount) + odyn->add_custom(tag); + else + odyn->add_constant(tag, c); + } } } diff --git a/gold/layout.h b/gold/layout.h index 5bb9aff5b04..040c98cd9aa 100644 --- a/gold/layout.h +++ b/gold/layout.h @@ -950,7 +950,8 @@ class Layout add_target_dynamic_tags(bool use_rel, const Output_data* plt_got, const Output_data* plt_rel, const Output_data_reloc_generic* dyn_rel, - bool add_debug, bool dynrel_includes_plt); + bool add_debug, bool dynrel_includes_plt, + bool custom_relcount); // Add a target-specific dynamic tag with constant value. void diff --git a/gold/mips.cc b/gold/mips.cc index bd7353b450e..a6a41d7a5e4 100644 --- a/gold/mips.cc +++ b/gold/mips.cc @@ -9826,7 +9826,7 @@ Target_mips::do_finalize_sections(Layout* layout, const Reloc_section* rel_plt = (this->plt_ == NULL ? NULL : this->plt_->rel_plt()); layout->add_target_dynamic_tags(true, this->got_, rel_plt, - this->rel_dyn_, true, false); + this->rel_dyn_, true, false, false); Output_data_dynamic* const odyn = layout->dynamic_data(); if (odyn != NULL diff --git a/gold/powerpc.cc b/gold/powerpc.cc index 0c15e1b3721..5838b49e341 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -796,6 +796,10 @@ class Target_powerpc : public Sized_target void do_finalize_sections(Layout*, const Input_objects*, Symbol_table*); + // Get the custom dynamic tag value. + unsigned int + do_dynamic_tag_custom_value(elfcpp::DT) const; + // Return the value to use for a dynamic which requires special // treatment. uint64_t @@ -10135,7 +10139,7 @@ Target_powerpc::do_finalize_sections( ? NULL : this->plt_->rel_plt()); layout->add_target_dynamic_tags(false, this->plt_, rel_plt, - this->rela_dyn_, true, size == 32); + this->rela_dyn_, true, size == 32, true); if (size == 32) { @@ -10206,6 +10210,18 @@ Target_powerpc::do_finalize_sections( } } +// Get the custom dynamic tag value. + +template +unsigned int +Target_powerpc::do_dynamic_tag_custom_value( + elfcpp::DT tag) const +{ + if (tag != elfcpp::DT_RELACOUNT) + gold_unreachable(); + return this->rela_dyn_->relative_reloc_count(); +} + // Merge object attributes from input file called NAME with those of the // output. The input object attributes are in the object pointed by PASD. diff --git a/gold/s390.cc b/gold/s390.cc index 9e555c9d6c5..6e53735351e 100644 --- a/gold/s390.cc +++ b/gold/s390.cc @@ -4043,7 +4043,7 @@ Target_s390::do_finalize_sections( ? NULL : this->plt_->rela_plt()); layout->add_target_dynamic_tags(false, this->got_plt_, rel_plt, - this->rela_dyn_, true, size == 32); + this->rela_dyn_, true, size == 32, false); this->layout_ = layout; diff --git a/gold/sparc.cc b/gold/sparc.cc index 61904f91a41..42c4a3232b1 100644 --- a/gold/sparc.cc +++ b/gold/sparc.cc @@ -3197,7 +3197,7 @@ Target_sparc::do_finalize_sections( ? NULL : this->plt_->rel_plt()); layout->add_target_dynamic_tags(false, this->plt_, rel_plt, - this->rela_dyn_, true, true); + this->rela_dyn_, true, true, false); // Emit any relocs we saved in an attempt to avoid generating COPY // relocs. diff --git a/gold/tilegx.cc b/gold/tilegx.cc index 69d4e640a1e..a054b6701e4 100644 --- a/gold/tilegx.cc +++ b/gold/tilegx.cc @@ -4265,7 +4265,7 @@ Target_tilegx::do_finalize_sections( ? NULL : this->plt_->rela_plt()); layout->add_target_dynamic_tags(false, this->got_plt_, rel_plt, - this->rela_dyn_, true, true); + this->rela_dyn_, true, true, false); // Emit any relocs we saved in an attempt to avoid generating COPY // relocs. diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 6cace049f66..928dfa8ea34 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -4073,7 +4073,7 @@ Target_x86_64::do_finalize_sections( ? NULL : this->plt_->rela_plt()); layout->add_target_dynamic_tags(false, this->got_plt_, rel_plt, - this->rela_dyn_, true, false); + this->rela_dyn_, true, false, false); // Fill in some more dynamic tags. Output_data_dynamic* const odyn = layout->dynamic_data();