From patchwork Wed Jun 28 01:06:34 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fangrui Song X-Patchwork-Id: 113643 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp8576418vqr; Tue, 27 Jun 2023 18:06:53 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7W8UoQmzp2lb+XP/7xCs660NqhAI+NORLpMeNzz1t1g3/hjnJWMKFsKwM3nohxE0aKGm4G X-Received: by 2002:a17:907:2682:b0:977:4b64:f5e8 with SMTP id bn2-20020a170907268200b009774b64f5e8mr29361429ejc.57.1687914413803; Tue, 27 Jun 2023 18:06:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687914413; cv=none; d=google.com; s=arc-20160816; b=h8j/hpwKAjLAiAHuelgw/Q4Wkhcwh0ApvFLRA3gbIcbO7qe63/GKbrYMy1HLqAssal ICwz6UAc6+pc946a7GRfPNRxuNylR5H38F2yFXA0LzTdsIxgW9Y4vRRR+YaocPOQnGwv IyRJT8n8xFJplHDjVCLi8MLX8hk7cn3ohEpa6+XPhxCi3ieKpeGXA/0fR+xXTnDD41UY hF59USC7vkS2/uDg/0+c5nR4VpT3qku20kJWQMPHEO1KCCciom4j9bRq+nWq9OMw46RS 0d6DqOOyzYpHIXdZwsCG7gKus41iJoYtOKwOjEGyh48IH7H4yy8569udxVk42tnoTJYy 6/7g== 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:cc:to:subject :message-id:mime-version:date:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=XboXYMxA4CIhnJBx9x4t0D50j0tzk5hFCEAWyhGGsU8=; fh=iOdKEcvcyKr8F0Ow9/BX/FP1N9atFrJVI2WJ0/3sDz4=; b=NTbw6Ppr/UmRPa+bS/XFkOwR371953whwAYuhW4F0hMveN1Ycf+pOzdz5WfwGE7+L2 wxsXPuLI2v0GR9HvnBCpXeIvcSzG/77V1qbuYQiaQw2FfN4mwKCCoih9nX0hgxkAthHI peJxha0quVf5hB8DvT9iVoW1+7d7F3dhsSY2VK12HZn94BF9ws0sonrEKdLRazNvAJZV h/KXEePpxe6mt7qJ1i3Zfw4vTbMbOftLLDb3nuum/71nXpUoHbuFrmx6CWHP2+0r+oi5 qL5ZGcax83h9N64yUfm37ktJqJmUAIoOjSRBQPE2BlPl0cGZrxUMW3QFiVCqcHgEAgkP GYJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=aqvrX4D4; 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 j6-20020a170906830600b0098e1c7a62c9si4281319ejx.361.2023.06.27.18.06.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Jun 2023 18:06:53 -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=aqvrX4D4; 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 351AF3858C2D for ; Wed, 28 Jun 2023 01:06:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 351AF3858C2D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1687914412; bh=XboXYMxA4CIhnJBx9x4t0D50j0tzk5hFCEAWyhGGsU8=; h=Date:Subject:To:Cc:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=aqvrX4D4O24oLruX32v1roeWyDtlxIECeWREniksSJhlZbAGo1CBQ1/7Hq4FF3eC1 RLcsrKxtNWOLQX28+C8RzTrcNhHqB9e0V4rAOIBiFq2JB8rnkUug/0yOEjeonPtAtn KBVuqnrenadjcsZWkUj3hiIIDVtz0wR3DeCM92Is= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by sourceware.org (Postfix) with ESMTPS id 88D203858D32 for ; Wed, 28 Jun 2023 01:06:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 88D203858D32 Received: by mail-yb1-xb49.google.com with SMTP id 3f1490d57ef6-bf0ba82473dso7074654276.0 for ; Tue, 27 Jun 2023 18:06:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687914399; x=1690506399; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=XboXYMxA4CIhnJBx9x4t0D50j0tzk5hFCEAWyhGGsU8=; b=Xr6ioSmalDtXOV5JO1HFDBVtlCNmgYOzMQINDtNnKCgDAfgmBumKnQHOALoNRCPmF+ aMxmHWRrphCfcEvWPYCTk57UQEOq+DTUqoQJbZFEzy78fopYikWiOZF0okgPx63aWc9R qlNnrWxtmHASa5paBlwt+SVpCZ4mDh8KMU5kK3UnfgRhRkwIkbnFhsoqq4Qbe61/+VEp zLEdnj+zO3mJ61OCPlutZ55GpFmmGpvfBHYZyTnGkf5eatmXoQOISQvWsEt/TarifShf OFRyYn1AgPUQK1NGAGM7kOnxMowsUdiPJ8jHsEwiRlI4qSgyE7amFAZ1fv+9LhftNc/P DErA== X-Gm-Message-State: AC+VfDz6XUEg6+O+n6ULHolCixSimW5vwO5QNs7eRQPSZtSO/fa/vR6S g/Y5myPiZzJS2OhyrP72y7OZQ5pTbNUePyj+EurDW0VoPzCzJYf2XrTMEeaH/lebrdMS6q/pGC7 RWCKSMf8dUZI/P6Q45d8Y92ECoJYWXv98ycrm0TTF6hZRI14b3kblQKYAHpMdxkoCIQ== X-Received: from maskray.svl.corp.google.com ([2620:15c:2d3:205:a71d:c944:a0b5:d851]) (user=maskray job=sendgmr) by 2002:a05:6902:86:b0:bc7:4714:182e with SMTP id h6-20020a056902008600b00bc74714182emr8115950ybs.3.1687914399066; Tue, 27 Jun 2023 18:06:39 -0700 (PDT) Date: Tue, 27 Jun 2023 18:06:34 -0700 Mime-Version: 1.0 Message-ID: <20230628010634.1147958-1-maskray@google.com> Subject: [PATCH] PR30592 objcopy: allow --set-section-flags to add or remove SHF_X86_64_LARGE To: binutils@sourceware.org Cc: Fangrui Song X-Spam-Status: No, score=-19.9 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL 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: Fangrui Song via Binutils From: Fangrui Song Reply-To: Fangrui Song 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?1769906544349322221?= X-GMAIL-MSGID: =?utf-8?q?1769906544349322221?= For example, objcopy --set-section-flags .data=alloc,large will add SHF_X86_64_LARGE to the .data section. Omitting "large" will drop the SHF_X86_64_LARGE flag. The bfd_section flag is named generically, SEC_ELF_LARGE, in case other processors want to follow SHF_X86_64_LARGE. bfd/ * bfd-in2.h: Define SEC_ELF_LARGE. * elf.c (_bfd_elf_make_section_from_shdr): Check SHF_X86_64_LARGE. (elf_fake_sections): Check SEC_ELF_LARGE. (_bfd_elf_init_private_section_data): Drop SHF_X86_64_LARGE for x86-64. binutils/ * doc/binutils.texi: Mention "large". * objcopy.c (parse_flags): Parse "large". * testsuite/binutils-all/x86-64/large-sections.d: New. * testsuite/binutils-all/x86-64/large-sections.s: New. * testsuite/binutils-all/x86-64/large-sections-2.d: New. * testsuite/binutils-all/x86-64/large-sections-2.s: New. include/ * elf/common.h: Define SHF_X86_64_LARGE to be used by elf.c. --- bfd/bfd-in2.h | 3 +++ bfd/elf.c | 9 +++++++++ binutils/doc/binutils.texi | 15 ++++++++------- binutils/objcopy.c | 3 ++- .../binutils-all/x86-64/large-sections-2.d | 15 +++++++++++++++ .../binutils-all/x86-64/large-sections-2.s | 4 ++++ .../binutils-all/x86-64/large-sections.d | 14 ++++++++++++++ .../binutils-all/x86-64/large-sections.s | 8 ++++++++ include/elf/common.h | 2 ++ 9 files changed, 65 insertions(+), 8 deletions(-) create mode 100644 binutils/testsuite/binutils-all/x86-64/large-sections-2.d create mode 100644 binutils/testsuite/binutils-all/x86-64/large-sections-2.s create mode 100644 binutils/testsuite/binutils-all/x86-64/large-sections.d create mode 100644 binutils/testsuite/binutils-all/x86-64/large-sections.s diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 7399fb0fa60..2507716899c 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -633,6 +633,9 @@ typedef struct bfd_section /* This section contains vliw code. This is for Toshiba MeP only. */ #define SEC_MEP_VLIW 0x20000000 + /* This section has the SHF_X86_64_LARGE flag. This is ELF x86-64 only. */ +#define SEC_ELF_LARGE 0x20000000 + /* All symbols, sizes and relocations in this section are octets instead of bytes. Required for DWARF debug sections as DWARF information is organized in octets, not bytes. */ diff --git a/bfd/elf.c b/bfd/elf.c index 8f6d7d1adba..d6e21b11419 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -1034,6 +1034,10 @@ _bfd_elf_make_section_from_shdr (bfd *abfd, if ((hdr->sh_flags & SHF_EXCLUDE) != 0) flags |= SEC_EXCLUDE; + if (get_elf_backend_data (abfd)->elf_machine_code == EM_X86_64) + if ((hdr->sh_flags & SHF_X86_64_LARGE) != 0) + flags |= SEC_ELF_LARGE; + switch (elf_elfheader (abfd)->e_ident[EI_OSABI]) { /* FIXME: We should not recognize SHF_GNU_MBIND for ELFOSABI_NONE, @@ -3351,6 +3355,8 @@ elf_fake_sections (bfd *abfd, asection *asect, void *fsarg) } if ((asect->flags & (SEC_GROUP | SEC_EXCLUDE)) == SEC_EXCLUDE) this_hdr->sh_flags |= SHF_EXCLUDE; + if (asect->flags & SEC_ELF_LARGE) + this_hdr->sh_flags |= SHF_X86_64_LARGE; /* If the section has relocs, set up a section header for the SHT_REL[A] section. If two relocation sections are required for @@ -7940,6 +7946,9 @@ _bfd_elf_init_private_section_data (bfd *ibfd, elf_section_flags (osec) = (elf_section_flags (isec) & (SHF_MASKOS | SHF_MASKPROC)); + if (get_elf_backend_data (ibfd)->elf_machine_code == EM_X86_64) + elf_section_flags (osec) = (elf_section_flags (isec) & ~SHF_X86_64_LARGE); + /* Copy sh_info from input for mbind section. */ if ((elf_tdata (ibfd)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0 && elf_section_flags (isec) & SHF_GNU_MBIND) diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index 8c14d1121d9..4dd7b83aaa6 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -1740,13 +1740,14 @@ Set the flags for any sections matching @var{sectionpattern}. The @var{flags} argument is a comma separated string of flag names. The recognized names are @samp{alloc}, @samp{contents}, @samp{load}, @samp{noload}, @samp{readonly}, @samp{code}, @samp{data}, @samp{rom}, -@samp{exclude}, @samp{share}, and @samp{debug}. You can set the -@samp{contents} flag for a section which does not have contents, but it -is not meaningful to clear the @samp{contents} flag of a section which -does have contents--just remove the section instead. Not all flags are -meaningful for all object file formats. In particular the -@samp{share} flag is only meaningful for COFF format files and not for -ELF format files. +@samp{exclude}, @samp{share}, @samp{debug}, and @samp{large}. +You can set the @samp{contents} flag for a section which does not have +contents, but it is not meaningful to clear the @samp{contents} flag of a +section which does have contents--just remove the section instead. Not all +flags are meaningful for all object file formats. In particular the +@samp{share} flag is only meaningful for COFF format files and not for ELF +format files. @samp{large} is an ELF x86-64 specific flag that corresponds to +SHF_X86_64_LARGE. @item --set-section-alignment @var{sectionpattern}=@var{align} Set the alignment for any sections matching @var{sectionpattern}. diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 414007780a8..40496f8f792 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -797,6 +797,7 @@ parse_flags (const char *s) PARSE_FLAG ("contents", SEC_HAS_CONTENTS); PARSE_FLAG ("merge", SEC_MERGE); PARSE_FLAG ("strings", SEC_STRINGS); + PARSE_FLAG ("large", SEC_ELF_LARGE); #undef PARSE_FLAG else { @@ -807,7 +808,7 @@ parse_flags (const char *s) copy[len] = '\0'; non_fatal (_("unrecognized section flag `%s'"), copy); fatal (_("supported flags: %s"), - "alloc, load, noload, readonly, debug, code, data, rom, exclude, share, contents, merge, strings"); + "alloc, load, noload, readonly, debug, code, data, rom, exclude, share, contents, merge, strings, large"); } s = snext; diff --git a/binutils/testsuite/binutils-all/x86-64/large-sections-2.d b/binutils/testsuite/binutils-all/x86-64/large-sections-2.d new file mode 100644 index 00000000000..29ace42cc9e --- /dev/null +++ b/binutils/testsuite/binutils-all/x86-64/large-sections-2.d @@ -0,0 +1,15 @@ +#source: large-sections.s +#PROG: objcopy +#as: --64 +#objcopy: --set-section-flags .ldata=alloc +#readelf: -S -W + +#... + \[[ 0-9]+\] \.text.*[ \t]+PROGBITS[ \t0-9a-f]+AX[ \t]+.* +#... + \[[ 0-9]+\] \.data.*[ \t]+PROGBITS[ \t0-9a-f]+WA[ \t]+.* +#... + \[[ 0-9]+\] \.ltext.*[ \t]+PROGBITS[ \t0-9a-f]+AXl[ \t]+.* +#... + \[[ 0-9]+\] \.ldata.*[ \t]+PROGBITS[ \t0-9a-f]+WA[ \t]+.* +#pass diff --git a/binutils/testsuite/binutils-all/x86-64/large-sections-2.s b/binutils/testsuite/binutils-all/x86-64/large-sections-2.s new file mode 100644 index 00000000000..6f31aa93701 --- /dev/null +++ b/binutils/testsuite/binutils-all/x86-64/large-sections-2.s @@ -0,0 +1,4 @@ + .section .text, "axl" + nop + .section .data, "awl" + .byte 1 diff --git a/binutils/testsuite/binutils-all/x86-64/large-sections.d b/binutils/testsuite/binutils-all/x86-64/large-sections.d new file mode 100644 index 00000000000..5d945e46ba3 --- /dev/null +++ b/binutils/testsuite/binutils-all/x86-64/large-sections.d @@ -0,0 +1,14 @@ +#PROG: objcopy +#as: --64 +#objcopy: --set-section-flags .text=alloc,readonly,code,large --set-section-flags .data=alloc,large +#readelf: -S -W + +#... + \[[ 0-9]+\] \.text.*[ \t]+PROGBITS[ \t0-9a-f]+AXl[ \t]+.* +#... + \[[ 0-9]+\] \.data.*[ \t]+PROGBITS[ \t0-9a-f]+WAl[ \t]+.* +#... + \[[ 0-9]+\] \.ltext.*[ \t]+PROGBITS[ \t0-9a-f]+AXl[ \t]+.* +#... + \[[ 0-9]+\] \.ldata.*[ \t]+PROGBITS[ \t0-9a-f]+WAl[ \t]+.* +#pass diff --git a/binutils/testsuite/binutils-all/x86-64/large-sections.s b/binutils/testsuite/binutils-all/x86-64/large-sections.s new file mode 100644 index 00000000000..072e456a1ed --- /dev/null +++ b/binutils/testsuite/binutils-all/x86-64/large-sections.s @@ -0,0 +1,8 @@ + .section .text, "ax" + nop + .section .data, "aw" + .byte 1 + .section .ltext, "axl" + nop + .section .ldata, "awl" + .byte 1 diff --git a/include/elf/common.h b/include/elf/common.h index ffa6b60bd2b..1397d60402e 100644 --- a/include/elf/common.h +++ b/include/elf/common.h @@ -588,6 +588,8 @@ #define SHF_GNU_MBIND 0x01000000 /* Mbind section. */ +#define SHF_X86_64_LARGE 0x10000000 + /* Compression types. */ #define ELFCOMPRESS_ZLIB 1 /* Compressed with zlib. */ #define ELFCOMPRESS_ZSTD 2 /* Compressed with zstd */