From patchwork Sat Jan 8 18:38:31 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 49756 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6CDFA386EC4F for ; Sat, 8 Jan 2022 18:45:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6CDFA386EC4F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1641667544; bh=AvRq8T+Y/X4lnD507eZM92Z+2OnMCJ7ez31YhAm4aiY=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=wYH83i0CFDmQsgBiEPIOteX1vazE7pOJ/9hZ5IMmKoejUDv04SC9e6rwAVG5eLJ3/ Ndup9zSbLvuphtUqV/S0mB6JROpiG/l9skJAnlux5VMD0OGHrDhB8h26A4P4W+xZh6 3Vd5Py2ZRcX5VlGdrfkLJkIeaaLj9bUNjNSyiTxw= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) by sourceware.org (Postfix) with ESMTPS id 7442C3858415; Sat, 8 Jan 2022 18:38:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7442C3858415 Received: by mail-pj1-x1030.google.com with SMTP id rj2-20020a17090b3e8200b001b1944bad25so10978783pjb.5; Sat, 08 Jan 2022 10:38:42 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=AvRq8T+Y/X4lnD507eZM92Z+2OnMCJ7ez31YhAm4aiY=; b=dfR3g63xSClnu45M+OFYWYzvJ8+bRwFAEzuM0bIHSUvrcj2jbnPyDtWVBjN3V6xg8S CrvLYdbCY1jE4L6Q6whs97QUPPwMrDwxw+zSzEAYd1achXBlcXa2kNeCRtC6w8maRHNh RCVh1hs9NnTvdK0Qtf05Wu5UC6i8eJSrJLvH1A1Ds03YUnzmxPZazdrgCBZ50LMEjoHA LI+oT9AUR9WeNMwKPkO934T9efrmrIqeNxM9htRDcNOvaxTMLaoHxdJNxzR1PDGe6ez2 SN8MR3rg2KBeQGJ0VjiVwVq5yzBJeMA6rllozpzJII4jqIiNlJyv9ouiiwj93J8qyZZo jdlg== X-Gm-Message-State: AOAM532Tb68mZFg5RRe4wMxTUYUAy93zVaswmeh1vPmpnz2h9xXRmnWW J9v55xjC2+IOlx0Kz7qHCF0QnFuvZ0Q= X-Google-Smtp-Source: ABdhPJz4Gz9Lt0zdG0vG7C/xdfDocjjjYmjmR9/YtNcLCjpi6YNEbBMNVESCimUPvtJ06iCi/ndDbA== X-Received: by 2002:a63:eb0f:: with SMTP id t15mr62312239pgh.145.1641667121549; Sat, 08 Jan 2022 10:38:41 -0800 (PST) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id e7sm2665188pfv.9.2022.01.08.10.38.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 10:38:40 -0800 (PST) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 1526AC0D75; Sat, 8 Jan 2022 10:38:39 -0800 (PST) To: binutils@sourceware.org Subject: [PATCH v2 2/9] elf: Extract _bfd_elf_process_reverse_copy Date: Sat, 8 Jan 2022 10:38:31 -0800 Message-Id: <20220108183838.1920397-3-hjl.tools@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20220108183838.1920397-1-hjl.tools@gmail.com> References: <20220108183838.1920397-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3028.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Cc: libc-alpha@sourceware.org, Nick Clifton , Alan Modra Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Extract _bfd_elf_process_reverse_copy from elf_link_input_bfd so that it can be called in check_relocs to set SEC_ELF_REVERSE_COPY before elf_link_input_bfd is called. * elf-bfd.h (_bfd_elf_process_reverse_copy): New prototype. * elflink.c (_bfd_elf_process_reverse_copy): New. Extracted from elf_link_input_bfd. (elf_link_input_bfd): Call _bfd_elf_process_reverse_copy. --- bfd/elf-bfd.h | 2 ++ bfd/elflink.c | 60 ++++++++++++++++++++++++++++++++------------------- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 81f8fd47db7..2441b3c0cd7 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -2331,6 +2331,8 @@ extern const struct bfd_elf_special_section *_bfd_elf_get_special_section (const char *, const struct bfd_elf_special_section *, unsigned int); extern const struct bfd_elf_special_section *_bfd_elf_get_sec_type_attr (bfd *, asection *); +extern bool _bfd_elf_process_reverse_copy (asection *, unsigned int, + unsigned int); extern bool _bfd_elf_link_hide_sym_by_version (struct bfd_link_info *, struct elf_link_hash_entry *); diff --git a/bfd/elflink.c b/bfd/elflink.c index 059461b5725..29ef9ddf8b9 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -10851,6 +10851,41 @@ _bfd_elf_check_kept_section (asection *sec, struct bfd_link_info *info) return kept; } +/* Set SEC_ELF_REVERSE_COPY on section S when we need to reverse-copy + input .ctors/.dtors sections if they are placed in .init_array or + .finit_array for output. ADDRESS_SIZE is address in bytes. + INT_RELS_PER_EXT_REL is the number of internal relocations to + allocate per external relocation entry. */ + +bool +_bfd_elf_process_reverse_copy (asection *s, unsigned int address_size, + unsigned int int_rels_per_ext_rel) +{ + if (s->size <= address_size + || (s->flags & SEC_ELF_REVERSE_COPY) != 0) + return true; + + if (((startswith (s->name, ".ctors") + && strcmp (s->output_section->name, ".init_array") == 0) + || (startswith (s->name, ".dtors") + && strcmp (s->output_section->name, ".fini_array") == 0)) + && (s->name[6] == 0 || s->name[6] == '.')) + { + if (s->size * int_rels_per_ext_rel + != s->reloc_count * address_size) + { + _bfd_error_handler + /* xgettext:c-format */ + (_("error: %pB: size of section %pA is not multiple of " + "address size"), s->owner, s); + bfd_set_error (bfd_error_bad_value); + return false; + } + s->flags |= SEC_ELF_REVERSE_COPY; + } + return true; +} + /* Link an input file into the linker output file. This function handles all the sections and relocations of the input file at once. This is so that we only have to read the local symbols once, and @@ -11249,28 +11284,9 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd) /* We need to reverse-copy input .ctors/.dtors sections if they are placed in .init_array/.finit_array for output. */ - if (o->size > address_size - && ((startswith (o->name, ".ctors") - && strcmp (o->output_section->name, - ".init_array") == 0) - || (startswith (o->name, ".dtors") - && strcmp (o->output_section->name, - ".fini_array") == 0)) - && (o->name[6] == 0 || o->name[6] == '.')) - { - if (o->size * bed->s->int_rels_per_ext_rel - != o->reloc_count * address_size) - { - _bfd_error_handler - /* xgettext:c-format */ - (_("error: %pB: size of section %pA is not " - "multiple of address size"), - input_bfd, o); - bfd_set_error (bfd_error_bad_value); - return false; - } - o->flags |= SEC_ELF_REVERSE_COPY; - } + if (!_bfd_elf_process_reverse_copy (o, address_size, + bed->s->int_rels_per_ext_rel)) + return false; action_discarded = -1; if (!elf_section_ignore_discarded_relocs (o))