From patchwork Mon Jun 5 15:32:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 103356 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2771019vqr; Mon, 5 Jun 2023 08:36:30 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5NIHO8QKdh4SwEA7wuBv8eBjjSwa2wGxzVRLUBUbbLeV1Qf/Afejz2iYKvB/jsBOVTGnJp X-Received: by 2002:a17:907:3f1f:b0:974:5480:171e with SMTP id hq31-20020a1709073f1f00b009745480171emr8933573ejc.32.1685979390390; Mon, 05 Jun 2023 08:36:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685979390; cv=none; d=google.com; s=arc-20160816; b=wmduahWONN6hbTBLp12NLCcniXjLNDACIeM0mgwDyoF3as7PeWSZg2sev364t9d4vi 90J3QtkdY8moAefDzwve77GZNux9mwybgOE+2j2X8L2Fwf6E1Hhp632j0qmhrq685fvp qn3lgUojmbXRtdJN76ow2OF5ZiYORf9aPVeQ9NIGtI8ssQeEkR+ayGIX0w/AFXf+dlce fepHpGZqP6Ldn1W4dhsohVaC50J6HK2m2TwQ0swiubpET5nFiEfx6z4qtd5D9UXvY4CB 40BRf85glpCl737NbxZhTcczWZYzK7OaQvGNnd2jim9fc50eHv/7eD/vYLxYUabYU+gc f1cQ== 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-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=I7KPeyhARzAVj59x3eY/lkGzJstg0GDhAZHoNxbp7rs=; b=aCtrxYUbqorI317uVKOpTLYYdexI8+1hPY1xd/AC2soGwmoi+G5zT5J44dJOSYqHe+ xfXYZMSadFJ1Qf/JLM6QvaFels8C0Frinry2PV4z5TQN/kwLJkYACYGtVfK+fw38j+Xb iNhC+LAeHxkDIf7ReGrY8ZyI7Y3d/23OW4jb1Bwog9cDHpvlFWA1MskaNP1uN9tWl4Nz qLGl1ZrRaA72ZJS9COAsYUKvLrNUWFa+R7AyRdDhfczdpVu2V0HvsVfdRHitMAAn3MKZ DTx1hv7Sc6rwZRSw4WADJw2sWuBy9KaguqHroi+iC+mUMs6oDAgx+2QZmr2LuWXdX4SS C26A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=ivWSQ5Uz; 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 p15-20020a170907910f00b0094aa492a5d0si4903980ejq.956.2023.06.05.08.36.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:36:30 -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=ivWSQ5Uz; 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 86A003889E03 for ; Mon, 5 Jun 2023 15:34:08 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 86A003889E03 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685979248; bh=I7KPeyhARzAVj59x3eY/lkGzJstg0GDhAZHoNxbp7rs=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=ivWSQ5UzJkpK9qlJAeIrl/j5EboQmCSzRYiUvPyssSKEEj48MmPeXbW5CC0+IALie R8kTvhGt4zPNnhKVlTgg4MqgV//0oRjv6Qw62OmR2OTJ9EH/7sFwB8gTQFUjZj1+Ug pduArpGNTKi5eR1cBIoqatLQXx7pt1paJgfAOQm0= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pf1-x42d.google.com (mail-pf1-x42d.google.com [IPv6:2607:f8b0:4864:20::42d]) by sourceware.org (Postfix) with ESMTPS id 5978D3882643 for ; Mon, 5 Jun 2023 15:32:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5978D3882643 Received: by mail-pf1-x42d.google.com with SMTP id d2e1a72fcca58-655d1fc8ad8so1011697b3a.1 for ; Mon, 05 Jun 2023 08:32:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685979147; x=1688571147; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=I7KPeyhARzAVj59x3eY/lkGzJstg0GDhAZHoNxbp7rs=; b=ZP2Skh5UfaJBpJiDanBYMZ2BHEZYAR5WlimZqmyVlm4ZDPrDV2AoEPbGIMkEeZhDmi 4Q8q3MO3W2IQ3xK/JQ9Wnc68qfdWT6acuylcOnqn5kQbH3Cze/6wVvc4ahTixKY8yFQt MlR+kRxP4MdYKtZ+CzGKIyGAohsPNDLDzFmHdW4hTGPhcb2xoy90oawOb9pYpgxMmlXD ZqNd2DcLw3upbZCPApJEEkQGou38jLYTTmqws3q9gVV6b849xp1qfE8b/s3P8UKbipqB vvJZBrOXBfZjZOp8uks+cKPHPJkEdEpJ8nVqHkH1Eh7cJd7aLf3buue9PHNnrf7ZKumq 4ijQ== X-Gm-Message-State: AC+VfDyO17g+RCovRPNMCg00Yoky2U6LNYrBi1eLJSOAx28dGKo8CbOn TmkMESpZWluCU24luV2ZNH06/29HAB4= X-Received: by 2002:a05:6a20:938a:b0:111:366:eeb2 with SMTP id x10-20020a056a20938a00b001110366eeb2mr2942097pzh.9.1685979146834; Mon, 05 Jun 2023 08:32:26 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id w12-20020aa7858c000000b00653fe2d527esm4282621pfn.32.2023.06.05.08.32.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:32:26 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 4783E74014F; Mon, 5 Jun 2023 08:32:25 -0700 (PDT) To: binutils@sourceware.org Cc: Alan Modra , Kaylee Blake Subject: [PATCH v3 1/7] ELF: Strip section header in ELF objects Date: Mon, 5 Jun 2023 08:32:16 -0700 Message-Id: <20230605153222.1728119-2-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230605153222.1728119-1-hjl.tools@gmail.com> References: <20230605153222.1728119-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3025.2 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: "H.J. Lu via Binutils" From: "H.J. Lu" Reply-To: "H.J. Lu" 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?1767441871824120314?= X-GMAIL-MSGID: =?utf-8?q?1767877525105404668?= From: Kaylee Blake Section header isn't mandatory on ELF executable nor shared library. This patch adds a new linker option, -z nosectionheader, to omit ELF section header, a new objcopy and strip option, --strip-section-headers, to remove ELF section headers. bfd/ 2023-0X-XX H.J. Lu Kaylee Blake PR ld/25617 * bfd.c (BFD_NO_SECTION_HEADER): New. (BFD_FLAGS_SAVED): Add BFD_NO_SECTION_HEADER. (BFD_FLAGS_FOR_BFD_USE_MASK): Likewise. * elfcode.h (elf_swap_ehdr_out): Omit section header with BFD_NO_SECTION_HEADER. (elf_write_shdrs_and_ehdr): Likewise. * elfxx-target.h (TARGET_BIG_SYM): Add BFD_NO_SECTION_HEADER to object_flags. (TARGET_LITTLE_SYM): Likewise. * bfd-in2.h: Regenerated. binutils/ 2023-0X-XX H.J. Lu PR ld/25617 * NEWS: Mention --strip-section-headers for objcopy and strip. * objcopy.c (strip_section_headers): New. (command_line_switch): Add OPTION_STRIP_SECTION_HEADERS. (strip_options): Add --strip-section-headers. (copy_options): Likewise. (copy_usage): Add --strip-section-headers. (strip_usage): Likewise. (copy_object): Handle --strip-section-headers for ELF files. (strip_main): Handle OPTION_STRIP_SECTION_HEADERS. (copy_main): Likewise. * doc/binutils.texi: Document --strip-section-headers for objcopy and strip. ld/ 2023-0X-XX H.J. Lu Kaylee Blake PR ld/25617 * NEWS: Mention -z nosectionheader. * emultempl/elf.em: Support -z sectionheader and -z nosectionheader. * ld.h (ld_config_type): Add no_section_header. * ld.texi: Document -z sectionheader and -z nosectionheader. * ldlang.c (ldlang_open_output): Handle config.no_section_header. * lexsup.c (parse_args): Enable --strip-all with -z nosectionheader. (elf_static_list_options): Add -z sectionheader and -z nosectionheader. --- bfd/bfd-in2.h | 6 +++++- bfd/bfd.c | 6 +++++- bfd/elfcode.h | 36 ++++++++++++++++++++++++++---------- bfd/elfxx-target.h | 4 ++-- binutils/NEWS | 5 ++++- binutils/doc/binutils.texi | 10 ++++++++++ binutils/objcopy.c | 33 +++++++++++++++++++++++++++++++-- ld/NEWS | 3 +++ ld/emultempl/elf.em | 4 ++++ ld/ld.h | 3 +++ ld/ld.texi | 5 +++++ ld/ldlang.c | 4 ++++ ld/lexsup.c | 8 ++++++++ 13 files changed, 110 insertions(+), 17 deletions(-) diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 6f8a8fd114d..a84a3c24f2a 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -2048,11 +2048,15 @@ struct bfd /* Compress sections in this BFD with SHF_COMPRESSED zstd. */ #define BFD_COMPRESS_ZSTD 0x400000 + /* Don't generate ELF section header. */ +#define BFD_NO_SECTION_HEADER 0x800000 + /* Flags bits which are for BFD use only. */ #define BFD_FLAGS_FOR_BFD_USE_MASK \ (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \ | BFD_PLUGIN | BFD_TRADITIONAL_FORMAT | BFD_DETERMINISTIC_OUTPUT \ - | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON) + | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON \ + | BFD_NO_SECTION_HEADER) /* The format which belongs to the BFD. (object, core, etc.) */ ENUM_BITFIELD (bfd_format) format : 3; diff --git a/bfd/bfd.c b/bfd/bfd.c index 71debd73733..014b7a90a4d 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -192,11 +192,15 @@ CODE_FRAGMENT . {* Compress sections in this BFD with SHF_COMPRESSED zstd. *} .#define BFD_COMPRESS_ZSTD 0x400000 . +. {* Don't generate ELF section header. *} +.#define BFD_NO_SECTION_HEADER 0x800000 +. . {* Flags bits which are for BFD use only. *} .#define BFD_FLAGS_FOR_BFD_USE_MASK \ . (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \ . | BFD_PLUGIN | BFD_TRADITIONAL_FORMAT | BFD_DETERMINISTIC_OUTPUT \ -. | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON) +. | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON \ +. | BFD_NO_SECTION_HEADER) . . {* The format which belongs to the BFD. (object, core, etc.) *} . ENUM_BITFIELD (bfd_format) format : 3; diff --git a/bfd/elfcode.h b/bfd/elfcode.h index e4e29f0dc57..495e498838d 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -266,6 +266,7 @@ elf_swap_ehdr_out (bfd *abfd, { unsigned int tmp; int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; + bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0; memcpy (dst->e_ident, src->e_ident, EI_NIDENT); /* note that all elements of dst are *arrays of unsigned char* already... */ H_PUT_16 (abfd, src->e_type, dst->e_type); @@ -276,7 +277,10 @@ elf_swap_ehdr_out (bfd *abfd, else H_PUT_WORD (abfd, src->e_entry, dst->e_entry); H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff); - H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff); + if (no_section_header) + H_PUT_WORD (abfd, 0, dst->e_shoff); + else + H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff); H_PUT_32 (abfd, src->e_flags, dst->e_flags); H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize); H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize); @@ -284,15 +288,24 @@ elf_swap_ehdr_out (bfd *abfd, if (tmp > PN_XNUM) tmp = PN_XNUM; H_PUT_16 (abfd, tmp, dst->e_phnum); - H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize); - tmp = src->e_shnum; - if (tmp >= (SHN_LORESERVE & 0xffff)) - tmp = SHN_UNDEF; - H_PUT_16 (abfd, tmp, dst->e_shnum); - tmp = src->e_shstrndx; - if (tmp >= (SHN_LORESERVE & 0xffff)) - tmp = SHN_XINDEX & 0xffff; - H_PUT_16 (abfd, tmp, dst->e_shstrndx); + if (no_section_header) + { + H_PUT_16 (abfd, 0, dst->e_shentsize); + H_PUT_16 (abfd, 0, dst->e_shnum); + H_PUT_16 (abfd, 0, dst->e_shstrndx); + } + else + { + H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize); + tmp = src->e_shnum; + if (tmp >= (SHN_LORESERVE & 0xffff)) + tmp = SHN_UNDEF; + H_PUT_16 (abfd, tmp, dst->e_shnum); + tmp = src->e_shstrndx; + if (tmp >= (SHN_LORESERVE & 0xffff)) + tmp = SHN_XINDEX & 0xffff; + H_PUT_16 (abfd, tmp, dst->e_shstrndx); + } } /* Translate an ELF section header table entry in external format into an @@ -1077,6 +1090,9 @@ elf_write_shdrs_and_ehdr (bfd *abfd) || bfd_bwrite (&x_ehdr, amt, abfd) != amt) return false; + if ((abfd->flags & BFD_NO_SECTION_HEADER) != 0) + return true; + /* Some fields in the first section header handle overflow of ehdr fields. */ if (i_ehdrp->e_phnum >= PN_XNUM) diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index 9bcbdfb27dd..20191fae294 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -994,7 +994,7 @@ const bfd_target TARGET_BIG_SYM = (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS | BFD_COMPRESS_GABI | BFD_COMPRESS_ZSTD | BFD_CONVERT_ELF_COMMON - | BFD_USE_ELF_STT_COMMON), + | BFD_USE_ELF_STT_COMMON | BFD_NO_SECTION_HEADER), /* section_flags: mask of all section flags */ (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY @@ -1099,7 +1099,7 @@ const bfd_target TARGET_LITTLE_SYM = (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS | BFD_COMPRESS_GABI | BFD_COMPRESS_ZSTD | BFD_CONVERT_ELF_COMMON - | BFD_USE_ELF_STT_COMMON), + | BFD_USE_ELF_STT_COMMON | BFD_NO_SECTION_HEADER), /* section_flags: mask of all section flags */ (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY diff --git a/binutils/NEWS b/binutils/NEWS index b29f36bf1d4..bb614a14503 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -2,7 +2,10 @@ * Objdump's --private option can now be used on PE format files to display the fields in the file header and section headers. - + +* Add command-line option, --strip-section-headers, to objcopy and strip to + remove ELF section header from ELF file. + Changes in 2.40: * Objdump has a new command line option --show-all-symbols which will make it diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index 8c14d1121d9..8314cb57562 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -1278,6 +1278,7 @@ objcopy [@option{-F} @var{bfdname}|@option{--target=}@var{bfdname}] [@option{-R} @var{sectionpattern}|@option{--remove-section=}@var{sectionpattern}] [@option{--keep-section=}@var{sectionpattern}] [@option{--remove-relocations=}@var{sectionpattern}] + [@option{--strip-section-headers}] [@option{-p}|@option{--preserve-dates}] [@option{-D}|@option{--enable-deterministic-archives}] [@option{-U}|@option{--disable-deterministic-archives}] @@ -1494,6 +1495,10 @@ will remove all relocations for sections matching the pattern '.text.*', but will not remove relocations for the section '.text.foo'. +@item --strip-section-headers +Strip section header This option is specific to ELF files. +Implies @option{--strip-all} and @option{--merge-notes}. + @item -S @itemx --strip-all Do not copy relocation and symbol information from the source file. @@ -3484,6 +3489,7 @@ strip [@option{-F} @var{bfdname} |@option{--target=}@var{bfdname}] [@option{-R} @var{sectionname} |@option{--remove-section=}@var{sectionname}] [@option{--keep-section=}@var{sectionpattern}] [@option{--remove-relocations=}@var{sectionpattern}] + [@option{--strip-section-headers}] [@option{-o} @var{file}] [@option{-p}|@option{--preserve-dates}] [@option{-D}|@option{--enable-deterministic-archives}] [@option{-U}|@option{--disable-deterministic-archives}] @@ -3586,6 +3592,10 @@ will remove all relocations for sections matching the pattern '.text.*', but will not remove relocations for the section '.text.foo'. +@item --strip-section-headers +Strip section headers. This option is specific to ELF files. Implies +@option{--strip-all} and @option{--merge-notes}. + @item -s @itemx --strip-all Remove all symbols. diff --git a/binutils/objcopy.c b/binutils/objcopy.c index ac40da87018..6112bbb9bdb 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -97,6 +97,7 @@ static int deterministic = -1; /* Enable deterministic archives. */ static int status = 0; /* Exit status. */ static bool merge_notes = false; /* Merge note sections. */ +static bool strip_section_headers = false;/* Strip section headers. */ typedef struct merged_note_section { @@ -365,6 +366,7 @@ enum command_line_switch OPTION_SREC_LEN, OPTION_STACK, OPTION_STRIP_DWO, + OPTION_STRIP_SECTION_HEADERS, OPTION_STRIP_SYMBOLS, OPTION_STRIP_UNNEEDED, OPTION_STRIP_UNNEEDED_SYMBOL, @@ -403,6 +405,7 @@ static struct option strip_options[] = {"preserve-dates", no_argument, 0, 'p'}, {"remove-section", required_argument, 0, 'R'}, {"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS}, + {"strip-section-headers", no_argument, 0, OPTION_STRIP_SECTION_HEADERS}, {"strip-all", no_argument, 0, 's'}, {"strip-debug", no_argument, 0, 'S'}, {"strip-dwo", no_argument, 0, OPTION_STRIP_DWO}, @@ -492,6 +495,7 @@ static struct option copy_options[] = {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR}, {"remove-section", required_argument, 0, 'R'}, {"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS}, + {"strip-section-headers", no_argument, 0, OPTION_STRIP_SECTION_HEADERS}, {"rename-section", required_argument, 0, OPTION_RENAME_SECTION}, {"reverse-bytes", required_argument, 0, OPTION_REVERSE_BYTES}, {"section-alignment", required_argument, 0, OPTION_PE_SECTION_ALIGNMENT}, @@ -592,6 +596,7 @@ copy_usage (FILE *stream, int exit_status) --add-gnu-debuglink= Add section .gnu_debuglink linking to \n\ -R --remove-section Remove section from the output\n\ --remove-relocations Remove relocations from section \n\ + --strip-section-headers Strip section header from the output\n\ -S --strip-all Remove all symbol and relocation information\n\ -g --strip-debug Remove all debugging symbols & sections\n\ --strip-dwo Remove all DWO sections\n\ @@ -730,6 +735,7 @@ strip_usage (FILE *stream, int exit_status) fprintf (stream, _("\ -R --remove-section= Also remove section from the output\n\ --remove-relocations Remove relocations from section \n\ + --strip-section-headers Strip section headers from the output\n\ -s --strip-all Remove all symbol and relocation information\n\ -g -S -d --strip-debug Remove all debugging symbols & sections\n\ --strip-dwo Remove all DWO sections\n\ @@ -2695,7 +2701,16 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) necessary. */ VerilogDataEndianness = ibfd->xvec->byteorder; - if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) + if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour) + { + if (strip_section_headers) + { + ibfd->flags |= BFD_NO_SECTION_HEADER; + strip_symbols = STRIP_ALL; + merge_notes = true; + } + } + else { if ((do_debug_sections & compress) != 0 && do_debug_sections != compress) @@ -2712,6 +2727,13 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) bfd_get_archive_filename (ibfd)); return false; } + + if (strip_section_headers) + { + non_fatal (_("--strip_section_headers is unsupported on `%s'"), + bfd_get_archive_filename (ibfd)); + return false; + } } if (verbose) @@ -3456,7 +3478,7 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) free (merged); } } - else if (merge_notes && ! is_strip) + else if (merge_notes && ! is_strip && ! strip_section_headers) non_fatal (_("%s: Could not find any mergeable note sections"), bfd_get_filename (ibfd)); @@ -4754,6 +4776,9 @@ strip_main (int argc, char *argv[]) case OPTION_REMOVE_RELOCS: handle_remove_relocations_option (optarg); break; + case OPTION_STRIP_SECTION_HEADERS: + strip_section_headers = true; + break; case 's': strip_symbols = STRIP_ALL; break; @@ -5223,6 +5248,10 @@ copy_main (int argc, char *argv[]) handle_remove_relocations_option (optarg); break; + case OPTION_STRIP_SECTION_HEADERS: + strip_section_headers = true; + break; + case 'S': strip_symbols = STRIP_ALL; break; diff --git a/ld/NEWS b/ld/NEWS index 9920d0209b8..0a471107516 100644 --- a/ld/NEWS +++ b/ld/NEWS @@ -10,6 +10,9 @@ * The linker script syntax has a new command for output sections: ASCIZ "string" This will insert a zero-terminated string at the current location. +* Add command-line option, -z nosectionheader, to omit ELF section + header. + Changes in 2.40: * The linker has a new command line option to suppress the generation of any diff --git a/ld/emultempl/elf.em b/ld/emultempl/elf.em index e367299146f..3f67f8b09d9 100644 --- a/ld/emultempl/elf.em +++ b/ld/emultempl/elf.em @@ -807,6 +807,10 @@ fragment <flags |= BFD_TRADITIONAL_FORMAT; else link_info.output_bfd->flags &= ~BFD_TRADITIONAL_FORMAT; + if (config.no_section_header) + link_info.output_bfd->flags |= BFD_NO_SECTION_HEADER; + else + link_info.output_bfd->flags &= ~BFD_NO_SECTION_HEADER; break; case lang_target_statement_enum: diff --git a/ld/lexsup.c b/ld/lexsup.c index 6090921bda4..37479189154 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -1971,6 +1971,10 @@ parse_args (unsigned argc, char **argv) break; } + /* -z nosectionheader implies --strip-all. */ + if (config.no_section_header) + link_info.strip = strip_all; + if (!bfd_link_dll (&link_info)) { if (command_line.filter_shlib) @@ -2245,6 +2249,10 @@ elf_static_list_options (FILE *file) fprintf (file, _("\ -z start-stop-visibility=V Set visibility of built-in __start/__stop symbols\n\ to DEFAULT, PROTECTED, HIDDEN or INTERNAL\n")); + fprintf (file, _("\ + -z sectionheader Generate section header (default)\n")); + fprintf (file, _("\ + -z nosectionheader Do not generate section header\n")); } static void From patchwork Mon Jun 5 15:32:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 103349 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2768778vqr; Mon, 5 Jun 2023 08:32:42 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5D4kqncuWx/j1RqEhhJPcTBBlMopNN1hNyzm7yMjkmT46P+WMYRSpUgRtSDCHnAmtxdCW3 X-Received: by 2002:ac2:4d1b:0:b0:4f5:1ac9:ab1b with SMTP id r27-20020ac24d1b000000b004f51ac9ab1bmr5076100lfi.23.1685979162755; Mon, 05 Jun 2023 08:32:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685979162; cv=none; d=google.com; s=arc-20160816; b=nfchU4u7RhQGfj8EIBIMxgQ2BR3fsNpkk10SSXC2DPiwwif4HWRqW1Ckrq/4ykEUWC gzOfkewHDwBfQTs95MXS46RK2qRi3LI5D2w893bigwyD0oDFanf6AGviZ6ls3XGTdZcg 1vji6pNr89Ukkf87CNAKyz87DcbCVEWJ5Oq4XCZOPSbsy6eC+VQLRrf4g+DoTj9KvL3u 0ke0n/bPRwkHfHIL27dwiPe56H41We/uy3t7xC+vD+VkBufznNHROL7jRgilDcOVLwwW d63nkKSv26EiZ9Mq96EiwDEA8unv4zyo5xBTAwUXpFsVeCGRYVHjFMTgtY9HAL2EudN2 besQ== 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-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=H/aKyzJ7QAjmspD2Rm7JZgmwvu/OQuq/2aSBYIQwf8Y=; b=g0J5+ZxbM2rJKfgG+jZUqeLu/aQ/k+IUbhF/vEvtqBRA+aUsaGAN4s6Ja311wkXHB8 ULkK3aXr+tBaP8lhbsapjFAUczMyTpJf9nu9h/VK4Zbjl/CdLunEI02X89KXsgefB40V 2fQ31jPcip2IaAKWPzYMeWl1cYl0IzpqNVPbW0/grE0H2JXvHWgeJjI7EUGKbQEOdOOG XJ+A5raiZqDWFEp+scYZdI1RQgt0mhPvOOkfPentKhzukhPF71qKSg6n7CrOg95eDuPj u6cQxRTLgg85eJcynWR4K0TikRrll5g8Uuk42ldTzbcEslOKjp0cFoKMgFY8YVcOOCub iYeg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=Cj8AxUyN; 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 j17-20020aa7c0d1000000b00514b2ca0a65si5552224edp.356.2023.06.05.08.32.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:32:42 -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=Cj8AxUyN; 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 551B53882666 for ; Mon, 5 Jun 2023 15:32:36 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 551B53882666 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685979156; bh=H/aKyzJ7QAjmspD2Rm7JZgmwvu/OQuq/2aSBYIQwf8Y=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=Cj8AxUyNPsgtIAV6OL3qRvVoxO7QXIh3nYTC4cJWL61vQrPp3nwzAfgC+lt3Nc+Xv tKEIvyZkUNzeU6ZpWh5gFmhBEfmAjXXhS6YFAs6eiYkcZ7oLgr4jA5EteS/QaWS+ZV XcZPXD5zGjXRLHC4X/l59qGujhycEWMdzw4fUS40= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pf1-x431.google.com (mail-pf1-x431.google.com [IPv6:2607:f8b0:4864:20::431]) by sourceware.org (Postfix) with ESMTPS id E458A3882664 for ; Mon, 5 Jun 2023 15:32:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E458A3882664 Received: by mail-pf1-x431.google.com with SMTP id d2e1a72fcca58-65540715b4bso1012702b3a.0 for ; Mon, 05 Jun 2023 08:32:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685979147; x=1688571147; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=H/aKyzJ7QAjmspD2Rm7JZgmwvu/OQuq/2aSBYIQwf8Y=; b=f0fBKtwQEaBBQ3wxPRG2BewrBzA1fI3AwQlWR2DJ+e3n485symZpfaU9kxPjHuRPnv CBsOanZev79LOkQ4fewYoE8cNusKfEKgwnCs1nviZvEI41chviIdAnY6JXURJy9fyl6t wMo7MnOPxW+eOqOoXGVVrD2ENTwVnV2tARXojUnMg42ayhIIhqpAuXgNF3csy+YZauay s55ru4/YBRnM2hu7zvZ3758xggYpbAN1lidAPA3glPB5Eb+ycM5px0qmC8QHImPFTW4d 2miUFqhwAafiVqlGX2KhMjUjBOWTFGHU/p70M36ZpKdrANWecjYRc5Wepg39d+aFM7dL qaUA== X-Gm-Message-State: AC+VfDxmVC2QO30UordDEg0CvnlY5rJF5STytxqpmjh9XaHDM0vf+hXt XBuHuVIU1sJg7Kj3qLtg/U5COJDXUU0= X-Received: by 2002:a05:6a20:7fa9:b0:10b:2214:7ab1 with SMTP id d41-20020a056a207fa900b0010b22147ab1mr2881298pzj.18.1685979146641; Mon, 05 Jun 2023 08:32:26 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id e9-20020a656789000000b0052c562bd942sm5345345pgr.19.2023.06.05.08.32.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:32:26 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 548807402B7; Mon, 5 Jun 2023 08:32:25 -0700 (PDT) To: binutils@sourceware.org Cc: Alan Modra , Kaylee Blake Subject: [PATCH v3 2/7] ELF: Discard non-alloc sections without section header Date: Mon, 5 Jun 2023 08:32:17 -0700 Message-Id: <20230605153222.1728119-3-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230605153222.1728119-1-hjl.tools@gmail.com> References: <20230605153222.1728119-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3025.1 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: "H.J. Lu via Binutils" From: "H.J. Lu" Reply-To: "H.J. Lu" 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?1767877286879406811?= X-GMAIL-MSGID: =?utf-8?q?1767877286879406811?= Discard non-alloc sections when section headers are stripped. bfd/ PR ld/25617 * elf.c (_bfd_elf_assign_file_positions_for_non_load): Skip non-load sections without section header. (_bfd_elf_write_object_contents): Don't set the sh_name field without section header. Write out the .shstrtab section only if its sh_offset field isn't -1. binutils/ PR ld/25617 * objcopy.c (is_strip_section_1): Remove non-alloc sections for --strip-section-headers. ld/ PR ld/25617 * ldlang.c (lang_discard_section_p): Discard non-alloc sections if we are stripping section headers. --- bfd/elf.c | 13 ++++++++++--- binutils/objcopy.c | 5 +++++ ld/ldlang.c | 4 ++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/bfd/elf.c b/bfd/elf.c index 81eb3ef71fa..07ad15ddb2f 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -6597,6 +6597,10 @@ _bfd_elf_assign_file_positions_for_non_load (bfd *abfd) Elf_Internal_Ehdr *i_ehdrp; const struct elf_backend_data *bed; + /* Skip non-load sections without section header. */ + if ((abfd->flags & BFD_NO_SECTION_HEADER) != 0) + return true; + off = elf_next_file_pos (abfd); shdrpp = elf_elfsections (abfd); @@ -6720,9 +6724,11 @@ _bfd_elf_write_object_contents (bfd *abfd) num_sec = elf_numsections (abfd); for (count = 1; count < num_sec; count++) { - i_shdrp[count]->sh_name - = _bfd_elf_strtab_offset (elf_shstrtab (abfd), - i_shdrp[count]->sh_name); + /* Don't set the sh_name field without section header. */ + if ((abfd->flags & BFD_NO_SECTION_HEADER) == 0) + i_shdrp[count]->sh_name + = _bfd_elf_strtab_offset (elf_shstrtab (abfd), + i_shdrp[count]->sh_name); if (bed->elf_backend_section_processing) if (!(*bed->elf_backend_section_processing) (abfd, i_shdrp[count])) return false; @@ -6739,6 +6745,7 @@ _bfd_elf_write_object_contents (bfd *abfd) /* Write out the section header names. */ t = elf_tdata (abfd); if (elf_shstrtab (abfd) != NULL + && t->shstrtab_hdr.sh_offset != -1 && (bfd_seek (abfd, t->shstrtab_hdr.sh_offset, SEEK_SET) != 0 || !_bfd_elf_strtab_emit (abfd, elf_shstrtab (abfd)))) return false; diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 6112bbb9bdb..f1100b8c1e9 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -1377,6 +1377,11 @@ is_strip_section_1 (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) return true; } + /* Remove non-alloc sections for --strip-section-headers. */ + if (strip_section_headers + && (bfd_section_flags (sec) & SEC_ALLOC) == 0) + return true; + if ((bfd_section_flags (sec) & SEC_DEBUGGING) != 0) { if (strip_symbols == STRIP_DEBUG diff --git a/ld/ldlang.c b/ld/ldlang.c index 43ff43339a2..740fdb4ce2f 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -2520,6 +2520,10 @@ lang_discard_section_p (asection *section) && (flags & SEC_DEBUGGING) != 0) discard = true; + /* Discard non-alloc sections if we are stripping section headers. */ + else if (config.no_section_header && (flags & SEC_ALLOC) == 0) + discard = true; + return discard; } From patchwork Mon Jun 5 15:32:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 103354 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2770942vqr; Mon, 5 Jun 2023 08:36:22 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4EJwPhwAw5mw+1v5iUMtfgEXxew5QxDaCPLkte8mFme8Cjs143SF61Nlqc4GTGGpREs/8P X-Received: by 2002:a17:907:6d12:b0:953:834d:899b with SMTP id sa18-20020a1709076d1200b00953834d899bmr5963589ejc.29.1685979382305; Mon, 05 Jun 2023 08:36:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685979382; cv=none; d=google.com; s=arc-20160816; b=gYnCZ0v+BOTyiHvHNqMssQ/HZA7ls7X4l32phYaKPQcqN7eCYzyP5d8bNfo6noHM8D qrxXDq/xZU0TfVoaptWBkaJvc1ak/BxX6ogJ4Z7tVP5DSSA1j79fKRZ8pSxLTo14wwY4 blDDiDA71yt+u6hPAsNT46p6sx+81U9xRC2usv5PDWjz9ClrXGGIrBxYOdzCfX9LED5e k1ZNJMMz4xxsjppxEa+eszU0557njN4rRu89NeSmX/5ZlSxVwMYevcXA6JU5KjEq1GG5 2m6WjyTfykvbWqSJReUfavoTqZuz8OQNC1NYf5Yqo/WBpYW7qDhp+RXhn4FDBUL6qAdZ xDdw== 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-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=Z/aOHs5iQvvEYBpxoe3myD3k8IIpt558Br+p4jsk1oE=; b=Dv2zarsPVrusLpdkEbeYCJ1imZuAk/+veLMXa7NBTeBlIqAcvFtOpiOXOxh5wS5/wT kQvkpXgjTJ8Bqgg7ywm2w3Mbn83GcBvdQC5tltFPmWMFbKYSNiH/QJdj19buJgNTLXw5 P7RWNGJY0R1+kI5+vS67FKF1EJFoyzWWQN3cuT8YHSZb1B9IGI/MwOnR7Wea+h5QJ7oE MclIESnwNjuDjA3QFegU2xUMNasTBm3X+Qiuf88WUswLcSd+Ex0W4w0kq+MIqUF5WDNf IdQ3VJGKg8bT4pnCLDKjcBG5ptubqCCEiHCPwFlgolMJFfguhiK7KJeT6B1zJUosJWAD q4dg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=FN0XAdn6; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 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 ([8.43.85.97]) by mx.google.com with ESMTPS id d7-20020a1709067a0700b0094effaaa050si5561989ejo.50.2023.06.05.08.36.21 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:36:22 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=FN0XAdn6; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 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 F08E138A9098 for ; Mon, 5 Jun 2023 15:34:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F08E138A9098 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685979245; bh=Z/aOHs5iQvvEYBpxoe3myD3k8IIpt558Br+p4jsk1oE=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=FN0XAdn6E1yKhAqCYrpPwOqT7B84kIP05DKn32xmDJnnSsf9hBe7P3JtDMBwPIf7T 9HtkQxEfgCtcR4qk5CVjrJXMnp0w34aZXkwRZYU8gkt5EEn15fBdUhCCvcZyPikYbN N1LIASIdqkav8o0UG6IewJklnPDZzgaKa3+HB9EM= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pf1-x42c.google.com (mail-pf1-x42c.google.com [IPv6:2607:f8b0:4864:20::42c]) by sourceware.org (Postfix) with ESMTPS id 851EE3882661 for ; Mon, 5 Jun 2023 15:32:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 851EE3882661 Received: by mail-pf1-x42c.google.com with SMTP id d2e1a72fcca58-6563ccf5151so2163665b3a.0 for ; Mon, 05 Jun 2023 08:32:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685979147; x=1688571147; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Z/aOHs5iQvvEYBpxoe3myD3k8IIpt558Br+p4jsk1oE=; b=mHt/uywZnS/OWtviHIkgOlbN74oF7bsAXFUSZi5hVlRiQOZzV57ZFaL1wijqyEJ9x4 DbAtUhKpu+uRdhn5Sam/zcotg1nJ88nE4WRh0JhkuLUlB8IwkAW0tbRQ3Cdb9RnuCHgf fBYm7HcPIkVVZTP6luXOYPCK7hPdTtj9usONBhlyIHofDBWynKg6rzrYJxAT6KInewsJ qca81a+6KrEDgDdP/yRzHhTnCl35wmTqvh4xuyszYmJA0xMKUYbvQ0cd/MCgI1niWYGk btXLZT7MmBQ9r0C3UaoBHfaBPQ+aVoSkQsBKA+hkhJum1iiOgZ26JuKdhGyQvOfiBswQ pJKw== X-Gm-Message-State: AC+VfDxmoXP1vpfdzancDjUlQY4v1PQ2X7Cms4mCEjRY8km2SWMkpmlu sbC/fv4Adm5o+MpCRChD3GI2gFly4us= X-Received: by 2002:a05:6a00:150c:b0:65b:ccb0:8f00 with SMTP id q12-20020a056a00150c00b0065bccb08f00mr109608pfu.4.1685979147042; Mon, 05 Jun 2023 08:32:27 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id b7-20020aa78107000000b0064d3a9def35sm5301577pfi.188.2023.06.05.08.32.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:32:26 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 6068E7402E3; Mon, 5 Jun 2023 08:32:25 -0700 (PDT) To: binutils@sourceware.org Cc: Alan Modra , Kaylee Blake Subject: [PATCH v3 3/7] bfd: Improve nm and objdump without section header Date: Mon, 5 Jun 2023 08:32:18 -0700 Message-Id: <20230605153222.1728119-4-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230605153222.1728119-1-hjl.tools@gmail.com> References: <20230605153222.1728119-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3025.2 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: "H.J. Lu via Binutils" From: "H.J. Lu" Reply-To: "H.J. Lu" 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?1767877517183190823?= X-GMAIL-MSGID: =?utf-8?q?1767877517183190823?= When there is no section header in an executable or shared library, we reconstruct dynamic symbol table from the PT_DYNAMIC segment, which contains DT_HASH/DT_GNU_HASH/DT_MIPS_XHASH, DT_STRTAB, DT_SYMTAB, DT_STRSZ, and DT_SYMENT entries, to improve nm and objdump. For DT_HASH, the number of dynamic symbol table entries equals the number of chains. For DT_GNU_HASH/DT_MIPS_XHASH, only defined symbols with non-STB_LOCAL indings are in hash table. Since DT_GNU_HASH/DT_MIPS_XHASH place all symbols with STB_LOCAL binding before symbols with other bindings and all undefined symbols defined ones in dynamic symbol table, the highest symbol index in DT_GNU_HASH/DT_MIPS_XHASH is the highest dynamic symbol table index. We can also get symbol version from DT_VERSYM, DT_VERDEF and DT_VERNEED entries. dt_symtab, dt_versym, dt_verdef, dt_verneed, dt_symtab_count, dt_verdef_count, dt_verneed_count and dt_strtab are added to elf_obj_tdata to store dynamic symbol table information. PR ld/25617 * elf-bfd.h (elf_obj_tdata): Add dt_symtab, dt_verdef, dt_verneed, dt_symtab_count, dt_verdef_count, dt_verneed_count and dt_strtab. (elf_use_dt_symtab_p): New. (_bfd_elf_get_dynamic_symbols): Likewise. (_bfd_elf_get_section_from_dynamic_symbol): Likewise. * elf.c (bfd_elf_get_elf_syms): Use dynamic symbol table if neeeded. (_bfd_elf_get_dynamic_symtab_upper_bound): Likewise. (_bfd_elf_slurp_version_tables): Likewise. (offset_from_vma): New function. (get_hash_table_data): Likewise. (_bfd_elf_get_dynamic_symbols): Likewise. (_bfd_elf_get_section_from_dynamic_symbol): Likewise. (_bfd_elf_get_symbol_version_name): Likewise. * elfcode.h (elf_object_p): Call _bfd_elf_get_dynamic_symbols to reconstruct dynamic symbol table from PT_DYNAMIC segment if there is no section header. (elf_slurp_symbol_table): Use dynamic symbol table if neeeded. Don't free isymbuf when dynamic symbol table is used. * elflink.c (elf_link_is_defined_archive_symbol): Return wrong format error when dynamic symbol table is used. (elf_link_add_object_symbols): Likewise. --- bfd/elf-bfd.h | 15 + bfd/elf.c | 742 ++++++++++++++++++++++++++++++++++++++++++++++---- bfd/elfcode.h | 55 +++- bfd/elflink.c | 12 + 4 files changed, 759 insertions(+), 65 deletions(-) diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 2a64a1e6a03..dd8d6efbbcc 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -2031,6 +2031,14 @@ struct elf_obj_tdata Elf_Internal_Shdr dynversym_hdr; Elf_Internal_Shdr dynverref_hdr; Elf_Internal_Shdr dynverdef_hdr; + Elf_Internal_Sym *dt_symtab; + bfd_byte *dt_versym; + bfd_byte *dt_verdef; + bfd_byte *dt_verneed; + size_t dt_symtab_count; + size_t dt_verdef_count; + size_t dt_verneed_count; + char *dt_strtab; elf_section_list * symtab_shndx_list; bfd_vma gp; /* The gp value */ unsigned int gp_size; /* The gp size */ @@ -2194,6 +2202,7 @@ struct elf_obj_tdata #define elf_dyn_lib_class(bfd) (elf_tdata(bfd) -> dyn_lib_class) #define elf_bad_symtab(bfd) (elf_tdata(bfd) -> bad_symtab) #define elf_flags_init(bfd) (elf_tdata(bfd) -> o->flags_init) +#define elf_use_dt_symtab_p(bfd) (elf_tdata(bfd) -> dt_symtab_count != 0) #define elf_known_obj_attributes(bfd) (elf_tdata (bfd) -> known_obj_attributes) #define elf_other_obj_attributes(bfd) (elf_tdata (bfd) -> other_obj_attributes) #define elf_known_obj_attributes_proc(bfd) \ @@ -2587,6 +2596,12 @@ extern bfd_reloc_status_type bfd_elf_perform_complex_relocation extern bool _bfd_elf_setup_sections (bfd *); +extern bool _bfd_elf_get_dynamic_symbols + (bfd *, Elf_Internal_Phdr *, Elf_Internal_Phdr *, size_t, + bfd_size_type); +extern asection *_bfd_elf_get_section_from_dynamic_symbol + (bfd *, Elf_Internal_Sym *); + extern struct bfd_link_hash_entry *bfd_elf_define_start_stop (struct bfd_link_info *, const char *, asection *); diff --git a/bfd/elf.c b/bfd/elf.c index 07ad15ddb2f..3ab44a8e02e 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -397,6 +397,17 @@ bfd_elf_get_elf_syms (bfd *ibfd, if (symcount == 0) return intsym_buf; + if (elf_use_dt_symtab_p (ibfd)) + { + /* Use dynamic symbol table. */ + if (elf_tdata (ibfd)->dt_symtab_count != (symcount + symoffset)) + { + bfd_set_error (bfd_error_invalid_operation); + return NULL; + } + return elf_tdata (ibfd)->dt_symtab + symoffset; + } + /* Normal syms might have section extension entries. */ shndx_hdr = NULL; if (elf_symtab_shndx_list (ibfd) != NULL) @@ -1873,6 +1884,564 @@ _bfd_elf_print_private_bfd_data (bfd *abfd, void *farg) return false; } +/* Find the file offset corresponding to VMA by using the program + headers. */ + +static file_ptr +offset_from_vma (Elf_Internal_Phdr *phdrs, size_t phnum, bfd_vma vma, + size_t size, size_t *max_size_p) +{ + Elf_Internal_Phdr *seg; + size_t i; + + for (seg = phdrs, i = 0; i < phnum; ++seg, ++i) + if (seg->p_type == PT_LOAD + && vma >= (seg->p_vaddr & -seg->p_align) + && vma + size <= seg->p_vaddr + seg->p_filesz) + { + if (max_size_p) + *max_size_p = seg->p_vaddr + seg->p_filesz - vma; + return (file_ptr) (vma - seg->p_vaddr + seg->p_offset); + } + + bfd_set_error (bfd_error_invalid_operation); + return (file_ptr) -1; +} + +/* Convert hash table to internal form. */ + +static bfd_vma * +get_hash_table_data (bfd *abfd, bfd_size_type number, + unsigned int ent_size, bfd_size_type filesize) +{ + unsigned char *e_data = NULL; + bfd_vma *i_data = NULL; + bfd_size_type size; + + if (ent_size != 4 && ent_size != 8) + return NULL; + + /* If the size_t type is smaller than the bfd_size_type, eg because + you are building a 32-bit tool on a 64-bit host, then make sure + that when (number) is cast to (size_t) no information is lost. */ + if (sizeof (size_t) < sizeof (bfd_size_type) + && (bfd_size_type) ((size_t) number) != number) + { + bfd_set_error (bfd_error_file_too_big); + return NULL; + } + + size = ent_size * number; + /* Be kind to memory checkers (eg valgrind, address sanitizer) by not + attempting to allocate memory when the read is bound to fail. */ + if (size > filesize + || number >= ~(size_t) 0 / ent_size + || number >= ~(size_t) 0 / sizeof (*i_data)) + { + bfd_set_error (bfd_error_file_too_big); + return NULL; + } + + e_data = _bfd_malloc_and_read (abfd, size, size); + if (e_data == NULL) + return NULL; + + i_data = (bfd_vma *) bfd_malloc (number * sizeof (*i_data)); + if (i_data == NULL) + { + free (e_data); + return NULL; + } + + if (ent_size == 4) + while (number--) + i_data[number] = bfd_get_32 (abfd, e_data + number * ent_size); + else + while (number--) + i_data[number] = bfd_get_64 (abfd, e_data + number * ent_size); + + free (e_data); + return i_data; +} + +/* Address of .MIPS.xhash section. FIXME: What is the best way to + support DT_MIPS_XHASH? */ +#define DT_MIPS_XHASH 0x70000036 + +/* Reconstruct dynamic symbol table from PT_DYNAMIC segment. */ + +bool +_bfd_elf_get_dynamic_symbols (bfd *abfd, Elf_Internal_Phdr *phdr, + Elf_Internal_Phdr *phdrs, size_t phnum, + bfd_size_type filesize) +{ + bfd_byte *extdyn, *extdynend; + size_t extdynsize; + void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *); + bool (*swap_symbol_in) (bfd *, const void *, const void *, + Elf_Internal_Sym *); + Elf_Internal_Dyn dyn; + bfd_vma dt_hash = 0; + bfd_vma dt_gnu_hash = 0; + bfd_vma dt_mips_xhash = 0; + bfd_vma dt_strtab = 0; + bfd_vma dt_symtab = 0; + size_t dt_strsz = 0; + bfd_vma dt_versym = 0; + bfd_vma dt_verdef = 0; + bfd_vma dt_verneed = 0; + bfd_byte *dynbuf = NULL; + char *strbuf = NULL; + bfd_vma *gnubuckets = NULL; + bfd_vma *gnuchains = NULL; + bfd_vma *mipsxlat = NULL; + file_ptr saved_filepos, filepos; + bool res = false; + size_t amt; + bfd_byte *esymbuf = NULL, *esym; + bfd_size_type symcount; + Elf_Internal_Sym *isymbuf = NULL; + Elf_Internal_Sym *isym, *isymend; + bfd_byte *versym = NULL; + bfd_byte *verdef = NULL; + bfd_byte *verneed = NULL; + size_t verdef_size; + size_t verneed_size; + size_t extsym_size; + const struct elf_backend_data *bed; + + /* Return TRUE if symbol table is bad. */ + if (elf_bad_symtab (abfd)) + return true; + + /* Return TRUE if DT_HASH/DT_GNU_HASH have bee processed before. */ + if (elf_tdata (abfd)->dt_strtab != NULL) + return true; + + bed = get_elf_backend_data (abfd); + + /* Save file position for elf_object_p. */ + saved_filepos = bfd_tell (abfd); + + if (bfd_seek (abfd, phdr->p_offset, SEEK_SET) != 0) + goto error_return; + + dynbuf = _bfd_malloc_and_read (abfd, phdr->p_filesz, phdr->p_filesz); + if (dynbuf == NULL) + goto error_return; + + extsym_size = bed->s->sizeof_sym; + extdynsize = bed->s->sizeof_dyn; + swap_dyn_in = bed->s->swap_dyn_in; + + extdyn = dynbuf; + if (phdr->p_filesz < extdynsize) + goto error_return; + extdynend = extdyn + phdr->p_filesz; + for (; extdyn <= (extdynend - extdynsize); extdyn += extdynsize) + { + swap_dyn_in (abfd, extdyn, &dyn); + + if (dyn.d_tag == DT_NULL) + break; + + switch (dyn.d_tag) + { + case DT_HASH: + dt_hash = dyn.d_un.d_val; + break; + case DT_GNU_HASH: + if (bed->elf_machine_code != EM_MIPS + && bed->elf_machine_code != EM_MIPS_RS3_LE) + dt_gnu_hash = dyn.d_un.d_val; + break; + case DT_STRTAB: + dt_strtab = dyn.d_un.d_val; + break; + case DT_SYMTAB: + dt_symtab = dyn.d_un.d_val; + break; + case DT_STRSZ: + dt_strsz = dyn.d_un.d_val; + break; + case DT_SYMENT: + if (dyn.d_un.d_val != extsym_size) + goto error_return; + break; + case DT_VERSYM: + dt_versym = dyn.d_un.d_val; + break; + case DT_VERDEF: + dt_verdef = dyn.d_un.d_val; + break; + case DT_VERNEED: + dt_verneed = dyn.d_un.d_val; + break; + default: + if (dyn.d_tag == DT_MIPS_XHASH + && (bed->elf_machine_code == EM_MIPS + || bed->elf_machine_code == EM_MIPS_RS3_LE)) + { + dt_gnu_hash = dyn.d_un.d_val; + dt_mips_xhash = dyn.d_un.d_val; + } + break; + } + } + + /* Check if we can reconstruct dynamic symbol table from PT_DYNAMIC + segment. */ + if ((!dt_hash && !dt_gnu_hash) + || !dt_strtab + || !dt_symtab + || !dt_strsz) + goto error_return; + + /* Get dynamic string table. */ + filepos = offset_from_vma (phdrs, phnum, dt_strtab, dt_strsz, NULL); + if (filepos == (file_ptr) -1 + || bfd_seek (abfd, filepos, SEEK_SET) != 0) + goto error_return; + + /* Dynamic string table must be valid until ABFD is closed. */ + strbuf = (char *) _bfd_alloc_and_read (abfd, dt_strsz, dt_strsz); + if (strbuf == NULL) + goto error_return; + + /* Get the real symbol count from DT_HASH or DT_GNU_HASH. Prefer + DT_HASH since it is simpler than DT_GNU_HASH. */ + if (dt_hash) + { + unsigned char nb[16]; + unsigned int hash_ent_size; + + switch (bed->elf_machine_code) + { + case EM_ALPHA: + case EM_S390: + case EM_S390_OLD: + if (bed->s->elfclass == ELFCLASS64) + { + hash_ent_size = 8; + break; + } + /* FALLTHROUGH */ + default: + hash_ent_size = 4; + break; + } + + filepos = offset_from_vma (phdrs, phnum, dt_hash, sizeof (nb), + NULL); + if (filepos == (file_ptr) -1 + || bfd_seek (abfd, filepos, SEEK_SET) != 0 + || (bfd_bread (nb, 2 * hash_ent_size, abfd) + != (2 * hash_ent_size))) + goto error_return; + + /* The number of dynamic symbol table entries equals the number + of chains. */ + if (hash_ent_size == 8) + symcount = bfd_get_64 (abfd, nb + hash_ent_size); + else + symcount = bfd_get_32 (abfd, nb + hash_ent_size); + } + else + { + /* For DT_GNU_HASH, only defined symbols with non-STB_LOCAL + bindings are in hash table. Since in dynamic symbol table, + all symbols with STB_LOCAL binding are placed before symbols + with other bindings and all undefined symbols are placed + before defined ones, the highest symbol index in DT_GNU_HASH + is the highest dynamic symbol table index. */ + unsigned char nb[16]; + bfd_vma ngnubuckets; + bfd_vma gnusymidx; + size_t i, ngnuchains; + bfd_vma maxchain = 0xffffffff, bitmaskwords; + bfd_vma buckets_vma; + + filepos = offset_from_vma (phdrs, phnum, dt_gnu_hash, + sizeof (nb), NULL); + if (filepos == (file_ptr) -1 + || bfd_seek (abfd, filepos, SEEK_SET) != 0 + || bfd_bread (nb, sizeof (nb), abfd) != sizeof (nb)) + goto error_return; + + ngnubuckets = bfd_get_32 (abfd, nb); + gnusymidx = bfd_get_32 (abfd, nb + 4); + bitmaskwords = bfd_get_32 (abfd, nb + 8); + buckets_vma = dt_gnu_hash + 16; + if (bed->s->elfclass == ELFCLASS32) + buckets_vma += bitmaskwords * 4; + else + buckets_vma += bitmaskwords * 8; + filepos = offset_from_vma (phdrs, phnum, buckets_vma, 4, NULL); + if (filepos == (file_ptr) -1 + || bfd_seek (abfd, filepos, SEEK_SET) != 0) + goto error_return; + + gnubuckets = get_hash_table_data (abfd, ngnubuckets, 4, filesize); + if (gnubuckets == NULL) + goto error_return; + + for (i = 0; i < ngnubuckets; i++) + if (gnubuckets[i] != 0) + { + if (gnubuckets[i] < gnusymidx) + goto error_return; + + if (maxchain == 0xffffffff || gnubuckets[i] > maxchain) + maxchain = gnubuckets[i]; + } + + if (maxchain == 0xffffffff) + { + symcount = 0; + goto empty_gnu_hash; + } + + maxchain -= gnusymidx; + filepos = offset_from_vma (phdrs, phnum, + (buckets_vma + + 4 * (ngnubuckets + maxchain)), + 4, NULL); + if (filepos == (file_ptr) -1 + || bfd_seek (abfd, filepos, SEEK_SET) != 0) + goto error_return; + + do + { + if (bfd_bread (nb, 4, abfd) != 4) + goto error_return; + ++maxchain; + if (maxchain == 0) + goto error_return; + } + while ((bfd_get_32 (abfd, nb) & 1) == 0); + + filepos = offset_from_vma (phdrs, phnum, + (buckets_vma + 4 * ngnubuckets), + 4, NULL); + if (filepos == (file_ptr) -1 + || bfd_seek (abfd, filepos, SEEK_SET) != 0) + goto error_return; + + gnuchains = get_hash_table_data (abfd, maxchain, 4, filesize); + if (gnubuckets == NULL) + goto error_return; + ngnuchains = maxchain; + + if (dt_mips_xhash) + { + filepos = offset_from_vma (phdrs, phnum, + (buckets_vma + + 4 * (ngnubuckets + maxchain)), + 4, NULL); + if (filepos == (file_ptr) -1 + || bfd_seek (abfd, filepos, SEEK_SET) != 0) + goto error_return; + + mipsxlat = get_hash_table_data (abfd, maxchain, 4, filesize); + if (mipsxlat == NULL) + goto error_return; + } + + symcount = 0; + for (i = 0; i < ngnubuckets; ++i) + if (gnubuckets[i] != 0) + { + bfd_vma si = gnubuckets[i]; + bfd_vma off = si - gnusymidx; + do + { + if (mipsxlat) + { + if (mipsxlat[off] >= symcount) + symcount = mipsxlat[off] + 1; + } + else + { + if (si >= symcount) + symcount = si + 1; + } + si++; + } + while (off < ngnuchains && (gnuchains[off++] & 1) == 0); + } + } + + /* Swap in dynamic symbol table. */ + if (_bfd_mul_overflow (symcount, extsym_size, &amt)) + { + bfd_set_error (bfd_error_file_too_big); + goto error_return; + } + + filepos = offset_from_vma (phdrs, phnum, dt_symtab, amt, NULL); + if (filepos == (file_ptr) -1 + || bfd_seek (abfd, filepos, SEEK_SET) != 0) + goto error_return; + esymbuf = _bfd_malloc_and_read (abfd, amt, amt); + if (esymbuf == NULL) + goto error_return; + + if (_bfd_mul_overflow (symcount, sizeof (Elf_Internal_Sym), &amt)) + { + bfd_set_error (bfd_error_file_too_big); + goto error_return; + } + + /* Dynamic symbol table must be valid until ABFD is closed. */ + isymbuf = (Elf_Internal_Sym *) bfd_alloc (abfd, amt); + if (isymbuf == NULL) + goto error_return; + + swap_symbol_in = bed->s->swap_symbol_in; + + /* Convert the symbols to internal form. */ + isymend = isymbuf + symcount; + for (esym = esymbuf, isym = isymbuf; + isym < isymend; + esym += extsym_size, isym++) + if (!swap_symbol_in (abfd, esym, NULL, isym) + || isym->st_name >= dt_strsz) + { + bfd_set_error (bfd_error_invalid_operation); + goto error_return; + } + + if (dt_versym) + { + /* Swap in DT_VERSYM. */ + if (_bfd_mul_overflow (symcount, 2, &amt)) + { + bfd_set_error (bfd_error_file_too_big); + goto error_return; + } + + filepos = offset_from_vma (phdrs, phnum, dt_versym, amt, NULL); + if (filepos == (file_ptr) -1 + || bfd_seek (abfd, filepos, SEEK_SET) != 0) + goto error_return; + + /* DT_VERSYM info must be valid until ABFD is closed. */ + versym = _bfd_alloc_and_read (abfd, amt, amt); + + if (dt_verdef) + { + /* Read in DT_VERDEF. */ + filepos = offset_from_vma (phdrs, phnum, dt_verdef, + 0, &verdef_size); + if (filepos == (file_ptr) -1 + || bfd_seek (abfd, filepos, SEEK_SET) != 0) + goto error_return; + + /* DT_VERDEF info must be valid until ABFD is closed. */ + verdef = _bfd_alloc_and_read (abfd, verdef_size, + verdef_size); + } + + if (dt_verneed) + { + /* Read in DT_VERNEED. */ + filepos = offset_from_vma (phdrs, phnum, dt_verneed, + 0, &verneed_size); + if (filepos == (file_ptr) -1 + || bfd_seek (abfd, filepos, SEEK_SET) != 0) + goto error_return; + + /* DT_VERNEED info must be valid until ABFD is closed. */ + verneed = _bfd_alloc_and_read (abfd, verneed_size, + verneed_size); + } + } + + empty_gnu_hash: + elf_tdata (abfd)->dt_strtab = strbuf; + elf_tdata (abfd)->dt_symtab = isymbuf; + elf_tdata (abfd)->dt_symtab_count = symcount; + elf_tdata (abfd)->dt_versym = versym; + elf_tdata (abfd)->dt_verdef = verdef; + elf_tdata (abfd)->dt_verneed = verneed; + elf_tdata (abfd)->dt_verdef_count + = verdef_size / sizeof (Elf_External_Verdef); + elf_tdata (abfd)->dt_verneed_count + = verneed_size / sizeof (Elf_External_Verneed); + + res = true; + + error_return: + /* Restore file position for elf_object_p. */ + if (bfd_seek (abfd, saved_filepos, SEEK_SET) != 0) + res = false; + if (dynbuf != NULL) + free (dynbuf); + if (esymbuf != NULL) + free (esymbuf); + if (gnubuckets != NULL) + free (gnubuckets); + if (gnuchains != NULL) + free (gnuchains); + if (mipsxlat != NULL) + free (mipsxlat); + return res; +} + +/* Reconstruct section from dynamic symbol. */ + +asection * +_bfd_elf_get_section_from_dynamic_symbol (bfd *abfd, + Elf_Internal_Sym *isym) +{ + asection *sec; + flagword flags; + + if (!elf_use_dt_symtab_p (abfd)) + return NULL; + + flags = SEC_ALLOC | SEC_LOAD; + switch (ELF_ST_TYPE (isym->st_info)) + { + case STT_FUNC: + case STT_GNU_IFUNC: + sec = bfd_get_section_by_name (abfd, ".text"); + if (sec == NULL) + sec = bfd_make_section_with_flags (abfd, + ".text", + flags | SEC_CODE); + break; + case STT_COMMON: + sec = bfd_com_section_ptr; + break; + case STT_OBJECT: + sec = bfd_get_section_by_name (abfd, ".data"); + if (sec == NULL) + sec = bfd_make_section_with_flags (abfd, + ".data", + flags | SEC_DATA); + break; + case STT_TLS: + sec = bfd_get_section_by_name (abfd, ".tdata"); + if (sec == NULL) + sec = bfd_make_section_with_flags (abfd, + ".tdata", + (flags + | SEC_DATA + | SEC_THREAD_LOCAL)); + break; + default: + sec = bfd_abs_section_ptr; + break; + } + + /* NB: Don't place this section in output. */ + if (sec && 0) + sec->output_section = bfd_abs_section_ptr; + + return sec; +} + /* Get version name. If BASE_P is TRUE, return "Base" for VER_FLG_BASE and return symbol version for symbol version itself. */ @@ -1882,8 +2451,11 @@ _bfd_elf_get_symbol_version_string (bfd *abfd, asymbol *symbol, bool *hidden) { const char *version_string = NULL; - if (elf_dynversym (abfd) != 0 - && (elf_dynverdef (abfd) != 0 || elf_dynverref (abfd) != 0)) + if ((elf_dynversym (abfd) != 0 + && (elf_dynverdef (abfd) != 0 || elf_dynverref (abfd) != 0)) + || (elf_tdata (abfd)->dt_versym != NULL + && (elf_tdata (abfd)->dt_verdef != NULL + || elf_tdata (abfd)->dt_verneed != NULL))) { unsigned int vernum = ((elf_symbol_type *) symbol)->version; @@ -8609,6 +9181,11 @@ _bfd_elf_get_dynamic_symtab_upper_bound (bfd *abfd) if (elf_dynsymtab (abfd) == 0) { + /* Check if there is dynamic symbol table. */ + symcount = elf_tdata (abfd)->dt_symtab_count; + if (symcount) + goto compute_symtab_size; + bfd_set_error (bfd_error_invalid_operation); return -1; } @@ -8619,6 +9196,8 @@ _bfd_elf_get_dynamic_symtab_upper_bound (bfd *abfd) bfd_set_error (bfd_error_file_too_big); return -1; } + + compute_symtab_size: symtab_size = symcount * (sizeof (asymbol *)); if (symcount == 0) symtab_size = sizeof (asymbol *); @@ -8826,35 +9405,51 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver) unsigned int freeidx = 0; size_t amt; - if (elf_dynverref (abfd) != 0) + if (elf_dynverref (abfd) != 0 || elf_tdata (abfd)->dt_verneed != NULL) { Elf_Internal_Shdr *hdr; Elf_External_Verneed *everneed; Elf_Internal_Verneed *iverneed; unsigned int i; bfd_byte *contents_end; + size_t verneed_count; + size_t verneed_size; - hdr = &elf_tdata (abfd)->dynverref_hdr; - - if (hdr->sh_info > hdr->sh_size / sizeof (Elf_External_Verneed)) + if (elf_tdata (abfd)->dt_verneed != NULL) { - error_return_bad_verref: - _bfd_error_handler - (_("%pB: .gnu.version_r invalid entry"), abfd); - bfd_set_error (bfd_error_bad_value); - error_return_verref: - elf_tdata (abfd)->verref = NULL; - elf_tdata (abfd)->cverrefs = 0; - goto error_return; + hdr = NULL; + contents = elf_tdata (abfd)->dt_verneed; + verneed_count = elf_tdata (abfd)->dt_verneed_count; + verneed_size = verneed_count * sizeof (Elf_External_Verneed); } + else + { + hdr = &elf_tdata (abfd)->dynverref_hdr; - if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0) - goto error_return_verref; - contents = _bfd_malloc_and_read (abfd, hdr->sh_size, hdr->sh_size); - if (contents == NULL) - goto error_return_verref; + if (hdr->sh_info > hdr->sh_size / sizeof (Elf_External_Verneed)) + { + error_return_bad_verref: + _bfd_error_handler + (_("%pB: .gnu.version_r invalid entry"), abfd); + bfd_set_error (bfd_error_bad_value); + error_return_verref: + elf_tdata (abfd)->verref = NULL; + elf_tdata (abfd)->cverrefs = 0; + goto error_return; + } + + if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0) + goto error_return_verref; + contents = _bfd_malloc_and_read (abfd, hdr->sh_size, hdr->sh_size); + if (contents == NULL) + goto error_return_verref; + + verneed_size = hdr->sh_size; + verneed_count = hdr->sh_info; + } - if (_bfd_mul_overflow (hdr->sh_info, sizeof (Elf_Internal_Verneed), &amt)) + if (_bfd_mul_overflow (verneed_count, + sizeof (Elf_Internal_Verneed), &amt)) { bfd_set_error (bfd_error_file_too_big); goto error_return_verref; @@ -8867,10 +9462,11 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver) BFD_ASSERT (sizeof (Elf_External_Verneed) == sizeof (Elf_External_Vernaux)); - contents_end = contents + hdr->sh_size - sizeof (Elf_External_Verneed); + contents_end = (contents + verneed_size + - sizeof (Elf_External_Verneed)); everneed = (Elf_External_Verneed *) contents; iverneed = elf_tdata (abfd)->verref; - for (i = 0; i < hdr->sh_info; i++, iverneed++) + for (i = 0; i < verneed_count; i++, iverneed++) { Elf_External_Vernaux *evernaux; Elf_Internal_Vernaux *ivernaux; @@ -8880,9 +9476,13 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver) iverneed->vn_bfd = abfd; - iverneed->vn_filename = - bfd_elf_string_from_elf_section (abfd, hdr->sh_link, - iverneed->vn_file); + if (elf_use_dt_symtab_p (abfd)) + iverneed->vn_filename + = elf_tdata (abfd)->dt_strtab + iverneed->vn_file; + else + iverneed->vn_filename + = bfd_elf_string_from_elf_section (abfd, hdr->sh_link, + iverneed->vn_file); if (iverneed->vn_filename == NULL) goto error_return_bad_verref; @@ -8913,9 +9513,13 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver) { _bfd_elf_swap_vernaux_in (abfd, evernaux, ivernaux); - ivernaux->vna_nodename = - bfd_elf_string_from_elf_section (abfd, hdr->sh_link, - ivernaux->vna_name); + if (elf_use_dt_symtab_p (abfd)) + ivernaux->vna_nodename + = elf_tdata (abfd)->dt_strtab + ivernaux->vna_name; + else + ivernaux->vna_nodename + = bfd_elf_string_from_elf_section (abfd, hdr->sh_link, + ivernaux->vna_name); if (ivernaux->vna_nodename == NULL) goto error_return_bad_verref; @@ -8954,11 +9558,12 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver) } elf_tdata (abfd)->cverrefs = i; - free (contents); + if (elf_tdata (abfd)->dt_verneed == NULL) + free (contents); contents = NULL; } - if (elf_dynverdef (abfd) != 0) + if (elf_dynverdef (abfd) != 0 || elf_tdata (abfd)->dt_verdef != NULL) { Elf_Internal_Shdr *hdr; Elf_External_Verdef *everdef; @@ -8968,40 +9573,56 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver) unsigned int i; unsigned int maxidx; bfd_byte *contents_end_def, *contents_end_aux; + size_t verdef_count; + size_t verdef_size; - hdr = &elf_tdata (abfd)->dynverdef_hdr; - - if (hdr->sh_size < sizeof (Elf_External_Verdef)) + if (elf_tdata (abfd)->dt_verdef != NULL) { - error_return_bad_verdef: - _bfd_error_handler - (_("%pB: .gnu.version_d invalid entry"), abfd); - bfd_set_error (bfd_error_bad_value); - error_return_verdef: - elf_tdata (abfd)->verdef = NULL; - elf_tdata (abfd)->cverdefs = 0; - goto error_return; + hdr = NULL; + contents = elf_tdata (abfd)->dt_verdef; + verdef_count = elf_tdata (abfd)->dt_verdef_count; + verdef_size = verdef_count * sizeof (Elf_External_Verdef); } + else + { + hdr = &elf_tdata (abfd)->dynverdef_hdr; - if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0) - goto error_return_verdef; - contents = _bfd_malloc_and_read (abfd, hdr->sh_size, hdr->sh_size); - if (contents == NULL) - goto error_return_verdef; + if (hdr->sh_size < sizeof (Elf_External_Verdef)) + { + error_return_bad_verdef: + _bfd_error_handler + (_("%pB: .gnu.version_d invalid entry"), abfd); + bfd_set_error (bfd_error_bad_value); + error_return_verdef: + elf_tdata (abfd)->verdef = NULL; + elf_tdata (abfd)->cverdefs = 0; + goto error_return; + } + + if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0) + goto error_return_verdef; + contents = _bfd_malloc_and_read (abfd, hdr->sh_size, hdr->sh_size); + if (contents == NULL) + goto error_return_verdef; - BFD_ASSERT (sizeof (Elf_External_Verdef) - >= sizeof (Elf_External_Verdaux)); - contents_end_def = contents + hdr->sh_size - - sizeof (Elf_External_Verdef); - contents_end_aux = contents + hdr->sh_size - - sizeof (Elf_External_Verdaux); + BFD_ASSERT (sizeof (Elf_External_Verdef) + >= sizeof (Elf_External_Verdaux)); + + verdef_count = hdr->sh_info; + verdef_size = hdr->sh_size; + } + + contents_end_def = (contents + verdef_size + - sizeof (Elf_External_Verdef)); + contents_end_aux = (contents + verdef_size + - sizeof (Elf_External_Verdaux)); /* We know the number of entries in the section but not the maximum index. Therefore we have to run through all entries and find the maximum. */ everdef = (Elf_External_Verdef *) contents; maxidx = 0; - for (i = 0; i < hdr->sh_info; ++i) + for (i = 0; i < verdef_count; ++i) { _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem); @@ -9044,7 +9665,7 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver) everdef = (Elf_External_Verdef *) contents; iverdefarr = elf_tdata (abfd)->verdef; - for (i = 0; i < hdr->sh_info; i++) + for (i = 0; i < verdef_count; ++i) { Elf_External_Verdaux *everdaux; Elf_Internal_Verdaux *iverdaux; @@ -9087,9 +9708,13 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver) { _bfd_elf_swap_verdaux_in (abfd, everdaux, iverdaux); - iverdaux->vda_nodename = - bfd_elf_string_from_elf_section (abfd, hdr->sh_link, - iverdaux->vda_name); + if (elf_use_dt_symtab_p (abfd)) + iverdaux->vda_nodename + = elf_tdata (abfd)->dt_strtab + iverdaux->vda_name; + else + iverdaux->vda_nodename + = bfd_elf_string_from_elf_section (abfd, hdr->sh_link, + iverdaux->vda_name); if (iverdaux->vda_nodename == NULL) goto error_return_bad_verdef; @@ -9124,7 +9749,8 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver) ((bfd_byte *) everdef + iverdef->vd_next)); } - free (contents); + if (elf_tdata (abfd)->dt_verdef == NULL) + free (contents); contents = NULL; } else if (default_imported_symver) diff --git a/bfd/elfcode.h b/bfd/elfcode.h index 495e498838d..aae66bcebf8 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -839,6 +839,21 @@ elf_object_p (bfd *abfd) abfd->read_only = 1; } } + if (i_phdr->p_filesz != 0) + { + if ((i_phdr->p_offset + i_phdr->p_filesz) > filesize) + goto got_no_match; + /* Try to reconstruct dynamic symbol table from PT_DYNAMIC + segment if there is no section header. */ + if (i_phdr->p_type == PT_DYNAMIC + && i_ehdrp->e_shstrndx == 0 + && i_ehdrp->e_shoff == 0 + && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr, + elf_tdata (abfd)->phdr, + i_ehdrp->e_phnum, + filesize)) + goto got_no_match; + } } } @@ -1245,7 +1260,9 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic) if ((elf_dynverdef (abfd) != 0 && elf_tdata (abfd)->verdef == NULL) || (elf_dynverref (abfd) != 0 - && elf_tdata (abfd)->verref == NULL)) + && elf_tdata (abfd)->verref == NULL) + || elf_tdata (abfd)->dt_verdef != NULL + || elf_tdata (abfd)->dt_verneed != NULL) { if (!_bfd_elf_slurp_version_tables (abfd, false)) return -1; @@ -1253,11 +1270,15 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic) } ebd = get_elf_backend_data (abfd); - symcount = hdr->sh_size / sizeof (Elf_External_Sym); + symcount = elf_tdata (abfd)->dt_symtab_count; + if (symcount == 0) + symcount = hdr->sh_size / sizeof (Elf_External_Sym); if (symcount == 0) sym = symbase = NULL; else { + size_t i; + isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0, NULL, NULL, NULL); if (isymbuf == NULL) @@ -1304,12 +1325,18 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic) if (xver != NULL) ++xver; isymend = isymbuf + symcount; - for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++) + for (isym = isymbuf + 1, sym = symbase, i = 1; + isym < isymend; + isym++, sym++, i++) { memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym)); sym->symbol.the_bfd = abfd; - sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL); + if (elf_use_dt_symtab_p (abfd)) + sym->symbol.name = (elf_tdata (abfd)->dt_strtab + + isym->st_name); + else + sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL); sym->symbol.value = isym->st_value; if (isym->st_shndx == SHN_UNDEF) @@ -1343,6 +1370,15 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic) moment) about the alignment. */ sym->symbol.value = isym->st_size; } + else if (elf_use_dt_symtab_p (abfd)) + { + asection *sec; + sec = _bfd_elf_get_section_from_dynamic_symbol (abfd, + isym); + if (sec == NULL) + goto error_return; + sym->symbol.section = sec; + } else { sym->symbol.section @@ -1423,7 +1459,10 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic) if (dynamic) sym->symbol.flags |= BSF_DYNAMIC; - if (xver != NULL) + if (elf_tdata (abfd)->dt_versym) + sym->version = bfd_get_16 (abfd, + elf_tdata (abfd)->dt_versym + 2 * i); + else if (xver != NULL) { Elf_Internal_Versym iversym; @@ -1461,13 +1500,15 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic) } free (xverbuf); - if (hdr->contents != (unsigned char *) isymbuf) + if (hdr->contents != (unsigned char *) isymbuf + && !elf_use_dt_symtab_p (abfd)) free (isymbuf); return symcount; error_return: free (xverbuf); - if (hdr->contents != (unsigned char *) isymbuf) + if (hdr->contents != (unsigned char *) isymbuf + && !elf_use_dt_symtab_p (abfd)) free (isymbuf); return -1; } diff --git a/bfd/elflink.c b/bfd/elflink.c index f10faa5f8bd..422c7b25c81 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -3571,6 +3571,12 @@ elf_link_is_defined_archive_symbol (bfd * abfd, carsym * symdef) if (! bfd_check_format (abfd, bfd_object)) return false; + if (elf_use_dt_symtab_p (abfd)) + { + bfd_set_error (bfd_error_wrong_format); + return false; + } + /* Select the appropriate symbol table. If we don't know if the object file is an IR object, give linker LTO plugin a chance to get the correct symbol table. */ @@ -4233,6 +4239,12 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) htab = elf_hash_table (info); bed = get_elf_backend_data (abfd); + if (elf_use_dt_symtab_p (abfd)) + { + bfd_set_error (bfd_error_wrong_format); + return false; + } + if ((abfd->flags & DYNAMIC) == 0) dynamic = false; else From patchwork Mon Jun 5 15:32:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 103351 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2769442vqr; Mon, 5 Jun 2023 08:33:46 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5X939aNYdxiaNxn9+LlU74vDPguKNosSs9FMN8Ywxy1IjU3pYkJFOfqFKYp21KJi2doBju X-Received: by 2002:aa7:d6d1:0:b0:514:9aae:452a with SMTP id x17-20020aa7d6d1000000b005149aae452amr7116799edr.34.1685979226295; Mon, 05 Jun 2023 08:33:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685979226; cv=none; d=google.com; s=arc-20160816; b=bspmjfUXwbn3vlOvSCZ7q0ie4ZSlFY2XpeDFCFkMslS8WATeXs7YckUco/cqEFwJSi 98KRqIOA/DNRAy/ZMhhyCrRgzxGFhM6ACr1szA55FhDRs9FRiJMl5/38s8njrLQ8Ylzt iv04LtwyGCBO2UaUaCIxWB/X2hPlevFCYWqHnewQ1sIJA4vzVffUpV4R97yw/86F4vJM fzW+QUbR5wA1SGBJdb+OrK8JTEjhSL7ab9B2WL0fJyvaGZOEz+iIUwNIH15Ntz7n+Zmw 1bXNwG1+DLhxUOzywpgzSGpLLXLL3cTGuHvnhzwIVZ+XGT2ffVFPidvm09EuzQNMwM5b uCmA== 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-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=O8ZDE2gU/f7zOjwLoU1rb3/Q311/lvMaiT5YM+DcKJU=; b=fseU66BeGZ+reBzJ0H4s/dCLDadBiVIl6ZgXY/BLqHrOS2rksMUzwpJ0ul0r50b7Sn FqhATCIuyGw0KSGNWSUeibZFDVAaQaQgczh5GdPZiRNpyQYbeJnJf8rbxStPbpYvlP6F hxYPcz23x2Af8JK9/KbjNa9+iYqQyG9bhBemNwUWlL84xr5LDJTkRceTnt60F6DTaB9u MqkU2CqBDZik4tFs2Nx0F/yoa117F1DJ6JZq5LqknoxNqqnvV3VEQ/KNLTJu0knWLgow MjXNFdNrd8x1//H8DIyojYNXhstfH8+5woLqL92WxRdqq4L8R7PR4d7P19bk8QBLeEN7 2cvw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=rBXhjHZi; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 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 ([8.43.85.97]) by mx.google.com with ESMTPS id b7-20020a05640202c700b00510b7b71b6dsi4866868edx.520.2023.06.05.08.33.46 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:33:46 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=rBXhjHZi; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 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 919FA388301F for ; Mon, 5 Jun 2023 15:33:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 919FA388301F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685979183; bh=O8ZDE2gU/f7zOjwLoU1rb3/Q311/lvMaiT5YM+DcKJU=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=rBXhjHZi6aizmdesSZ6Yi4tnFG22gtoUaW8nXcd2xxDYpyzCU3Ksk/Sdu6nbH/K56 iUyd3agq4rCJTDn7IsMzMdhPUfuOxwOekTCAymG0X1r57+iEChSlsrDnZXJ3Ks+UYv 9nJtekBQoN6w+mMSr7R58f2UBBa91VnBn7oHq4vQ= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pf1-x432.google.com (mail-pf1-x432.google.com [IPv6:2607:f8b0:4864:20::432]) by sourceware.org (Postfix) with ESMTPS id 56C69388202D for ; Mon, 5 Jun 2023 15:32:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 56C69388202D Received: by mail-pf1-x432.google.com with SMTP id d2e1a72fcca58-65540715b4bso1012707b3a.0 for ; Mon, 05 Jun 2023 08:32:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685979147; x=1688571147; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=O8ZDE2gU/f7zOjwLoU1rb3/Q311/lvMaiT5YM+DcKJU=; b=gXcGodrpl71n2F4qBxUxTw5Ag34kMedip4dbZVy9/dRFVMQG/THiyAwNdSJEedCVwS Kv0MKWRRLYkv1gSf/mQhZIiV0C+VrpLDREuacDRDC4aeRDVOKIWPbugUFe7wMIGQga/U deBoVnKGXrn0I1/EhOyKUzamV3+JG+xYinxLfTMyXLLIvCa9uYaPbr1+PSVnbef6j5D+ ew2HAyqJ53la3dg3yjmABpRg8gEqoAv2CnvV2u1XXCQpDYFnAlqWH/RvwwSsakp3zOIw xSLmlDfeAsie6M3y5HL7tkq5xsSDTtZd60EWeTn70mSCGFPATyBuJQl8oiNcp63uvz98 A34g== X-Gm-Message-State: AC+VfDxeBu8/uqi4I+af9MOHiPcQaWiTJyLTRq3dSiW8NiT0ejUaBJof BZK3CTDqeEp2ym91IdN/RqU= X-Received: by 2002:a17:902:bb92:b0:1b1:7362:9a18 with SMTP id m18-20020a170902bb9200b001b173629a18mr3061107pls.27.1685979147211; Mon, 05 Jun 2023 08:32:27 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id s10-20020a170903200a00b001acad024c8asm6751715pla.40.2023.06.05.08.32.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:32:26 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 6DCB274032B; Mon, 5 Jun 2023 08:32:25 -0700 (PDT) To: binutils@sourceware.org Cc: Alan Modra , Kaylee Blake Subject: [PATCH v3 4/7] ld: Add a simple test for -z nosectionheader Date: Mon, 5 Jun 2023 08:32:19 -0700 Message-Id: <20230605153222.1728119-5-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230605153222.1728119-1-hjl.tools@gmail.com> References: <20230605153222.1728119-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3025.1 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: "H.J. Lu via Binutils" From: "H.J. Lu" Reply-To: "H.J. Lu" 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?1767877353353914987?= X-GMAIL-MSGID: =?utf-8?q?1767877353353914987?= From: Kaylee Blake 2020-03-XX Kaylee Blake PR ld/25617 * testsuite/ld-elf/nosectionheader.d: New file. --- ld/testsuite/ld-elf/nosectionheader.d | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 ld/testsuite/ld-elf/nosectionheader.d diff --git a/ld/testsuite/ld-elf/nosectionheader.d b/ld/testsuite/ld-elf/nosectionheader.d new file mode 100644 index 00000000000..cbaea669b9a --- /dev/null +++ b/ld/testsuite/ld-elf/nosectionheader.d @@ -0,0 +1,14 @@ +#source: start.s +#ld: -z nosectionheader +#readelf: -h -S +#xfail: [uses_genelf] +# These targets don't support -z. + +#... + Start of section headers:[ \t]+0 \(bytes into file\) +#... + Size of section headers:[ \t]+0 \(bytes\) + Number of section headers:[ \t]+0 + Section header string table index:[ \t]+0 + +There are no sections in this file. From patchwork Mon Jun 5 15:32:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 103353 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2770320vqr; Mon, 5 Jun 2023 08:35:18 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4Joj+0OXk4NrZRBSnj9c7VyWNMTweLeNVnABAtS9QrD5PJDFrjZjGH5iWOR4J+dhG1cL5q X-Received: by 2002:a17:907:318d:b0:973:cc48:f19d with SMTP id xe13-20020a170907318d00b00973cc48f19dmr5755705ejb.52.1685979317883; Mon, 05 Jun 2023 08:35:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685979317; cv=none; d=google.com; s=arc-20160816; b=HPqjvGElI4qz4qpXVjLxIzd8QELKzUZnCpouxzmGpucsfXDpDaVldYw90lScsYqc4V 3qbK2pJMGiQTiWLojubdxftw2+DQotDgDNc1wNVTTr6Q6B6tvzip8wjDWbGaLBMV/0oi M9a+F0OTjjonRCwbGSJl/98eYb9QFTHKvroOJvqqLPjQ8RMw8zvv71K9P+CBB6T1UoQ0 7pAUWt8Sds5N4aWfGkrnpozR4hrnoak2vY0uzlb9pDuql38PcEk1fHA6+5gc63UOmxvY 2799Pyhf+Z8zWv+zAgPg0QVsizpHAOD+pJ6+jSl+4ejz41q14aa7VnmeANjedCyx6nCQ +pYQ== 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-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=3NebJodlTK/aIxR1FEY9wWCkgktAeuE9OS3qU6NmmnY=; b=lhbog4P8kDZziVBXkz5h0LBp4kX1KAnCwAcUdngv6Pqm+LNbNIcNDVSmm8p5eCDGx7 wDzHuD7xnZFH3HsAyXSa6Yc9qT5zCQ1C5YjOon1+VzDMwat+oreCbfEjOJj+5i55mzNE wqI5DnRPz8sYDSmMh9YR+uEmLTMozmVLJp/+igqb6dXbVGbowgXUfDo0sAkszThwtKlS RSdJomrdRV1xLAf4cFbimQgARNfJorGVkZEBX/Quf+1bFFhFNptMncEXeZ0lp6bZfpMJ 0B2S97wCS7tNlf5jTmmdNpCyKAUBy2pbdIBhd9gQNygUHCX69ErLfu6bTvGA9olcBrgg PWTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=ywdtnsf0; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 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 ([8.43.85.97]) by mx.google.com with ESMTPS id ds13-20020a170907724d00b00977c582289dsi3697084ejc.244.2023.06.05.08.35.17 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:35:17 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=ywdtnsf0; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 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 D4A4E3894C2E for ; Mon, 5 Jun 2023 15:33:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D4A4E3894C2E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685979220; bh=3NebJodlTK/aIxR1FEY9wWCkgktAeuE9OS3qU6NmmnY=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=ywdtnsf0ae773Lve3firiIAJAuSwghEP24NCW4MS5EaaNt6UAskEF2KWwPg23HVL3 69PiVycwfzTDPgWC/AwcmKUMzRkrGemTaUZaiLX3TS0lHmICG35XSE3NDINMVjLINs Pf7ZxVDp6setSgGo1hOVK6jkcSzTDjA3fCHbqSMM= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pf1-x42d.google.com (mail-pf1-x42d.google.com [IPv6:2607:f8b0:4864:20::42d]) by sourceware.org (Postfix) with ESMTPS id 643AD3882654 for ; Mon, 5 Jun 2023 15:32:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 643AD3882654 Received: by mail-pf1-x42d.google.com with SMTP id d2e1a72fcca58-651f2f38634so4434252b3a.0 for ; Mon, 05 Jun 2023 08:32:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685979147; x=1688571147; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3NebJodlTK/aIxR1FEY9wWCkgktAeuE9OS3qU6NmmnY=; b=ghk2AoSQHaVfJzqkqMbyViUxJPTDATeCmKt2Tk/QZYM7/prNyB6HdnTYvvpP1q2rJv x2x1XCvdPgwWICd/eRdTcPbDrb8XkuHFvDbezwAc8pURjlIvzV63gBysTVwvBplKflLV +xNaPn2FxbrS60kyeZI3b+UkkKHMnNyYT6fQcTxKegqM0OgTCi7GhuoXrRnXl9RXGaZD 1Unaz26rLOej3OzWCX8yzY7ElgqRJw8YVDdi/HQy8Ncp3tsXtugYcppWlrb7xd0irqfO jg6IX0IAfnBOYuZWIjzp4ZtavmDx9xYJh5qVOHNfbnxImFsadRWrVSSPHhdHBFuaV6qm gHyQ== X-Gm-Message-State: AC+VfDyJR8HEclbnqFJg1cYWpfDS5/g0KdEPva6DI+MxLkAF8GPmQGoS aQlzzrunKmoCESF7gNFGKzujreURyh8= X-Received: by 2002:a05:6a21:2c87:b0:10b:3b0d:b05c with SMTP id ua7-20020a056a212c8700b0010b3b0db05cmr6789272pzb.28.1685979147405; Mon, 05 Jun 2023 08:32:27 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id p13-20020a635b0d000000b0050f93a3586fsm5890430pgb.37.2023.06.05.08.32.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:32:27 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 78AA074032C; Mon, 5 Jun 2023 08:32:25 -0700 (PDT) To: binutils@sourceware.org Cc: Alan Modra , Kaylee Blake Subject: [PATCH v3 5/7] binutils: Add a --strip-section-headers test Date: Mon, 5 Jun 2023 08:32:20 -0700 Message-Id: <20230605153222.1728119-6-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230605153222.1728119-1-hjl.tools@gmail.com> References: <20230605153222.1728119-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3025.1 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: "H.J. Lu via Binutils" From: "H.J. Lu" Reply-To: "H.J. Lu" 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?1767877449104459055?= X-GMAIL-MSGID: =?utf-8?q?1767877449104459055?= PR ld/25617 * testsuite/binutils-all/objcopy.exp: Run strip-section-headers-1. * testsuite/binutils-all/strip-section-headers-1.d: New file. --- binutils/testsuite/binutils-all/objcopy.exp | 5 +++++ binutils/testsuite/binutils-all/strip-section-headers-1.d | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 binutils/testsuite/binutils-all/strip-section-headers-1.d diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp index 361e430f119..41add0fecda 100644 --- a/binutils/testsuite/binutils-all/objcopy.exp +++ b/binutils/testsuite/binutils-all/objcopy.exp @@ -1357,6 +1357,11 @@ if [is_elf_format] { verbose [file rootname $t] run_dump_test [file rootname $t] } + + # Test --strip-section-headers + run_dump_test "strip-section-headers-1" [list \ + [list source strip-15${reloc_format}.s] \ + [list as "${elf64} --defsym RELOC=${reloc}"]] } run_dump_test "localize-hidden-2" diff --git a/binutils/testsuite/binutils-all/strip-section-headers-1.d b/binutils/testsuite/binutils-all/strip-section-headers-1.d new file mode 100644 index 00000000000..dc249bba779 --- /dev/null +++ b/binutils/testsuite/binutils-all/strip-section-headers-1.d @@ -0,0 +1,5 @@ +#PROG: strip +#strip: -g --strip-section-headers +#readelf: -S + +There are no sections in this file. From patchwork Mon Jun 5 15:32:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 103355 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2770965vqr; Mon, 5 Jun 2023 08:36:25 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6CrLs5mWn+BZcpo8GIMbWS4J7RcWckZsEW0Tw6xLqB7WLskfkNPgShdLS3nf64X2qXkdvW X-Received: by 2002:a17:907:1c9f:b0:976:8fdd:9046 with SMTP id nb31-20020a1709071c9f00b009768fdd9046mr6898146ejc.12.1685979384955; Mon, 05 Jun 2023 08:36:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685979384; cv=none; d=google.com; s=arc-20160816; b=zo4IVvG9ZqhNChdwSSUdMbsoYA/S6nFmkeIssxlPAvmbcRPNw3vcJIZRldYcMJrAn8 1DrbjZJ4SYi3pEqafLyN9m50IAVNOeEhNdjJ253AGahuCQeglAzUVgeLudATY0AAjTog n1Md1Kpq5wBFYX3y00aDP25rXUzViGoCJ7p4Lfw1pgWKRLjtlLbNKJoy4L3uHhX5OSYX yphjQ5WizCq/7f/xCNE3/bLjvTPOrEtQolpyu2iKwavOgw3kTGx+1UFWmu1A1kttmY9i TwapWc1G5klTAtbPnZBtAyBhQQVI0iLzjzkAhO3Q/jJ9q0ssApoeBd+y9bvz8SJX52Wa 1SFw== 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-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=vDK/c3wIGoTHTnHz8tUthPysJ3g+Vy1kXhFobafA4yU=; b=BJ4ptGacp4imG2ounUbfUFCHpXMk+gGYzkURXuaje5CO/wbDB+O0EpyqB+SwPCE4WI F8pXq7fTUNFjW1H/GrUJUzpOViYhuTrxld0CpoHkqoX6iFI8OFrY2mOIKsUFCAGVA7dl DW5RQpIsxtw/tNFPKnOpW69HGjABxTZeKY1/nT9hiEsUQZFnCrGIuwjqHsVw9WCQ4zpz jSIeNi1Oe3/f1CyXdg2dP19SfB5T9oXy0GLJEQaiay8EafY/wbs/Kh8JwfakBDA1RADG K4FFcUArSxCfdNMClyZH0FYJOqLDpi6cfgZrKAdyISzNl6I2TNbzXUElpR8zI3ZdJkko 9QhA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=M+uG1VUV; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 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 ([8.43.85.97]) by mx.google.com with ESMTPS id o14-20020a170906974e00b00977c979f275si3343981ejy.416.2023.06.05.08.36.24 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:36:24 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=M+uG1VUV; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 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 4CB29381774A for ; Mon, 5 Jun 2023 15:34:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4CB29381774A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685979246; bh=vDK/c3wIGoTHTnHz8tUthPysJ3g+Vy1kXhFobafA4yU=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=M+uG1VUVuU/kIYGlVYbZPQEyPYfWGY+d597x5D0wShwK+Va3ymAPr+Hs/LH9creIn +HsXzuT/L08XSaZZUhgx7H3/RnFUX2MfpCwi0biT5swKBfuQCSKub9GX6fjS0JtXRn DgvdF5plg7j1CkooBNaiGVJWU1QZG0G9h5GfAruo= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pl1-x636.google.com (mail-pl1-x636.google.com [IPv6:2607:f8b0:4864:20::636]) by sourceware.org (Postfix) with ESMTPS id B06833882677 for ; Mon, 5 Jun 2023 15:32:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B06833882677 Received: by mail-pl1-x636.google.com with SMTP id d9443c01a7336-1b0201d9a9eso35880375ad.0 for ; Mon, 05 Jun 2023 08:32:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685979149; x=1688571149; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vDK/c3wIGoTHTnHz8tUthPysJ3g+Vy1kXhFobafA4yU=; b=cs/cI4y3r/WkmowxW9HuxHxXShWQVv/Jy8ZTwsNtFeYTSDHhVEOFFUq1jJ++U3/Eyq 8y2ox/sIE0WgZrxwFmORSg6EQdAZeR4bOh7bPN8HHlRGIprEpvYbEmgcCao4mfXhAk1v h720Abz7X9PcgBDQHCjqpkxa0CpSt83QJDQmJgD0iOT96j0ymJmKZCJcOHvX86h0fflr 80ba0EhuPGEVcV3YnSfo01oZ9sIPHabXgUNzB6CuJwqu6EUw5ekhUU4wsPV50O3GDSQ4 sApo2xxdGNnSL1Kc6B1j1WIBUoVCtDh64Q/Fr44OQaMxe3WggF4D3ga/uIvItVRepzDP KVmA== X-Gm-Message-State: AC+VfDz1zfy/1nG7hj82jwHYqpD8WNmO3EAlOqsYciqn6HVycGTCsnNZ EKTJRgp64Tpva1uFdrL1kqui9gGM2No= X-Received: by 2002:a17:902:c146:b0:1ae:6947:e63b with SMTP id 6-20020a170902c14600b001ae6947e63bmr7010771plj.16.1685979148414; Mon, 05 Jun 2023 08:32:28 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id i16-20020a170902c95000b001b1866f7b5csm6731482pla.138.2023.06.05.08.32.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:32:27 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 83FBC74032E; Mon, 5 Jun 2023 08:32:25 -0700 (PDT) To: binutils@sourceware.org Cc: Alan Modra , Kaylee Blake Subject: [PATCH v3 6/7] ld: Add tests for -z nosectionheader and --strip-section-headers Date: Mon, 5 Jun 2023 08:32:21 -0700 Message-Id: <20230605153222.1728119-7-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230605153222.1728119-1-hjl.tools@gmail.com> References: <20230605153222.1728119-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3025.2 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: "H.J. Lu via Binutils" From: "H.J. Lu" Reply-To: "H.J. Lu" 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?1767877519884751015?= X-GMAIL-MSGID: =?utf-8?q?1767877519884751015?= Add tests to verify that the linker option, -z nosectionheader and objcopy and strip option, --strip-section-headers, work correctly as well as linker issues an error when dynamic symbol table from PT_DYNAMIC segment is used. PR ld/25617 * testsuite/ld-elf/hash-2.d: New file. * testsuite/ld-elf/no-section-header.exp: Likewise. * testsuite/ld-elf/pr25617-1-no-sec-hdr.nd: Likewise. * testsuite/ld-elf/pr25617-1-no-sec-hdr.rd: Likewise. * testsuite/ld-elf/pr25617-1-static-no-sec-hdr.rd: Likewise. * testsuite/ld-elf/pr25617-1a-no-sec-hdr.nd: Likewise. * testsuite/ld-elf/pr25617-1a-no-sec-hdr.rd: Likewise. * testsuite/ld-elf/pr25617-1a-sec-hdr.rd: Likewise. * testsuite/ld-elf/pr25617-1a.c: Likewise. * testsuite/ld-elf/pr25617-1b.c: Likewise. * testsuite/ld-elf/start-noheader.rd: Likewise. * testsuite/ld-elf/start-shared-noheader-gnu.rd: Likewise. * testsuite/ld-elf/start-shared-noheader-sysv.rd: Likewise. * testsuite/ld-elf/start-shared-noheader.nd: Likewise. --- ld/testsuite/ld-elf/hash-2.d | 11 + ld/testsuite/ld-elf/no-section-header.exp | 370 ++++++++++++++++++ ld/testsuite/ld-elf/pr25617-1-no-sec-hdr.nd | 3 + ld/testsuite/ld-elf/pr25617-1-no-sec-hdr.rd | 20 + .../ld-elf/pr25617-1-static-no-sec-hdr.rd | 12 + ld/testsuite/ld-elf/pr25617-1a-no-sec-hdr.nd | 3 + ld/testsuite/ld-elf/pr25617-1a-no-sec-hdr.rd | 20 + ld/testsuite/ld-elf/pr25617-1a-sec-hdr.rd | 19 + ld/testsuite/ld-elf/pr25617-1a.c | 11 + ld/testsuite/ld-elf/pr25617-1b.c | 15 + ld/testsuite/ld-elf/start-noheader.rd | 11 + .../ld-elf/start-shared-noheader-gnu.rd | 26 ++ .../ld-elf/start-shared-noheader-sysv.rd | 26 ++ ld/testsuite/ld-elf/start-shared-noheader.nd | 11 + 14 files changed, 558 insertions(+) create mode 100644 ld/testsuite/ld-elf/hash-2.d create mode 100644 ld/testsuite/ld-elf/no-section-header.exp create mode 100644 ld/testsuite/ld-elf/pr25617-1-no-sec-hdr.nd create mode 100644 ld/testsuite/ld-elf/pr25617-1-no-sec-hdr.rd create mode 100644 ld/testsuite/ld-elf/pr25617-1-static-no-sec-hdr.rd create mode 100644 ld/testsuite/ld-elf/pr25617-1a-no-sec-hdr.nd create mode 100644 ld/testsuite/ld-elf/pr25617-1a-no-sec-hdr.rd create mode 100644 ld/testsuite/ld-elf/pr25617-1a-sec-hdr.rd create mode 100644 ld/testsuite/ld-elf/pr25617-1a.c create mode 100644 ld/testsuite/ld-elf/pr25617-1b.c create mode 100644 ld/testsuite/ld-elf/start-noheader.rd create mode 100644 ld/testsuite/ld-elf/start-shared-noheader-gnu.rd create mode 100644 ld/testsuite/ld-elf/start-shared-noheader-sysv.rd create mode 100644 ld/testsuite/ld-elf/start-shared-noheader.nd diff --git a/ld/testsuite/ld-elf/hash-2.d b/ld/testsuite/ld-elf/hash-2.d new file mode 100644 index 00000000000..91320d3d6ab --- /dev/null +++ b/ld/testsuite/ld-elf/hash-2.d @@ -0,0 +1,11 @@ +#source: start.s +#readelf: -d -s +#ld: -shared --hash-style=gnu -z nosectionheader +#target: *-*-linux* *-*-gnu* arm*-*-uclinuxfdpiceabi +#xfail: ![check_shared_lib_support] mips*-*-* +# MIPS uses a different style of GNU hash due to psABI restrictions +# on dynsym table ordering. + +#... + +0x[0-9a-z]+ +\(GNU_HASH\) +0x[0-9a-z]+ +#pass diff --git a/ld/testsuite/ld-elf/no-section-header.exp b/ld/testsuite/ld-elf/no-section-header.exp new file mode 100644 index 00000000000..4ed3f9551a9 --- /dev/null +++ b/ld/testsuite/ld-elf/no-section-header.exp @@ -0,0 +1,370 @@ +# Expect script for -z nosectionheader and --strip-section-headers tests +# Copyright (C) 2020 Free Software Foundation, Inc. +# +# This file is part of the GNU Binutils. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. +# +# Written by H.J. Lu (hongjiu.lu@intel.com) +# + +# Make sure that binutils can correctly handle ld output in ELF. + +if { ![istarget *-*-linux*] } { + return +} + +proc binutils_test { prog_name ld_options test readelf_expected nm_expected} { + global as + global ld + global READELF + global NM + global objcopy + global strip + global srcdir + global subdir + global link_output + + eval set prog \$$prog_name + + set test_name "$prog_name --strip-section-headers $ld_options ($test)" + + if { ![ld_assemble $as $srcdir/$subdir/$test.s tmpdir/$test.o ] } { + unresolved "$test_name" + return + } + + append ld_options " -z separate-code -z stack-size=0" + if { ![ld_link $ld tmpdir/$test "$ld_options tmpdir/$test.o"] } { + if { [string match "*not supported*" $link_output] + || [string match "*unrecognized option*" $link_output] + || [string match "*-z .* ignored*" $link_output] } { + unsupported "$ld_options is not supported by this target" + } else { + unresolved "$test_name" + } + return + } + + send_log "$prog --strip-section-headers tmpdir/$test\n" + set got [remote_exec host "$prog --strip-section-headers tmpdir/$test"] + if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then { + send_log "$got\n" + fail "$test_name" + return + } + + send_log "$READELF -lSDs --wide tmpdir/$test > tmpdir/$test.out\n" + set got [remote_exec host "$READELF -lSDs --wide tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"] + if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then { + send_log "$got\n" + unresolved "$test_name" + return + } + + if { [regexp_diff "tmpdir/$test.out" "$srcdir/$subdir/$readelf_expected"] } then { + fail "$test_name" + return + } + + if { [string match "*-shared *" $ld_options] } { + send_log "$NM -D tmpdir/$test > tmpdir/$test.out\n" + set got [remote_exec host "$NM -D tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"] + if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then { + send_log "$got\n" + unresolved "$test_name" + return + } + + if { [regexp_diff "tmpdir/$test.out" "$srcdir/$subdir/$nm_expected"] } then { + fail "$test_name" + return + } + } + + pass "$test_name" +} + +if { [istarget "mips*-*-*"] } { + set gnu_hash_style "sysv" +} else { + set gnu_hash_style "gnu" +} + +binutils_test objcopy "--hash-style=both" start start-noheader.rd \ + start-noheader.nd +binutils_test objcopy "--hash-style=gnu" start start-noheader.rd \ + start-noheader.nd +binutils_test objcopy "--hash-style=sysv" start start-noheader.rd \ + start-noheader.nd +binutils_test objcopy "--hash-style=both -shared" start \ + start-shared-noheader-$gnu_hash_style.rd start-shared-noheader.nd +binutils_test objcopy "--hash-style=gnu -shared" start \ + start-shared-noheader-$gnu_hash_style.rd start-shared-noheader.nd +binutils_test objcopy "--hash-style=sysv -shared" start \ + start-shared-noheader-sysv.rd start-shared-noheader.nd +binutils_test strip "--hash-style=both" start start-noheader.rd \ + start-noheader.nd +binutils_test strip "--hash-style=gnu" start start-noheader.rd \ + start-noheader.nd +binutils_test strip "--hash-style=sysv" start start-noheader.rd \ + start-noheader.nd +binutils_test strip "--hash-style=both -shared" start \ + start-shared-noheader-$gnu_hash_style.rd start-shared-noheader.nd +binutils_test strip "--hash-style=gnu -shared" start \ + start-shared-noheader-$gnu_hash_style.rd start-shared-noheader.nd +binutils_test strip "--hash-style=sysv -shared" start \ + start-shared-noheader-sysv.rd start-shared-noheader.nd + +# Skip non-native targets or -shared is not supported. +if { ![isnative] || ![check_shared_lib_support] } { + return +} + +proc binutils_run_test { prog } { + global CC + global gcc_B_opt + global READELF + global NM + global objcopy + global strip + global srcdir + global subdir + # Add $NOPIE_CFLAGS and $NOPIE_LDFLAGS if non-PIE is required. + global NOPIE_CFLAGS NOPIE_LDFLAGS + + set sec_hdr "sec-hdr" + if { "$prog" == "" } { + set prog_name none + } else { + set prog_name $prog + set ld_options "" + switch -- $prog { + objcopy + { set prog $objcopy } + strip + { set prog $strip } + default + { + fail "Build pr25617-1a-no-sec-hdr.so ($prog_name)" + break + } + } + } + + run_cc_link_tests [list \ + [list \ + "Build pr25617-1a-no-sec-hdr.so ($prog_name)" \ + "-shared -Wl,-z,separate-code,--hash-style=sysv" \ + "-fPIC" \ + {pr25617-1a.c} \ + [list \ + [list "readelf" "-lWSDs" "pr25617-1a-$sec_hdr.rd"] \ + [list "nm" "-D" "pr25617-1a-no-sec-hdr.nd"] \ + ]\ + "pr25617-1a-no-sec-hdr.so" \ + ] \ + [list \ + "Build pr25617-1a-now-no-sec-hdr.so ($prog_name)" \ + "-shared -Wl,-z,separate-code,-z,now,--hash-style=gnu" \ + "-fPIC" \ + {pr25617-1a.c} \ + [list \ + [list "readelf" "-lWSDs" "pr25617-1a-$sec_hdr.rd"] \ + [list "nm" "-D" "pr25617-1a-no-sec-hdr.nd"] \ + ]\ + "pr25617-1a-now-no-sec-hdr.so" \ + ] \ + [list \ + "Build pr25617-1 (-z nosectionheader, $prog_name)" \ + "$NOPIE_LDFLAGS -Wl,-z,separate-code,--no-as-needed \ + -Wl,--hash-style=sysv -Wl,-z,nosectionheader \ + tmpdir/pr25617-1a-no-sec-hdr.so" \ + "$NOPIE_CFLAGS" \ + {pr25617-1b.c} \ + {{readelf -lWSDs pr25617-1-no-sec-hdr.rd} \ + {nm -D pr25617-1-no-sec-hdr.nd}} \ + "pr25617-1-no-sec-hdr" \ + ] \ + [list \ + "Build pr25617-1 (PIE, -z nosectionheader, $prog_name)" \ + "-pie -Wl,-z,separate-code,--no-as-needed,--hash-style=gnu \ + -Wl,-z,nosectionheader tmpdir/pr25617-1a-now-no-sec-hdr.so" \ + "-fPIE" \ + {pr25617-1b.c} \ + {{readelf -lWSDs pr25617-1-no-sec-hdr.rd} \ + {nm -D pr25617-1-no-sec-hdr.nd}} \ + "pr25617-1-pie-no-sec-hdr" \ + ] \ + [list \ + "Build pr25617-1 (static, -z nosectionheader, $prog_name)" \ + "-static -Wl,-z,separate-code -Wl,-z,nosectionheader" \ + "" \ + {pr25617-1a.c pr25617-1b.c} \ + {{readelf -lSWDs pr25617-1-static-no-sec-hdr.rd}} \ + "pr25617-1-static-no-sec-hdr" \ + ] \ + ] + + run_ld_link_exec_tests [list \ + [list \ + "Run pr25617-1 (-z nosectionheader, $prog_name)" \ + "$NOPIE_LDFLAGS -Wl,-z,separate-code,--no-as-needed \ + -Wl,--hash-style=sysv -Wl,-z,nosectionheader \ + tmpdir/pr25617-1a-no-sec-hdr.so" \ + "" \ + {pr25617-1b.c} \ + "pr25617-1-no-sec-hdr" \ + "pass.out" \ + "$NOPIE_CFLAGS" \ + ] \ + [list \ + "Run pr25617-1 (PIE, -z nosectionheader, $prog_name)" \ + "-pie -Wl,-z,separate-code,--no-as-needed,--hash-style=gnu \ + -Wl,-z,nosectionheader tmpdir/pr25617-1a-now-no-sec-hdr.so" \ + "" \ + {pr25617-1b.c} \ + "pr25617-1-pie-no-sec-hdr" \ + "pass.out" \ + "-fPIE" \ + ] \ + [list \ + "Run pr25617-1 (static, -z nosectionheader, $prog_name)" \ + "-static -Wl,-z,separate-code -Wl,-z,nosectionheader" \ + "" \ + {pr25617-1a.c pr25617-1b.c} \ + "pr25617-1-static-no-sec-hdr" \ + "pass.out" \ + ] \ + ] + + if { "$prog_name" != "none" } { + send_log "$prog --strip-section-headers tmpdir/pr25617-1a-no-sec-hdr.so\n" + set got [remote_exec host "$prog --strip-section-headers tmpdir/pr25617-1a-no-sec-hdr.so"] + if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then { + send_log "$got\n" + fail "Update pr25617-1a-no-sec-hdr.so ($prog_name)" + return + } + + send_log "$READELF -lWSDs tmpdir/pr25617-1a-no-sec-hdr.so > tmpdir/dump.out\n" + set got [remote_exec host "$READELF -lWSDs tmpdir/pr25617-1a-no-sec-hdr.so" "" "/dev/null" "tmpdir/dump.out"] + if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then { + send_log "$got\n" + unresolved "Update pr25617-1a-no-sec-hdr.so ($prog_name)" + return + } + + if { [regexp_diff "tmpdir/dump.out" "$srcdir/$subdir/pr25617-1a-no-sec-hdr.rd"] } then { + unresolved "Update pr25617-1a-no-sec-hdr.so ($prog_name)" + return + } + + send_log "$NM -D tmpdir/pr25617-1a-no-sec-hdr.so > tmpdir/dump.out\n" + set got [remote_exec host "$NM -D tmpdir/pr25617-1a-no-sec-hdr.so" "" "/dev/null" "tmpdir/dump.out"] + if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then { + send_log "$got\n" + unresolved "Update pr25617-1a-no-sec-hdr.so ($prog_name)" + return + } + + if { [regexp_diff "tmpdir/dump.out" "$srcdir/$subdir/pr25617-1a-no-sec-hdr.nd"] } then { + unresolved "Update pr25617-1a-no-sec-hdr.so ($prog_name)" + return + } + + send_log "tmpdir/pr25617-1-no-sec-hdr > tmpdir/pr25617-1.out\n" + catch "exec tmpdir/pr25617-1-no-sec-hdr > tmpdir/pr25617-1.out" got + if ![string match "" $got] then { + send_log "$got\n" + unresolved "Update pr25617-1a-no-sec-hdr.so ($prog_name)" + return + } + + send_log "diff tmpdir/pr25617-1.out $srcdir/$subdir/pass.out\n" + catch "exec diff tmpdir/pr25617-1.out $srcdir/$subdir/pass.out" got + if ![string match "" $got] then { + send_log "$got\n" + fail "Update pr25617-1a-no-sec-hdr.so ($prog_name)" + return + } + + pass "Update pr25617-1a-no-sec-hdr.so ($prog_name)" + + send_log "$prog --strip-section-headers tmpdir/pr25617-1a-now-no-sec-hdr.so\n" + set got [remote_exec host "$prog --strip-section-headers tmpdir/pr25617-1a-now-no-sec-hdr.so"] + if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then { + send_log "$got\n" + fail "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)" + return + } + + send_log "$READELF -lWSDs tmpdir/pr25617-1a-now-no-sec-hdr.so > tmpdir/dump.out\n" + set got [remote_exec host "$READELF -lWSDs tmpdir/pr25617-1a-now-no-sec-hdr.so" "" "/dev/null" "tmpdir/dump.out"] + if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then { + send_log "$got\n" + unresolved "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)" + return + } + + if { [regexp_diff "tmpdir/dump.out" "$srcdir/$subdir/pr25617-1a-no-sec-hdr.rd"] } then { + unresolved "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)" + return + } + + send_log "$NM -D tmpdir/pr25617-1a-now-no-sec-hdr.so > tmpdir/dump.out\n" + set got [remote_exec host "$NM -D tmpdir/pr25617-1a-now-no-sec-hdr.so" "" "/dev/null" "tmpdir/dump.out"] + if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then { + send_log "$got\n" + unresolved "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)" + return + } + + if { [regexp_diff "tmpdir/dump.out" "$srcdir/$subdir/pr25617-1a-no-sec-hdr.nd"] } then { + unresolved "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)" + return + } + + send_log "tmpdir/pr25617-1-pie-no-sec-hdr > tmpdir/pr25617-1-pie.out\n" + catch "exec tmpdir/pr25617-1-pie-no-sec-hdr > tmpdir/pr25617-1-pie.out" got + if ![string match "" $got] then { + send_log "$got\n" + unresolved "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)" + return + } + + send_log "diff tmpdir/pr25617-1-pie.out $srcdir/$subdir/pass.out\n" + catch "exec diff tmpdir/pr25617-1-pie.out $srcdir/$subdir/pass.out" got + if ![string match "" $got] then { + send_log "$got\n" + fail "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)" + return + } + + send_log "$CC $gcc_B_opt -o tmpdir/pr25617-1 tmpdir/pr25617-1b.o tmpdir/pr25617-1a-now-no-sec-hdr.so\n" + catch "exec $CC $gcc_B_opt -o tmpdir/pr25617-1 tmpdir/pr25617-1b.o tmpdir/pr25617-1a-now-no-sec-hdr.so" got + if ![string match "*pr25617-1a-now-no-sec-hdr.so*file in wrong format*" $got] then { + send_log "$got\n" + fail "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)" + } + + pass "Update pr25617-1a-now-no-sec-hdr.so ($prog_name)" + } +} + +binutils_run_test "" +binutils_run_test objcopy +binutils_run_test strip diff --git a/ld/testsuite/ld-elf/pr25617-1-no-sec-hdr.nd b/ld/testsuite/ld-elf/pr25617-1-no-sec-hdr.nd new file mode 100644 index 00000000000..6a96f5b55a3 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25617-1-no-sec-hdr.nd @@ -0,0 +1,3 @@ +#... +[a-f0-9 ]+ [DU] _?protected + + U _?test diff --git a/ld/testsuite/ld-elf/pr25617-1-no-sec-hdr.rd b/ld/testsuite/ld-elf/pr25617-1-no-sec-hdr.rd new file mode 100644 index 00000000000..be49dea32db --- /dev/null +++ b/ld/testsuite/ld-elf/pr25617-1-no-sec-hdr.rd @@ -0,0 +1,20 @@ +#readelf: -lWSDs + +There are no sections in this file. + +#... +Program Headers: + Type +Offset +VirtAddr.* +# On MIPS, the first segment is for .reginfo. +#... + LOAD .* +#... + DYNAMIC .* +#... + +Num: +Value +Size Type +Bind +Vis +Ndx Name + +0: 0+ +0 +NOTYPE +LOCAL +DEFAULT +UND + +#... + +[0-9]+: +[a-f0-9]+ +0 +FUNC +GLOBAL +DEFAULT +UND +__libc_start_main(@.*|) +#... + +[0-9]+: +[a-f0-9]+ +0+ +FUNC +GLOBAL +DEFAULT +UND +_?test +#pass diff --git a/ld/testsuite/ld-elf/pr25617-1-static-no-sec-hdr.rd b/ld/testsuite/ld-elf/pr25617-1-static-no-sec-hdr.rd new file mode 100644 index 00000000000..92b1dc9ead9 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25617-1-static-no-sec-hdr.rd @@ -0,0 +1,12 @@ +#readelf: -lWSDs + +There are no sections in this file. + +#... +Program Headers: + Type +Offset +VirtAddr.* +# On MIPS, the first segment is for .reginfo. +#... + LOAD .* +#... +Dynamic symbol information is not available for displaying symbols\. diff --git a/ld/testsuite/ld-elf/pr25617-1a-no-sec-hdr.nd b/ld/testsuite/ld-elf/pr25617-1a-no-sec-hdr.nd new file mode 100644 index 00000000000..2813ffc6652 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25617-1a-no-sec-hdr.nd @@ -0,0 +1,3 @@ +#... + + U _?puts(@.*|) +[0-9a-z]+ T _?test diff --git a/ld/testsuite/ld-elf/pr25617-1a-no-sec-hdr.rd b/ld/testsuite/ld-elf/pr25617-1a-no-sec-hdr.rd new file mode 100644 index 00000000000..f7a4eec7362 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25617-1a-no-sec-hdr.rd @@ -0,0 +1,20 @@ +#readelf: -lWSDs + +There are no sections in this file. + +#... +Program Headers: + Type +Offset +VirtAddr.* +# On MIPS, the first segment is for .reginfo. +#... + LOAD .* +#... + DYNAMIC .* +#... + +Num: +Value +Size Type +Bind +Vis +Ndx Name + +0: 0+ +0 +NOTYPE +LOCAL +DEFAULT +UND + +#... + +[0-9]+: +[a-f0-9]+ +0 +FUNC +GLOBAL +DEFAULT +UND +_?puts(@.*|) +#... + +[0-9]+: +[a-f0-9]+ +[0-9]+ +FUNC +GLOBAL +DEFAULT +[0-9]+ +_?test +#pass diff --git a/ld/testsuite/ld-elf/pr25617-1a-sec-hdr.rd b/ld/testsuite/ld-elf/pr25617-1a-sec-hdr.rd new file mode 100644 index 00000000000..9ccf0565af6 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25617-1a-sec-hdr.rd @@ -0,0 +1,19 @@ +#readelf: -lWSDs + +There are [0-9]+ section headers, starting at offset 0x[a-f0-9]+: +#... +Program Headers: + Type +Offset +VirtAddr.* +# On MIPS, the first segment is for .reginfo. +#... + LOAD .* +#... + DYNAMIC .* +#... + +Num: +Value +Size Type +Bind +Vis +Ndx Name + +0: 0+ +0 +NOTYPE +LOCAL +DEFAULT +UND + +#... + +[0-9]+: +[a-f0-9]+ +0 +FUNC +GLOBAL +DEFAULT +UND +_?puts(@.*|) +#... + +[0-9]+: +[a-f0-9]+ +[0-9]+ +FUNC +GLOBAL +DEFAULT +[0-9]+ +_?test +#pass diff --git a/ld/testsuite/ld-elf/pr25617-1a.c b/ld/testsuite/ld-elf/pr25617-1a.c new file mode 100644 index 00000000000..f707f266fe2 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25617-1a.c @@ -0,0 +1,11 @@ +#include + +int protected = 42; +extern int *get_protected_ptr (void); + +void +test() +{ + if (&protected == get_protected_ptr ()) + printf ("PASS\n"); +} diff --git a/ld/testsuite/ld-elf/pr25617-1b.c b/ld/testsuite/ld-elf/pr25617-1b.c new file mode 100644 index 00000000000..1fd6ef45d79 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25617-1b.c @@ -0,0 +1,15 @@ +void test(void); + +extern int protected; + +int * +get_protected_ptr (void) +{ + return &protected; +} + +int main() +{ + test(); + return 0; +} diff --git a/ld/testsuite/ld-elf/start-noheader.rd b/ld/testsuite/ld-elf/start-noheader.rd new file mode 100644 index 00000000000..2479e340871 --- /dev/null +++ b/ld/testsuite/ld-elf/start-noheader.rd @@ -0,0 +1,11 @@ +#readelf: -SlDs --wide + +There are no sections in this file. + +#... +Program Headers: + Type +Offset +VirtAddr.* +# On MIPS, the first segment is for .reginfo. +#... + LOAD .* +#pass diff --git a/ld/testsuite/ld-elf/start-shared-noheader-gnu.rd b/ld/testsuite/ld-elf/start-shared-noheader-gnu.rd new file mode 100644 index 00000000000..20bc30cad4c --- /dev/null +++ b/ld/testsuite/ld-elf/start-shared-noheader-gnu.rd @@ -0,0 +1,26 @@ +#readelf: -SlDs --wide + +There are no sections in this file. + +#... +Program Headers: + Type +Offset +VirtAddr.* +# On MIPS, the first segment is for .reginfo. +#... + LOAD .* +#... + DYNAMIC .* +#... + +Num: +Value +Size Type +Bind +Vis +Ndx Name + +0: 0+ +0 +NOTYPE +LOCAL +DEFAULT +UND + +#... + +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +_start +#... + +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +main +#... + +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +start +#... + +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +_main +#... + +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +__start +#pass diff --git a/ld/testsuite/ld-elf/start-shared-noheader-sysv.rd b/ld/testsuite/ld-elf/start-shared-noheader-sysv.rd new file mode 100644 index 00000000000..d8f02497e58 --- /dev/null +++ b/ld/testsuite/ld-elf/start-shared-noheader-sysv.rd @@ -0,0 +1,26 @@ +#readelf: -SlDs --wide + +There are no sections in this file. + +#... +Program Headers: + Type +Offset +VirtAddr.* +# On MIPS, the first segment is for .reginfo. +#... + LOAD .* +#... + DYNAMIC .* +#... + +Num: +Value +Size Type +Bind +Vis +Ndx Name + +0: 0+ +0 +NOTYPE +LOCAL +DEFAULT +UND + +#... + +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +__start +#... + +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +_start +#... + +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +main +#... + +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +start +#... + +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +_main +#pass diff --git a/ld/testsuite/ld-elf/start-shared-noheader.nd b/ld/testsuite/ld-elf/start-shared-noheader.nd new file mode 100644 index 00000000000..6ec6cdf8af9 --- /dev/null +++ b/ld/testsuite/ld-elf/start-shared-noheader.nd @@ -0,0 +1,11 @@ +#... +[0-9a-z]+ A __start +#... +[0-9a-z]+ A _main +#... +[0-9a-z]+ A _start +#... +[0-9a-z]+ A main +#... +[0-9a-z]+ A start +#pass From patchwork Mon Jun 5 15:32:22 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 103350 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2769160vqr; Mon, 5 Jun 2023 08:33:16 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6+yBKEgCwnMtxo1hnQ27f12Q/XtgqVEAtB/3BBnqIVwqu5fzZ+OQAh+LGUPvuN1LiBry53 X-Received: by 2002:a17:907:6096:b0:974:6287:f67f with SMTP id ht22-20020a170907609600b009746287f67fmr6260585ejc.28.1685979196421; Mon, 05 Jun 2023 08:33:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685979196; cv=none; d=google.com; s=arc-20160816; b=v/Y0MzIsJ9qD/jnzGj0kg5H1cBsEQ1B7AbfiAPgDHwhVs+wdJ+IRpb+vLZRDp8HKgR DM/R3qKX/Esw8Ne6qyCWVW/WJpYoBlOSRusAOqxWJiGf8Yb7/kY0ogWxKFb0cT26zoGP hnEQt9tCtlCQSVAsZMsuggSJBKWngAC733vj5lqCzckE/7Pq8mpo0xUMaIE5IeMndfum vpue096ooVXE9gzTGibhxyqam6wPM9ykkdnhtZSEtgpcbv9TdmakgzQK/YDm4G8IYxvM oKoUFTnG9Gn3DSoc5EJjG4uIwL5hNk2gv45rF7BIPfzRo+wZkVa+y7Rh7BeKVNHqOAzc KKpA== 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-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=+w/XFqp1AH7F/ZPtN1MljK1VhBFQbFfGgkzyrv5Cwhs=; b=bKf6i64AWqXO4HRHJ9achWtcz3XrNxn6AqVO59P46JPSZ8sRIKkej0bpiVROjNOg+0 4R6BfCziavvk6rNxHQ5ueH+rOZTJaqsPWFGS8bTIbNQ2oICmUk0fvXeMGU30Oiy+RvAX xuhee6VIwHtj7RBv5DlHWl9yY8u04WdlYX0ACngrRvL1SlAT8zYZO2Ix1Q+s/w1rWdQg ugpLoquk3A+KtQizqFfY6eXTnH+re/+XTR9IJFo7WFL8Wms7jLmSWhgUClzrm6HvDT79 lAFdgEsK1NAWp3CG5E8NnsiClQnC0iZpgW4FPEshwzZ2BiEzvg74xjHMyFo3I8Ux+VM/ OgcQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=Nf4jMk+b; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 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 ([8.43.85.97]) by mx.google.com with ESMTPS id a5-20020a170906468500b0095ede80a90csi4984361ejr.118.2023.06.05.08.33.16 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:33:16 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=Nf4jMk+b; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 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 71B453884597 for ; Mon, 5 Jun 2023 15:32:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 71B453884597 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685979172; bh=+w/XFqp1AH7F/ZPtN1MljK1VhBFQbFfGgkzyrv5Cwhs=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=Nf4jMk+bHULw6cPaCzk8WMpZQYlbmoVWEdcSPebmce894PpQqmBUDXZBi13XZaGmR S0iNRE9JWufUetxHFgpmI02ne3lIG556yjf53G/e6w+pK8C0xmIyGSpfLAdT37hKV5 HUDVkKH8yBlfeXc6LgdEkSD7fXMzngTZin8uWsMU= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pl1-x634.google.com (mail-pl1-x634.google.com [IPv6:2607:f8b0:4864:20::634]) by sourceware.org (Postfix) with ESMTPS id E844D388267C for ; Mon, 5 Jun 2023 15:32:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E844D388267C Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-1b034ca1195so22383775ad.2 for ; Mon, 05 Jun 2023 08:32:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685979149; x=1688571149; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+w/XFqp1AH7F/ZPtN1MljK1VhBFQbFfGgkzyrv5Cwhs=; b=AChz4v6s58g1+IfhpHIZcOo6TUqt+OcFGV8DaJRqnbknqNyY5OmNlVgg79j++eL03N 41stRRQicCWIqj84wgh6cPgLbo7olNucNsy5HLRDCvTct6buqK2bCIlLmch4DFkPLhSn /AFkZqt9uY0XOwOcW1+7JFSVlcLiSQBYVeSlBfqyD+y5k0ftaTvnu6TZXT3QtvEwy5iE +QDS97d+slNzkH+tvTun8PgsNkTVuTTb6VoTzB8BxwZisGPJkfUR7Qjy1RIUzUID5Hs5 vKbKjK1gBOpJwmmb0AKyY6R8AMi6kEQIWou0bvBQ4OvUUWueof0WQbG5bZpFBwERFS39 X6Ig== X-Gm-Message-State: AC+VfDzKw2mkpCILaqV9nysVWsMq1447c9ycbAbxc7bdxprFSUxVTrRP sqrZGpoWUaBpui742fNbhlc= X-Received: by 2002:a17:902:a9c6:b0:1ac:7f56:de04 with SMTP id b6-20020a170902a9c600b001ac7f56de04mr2977058plr.45.1685979148864; Mon, 05 Jun 2023 08:32:28 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id w14-20020a170902e88e00b001aaf370b1c7sm6740358plg.278.2023.06.05.08.32.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jun 2023 08:32:28 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 8E99874032F; Mon, 5 Jun 2023 08:32:25 -0700 (PDT) To: binutils@sourceware.org Cc: Alan Modra , Kaylee Blake Subject: [PATCH v3 7/7] ld: Add -z nosectionheader test to bootstrap.exp Date: Mon, 5 Jun 2023 08:32:22 -0700 Message-Id: <20230605153222.1728119-8-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230605153222.1728119-1-hjl.tools@gmail.com> References: <20230605153222.1728119-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3025.1 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: "H.J. Lu via Binutils" From: "H.J. Lu" Reply-To: "H.J. Lu" 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?1767877321632390588?= X-GMAIL-MSGID: =?utf-8?q?1767877321632390588?= PR ld/25617 * testsuite/ld-bootstrap/bootstrap.exp: Add -z nosectionheader test. --- ld/testsuite/ld-bootstrap/bootstrap.exp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ld/testsuite/ld-bootstrap/bootstrap.exp b/ld/testsuite/ld-bootstrap/bootstrap.exp index b189a0c7098..7b70b9582c0 100644 --- a/ld/testsuite/ld-bootstrap/bootstrap.exp +++ b/ld/testsuite/ld-bootstrap/bootstrap.exp @@ -66,6 +66,9 @@ set test_flags {"" "strip" "--static" "-Wl,--traditional-format" if { [istarget "powerpc-*-*"] } { lappend test_flags "-Wl,--ppc476-workaround" } +if { [is_elf_format] && ![is_bad_symtab] } { + lappend test_flags "-Wl,-z,nosectionheader" +} set gcc_B_opt_save $gcc_B_opt @@ -94,9 +97,12 @@ foreach flags $test_flags { set testname "bootstrap" }} - # --static is meaningless and --relax is incompatible with -r. + # --static is meaningless. --relax and -z nosectionheader are + # incompatible with -r. regsub -- "-Wl," $flags "" partial_flags - if { "$partial_flags" == "--static" || "$partial_flags" == "--relax" } { + if { "$partial_flags" == "--static" \ + || "$partial_flags" == "--relax" \ + || [string match "*nosectionheader*" "$partial_flags"] } { set partial_flags "" }