From patchwork Tue May 30 17:12:47 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: 101020 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2334694vqr; Tue, 30 May 2023 10:13:33 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5p8Nz/VXxofAc7Von0GsfH/ErN7bGML8dpOWAPvzwkt6eL9zyqe0bdDXSpCbX8Igf9VFac X-Received: by 2002:aa7:ca4b:0:b0:50c:358:1eba with SMTP id j11-20020aa7ca4b000000b0050c03581ebamr1887009edt.35.1685466813093; Tue, 30 May 2023 10:13:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685466813; cv=none; d=google.com; s=arc-20160816; b=bI9tzCk5HvzC3sdxfw8W/mgvGPefq8JB94jLYopF5eUloLMJk6YJaOaCMDJ2CAMymV gn+eJrSynyIkXst3ImUaCCBohrkxGi2a6E1BhoaQX7PgeP+QMGQ/BrHd0oIq8umxSK0I CJWiiQKF7qr3Zqg30T/zPle0QlFT+/CggFISS2ONt5VKSepVCIRtlHi2Bg7gM5CVNgz+ 66iVdjopdKDtUNWT/cE+jPWn4wD27BaQL7Wn9FMkwxpgum5X/nV27xBKcixhQJqInRtN nVzlqtirmF5/1/oQPbugBgBdfhWKFL7WWi1h35aeIVX2E83AZ7rpszMMCgDUKz3FNfSK WuBg== 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=UPPZsmIfo4uNh7rx2C3B268rJb215AXBTeAuFkp6//k=; b=oxAVxWwoOi4LT06BvNvVYl2e9jrk7J4ciZcoci50nnrOgYCin0EnSizGMpEQM9Z6R5 epS2SgPxDyeDot6xgNgw/cuDZexLcEkSbLKS5O+/TMw6wwj3vE64r/qZRXD4aJrsDHth dY354vXzWsKZ4jD7B0h/6WrROv9JP8S8dtTJkyMRPWNSJuyZay6SQ2pYRDn4iir1c/Zg Ih4DK2IV5W1axXNIKYqSD2q5rtF0b4FxJDUrB2FQbU7Yv9Ut/a9O0cLt/JtpluebfmiW oNiQ12+rvAoJp2vo8MBXnXaJaRN3rvnyC6YHLIcdcueaTVobNNyn/1rqmKeJj9KzJvFb LvSw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=n504rqqy; 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-20020aa7d30f000000b005048bfe57f1si295553edq.28.2023.05.30.10.13.32 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 10:13:33 -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=n504rqqy; 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 8AD663856968 for ; Tue, 30 May 2023 17:13:25 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8AD663856968 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685466805; bh=UPPZsmIfo4uNh7rx2C3B268rJb215AXBTeAuFkp6//k=; 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=n504rqqyCYHsZmC2ZTYc58h7MYYHdpu+XG0HVtDOOVT8wUT+YPjMhi5o7q3wmlidO bFJCdOTnUVL9D3gKGRh2e2wF9ibZE+625RNmLqLY12PRefEBj8b5pC2i92oj89rxJI 4jtYBjM+mIRhRn4ODP2HxsXt+8f3Xm4h2YHOu6xQ= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pl1-x62b.google.com (mail-pl1-x62b.google.com [IPv6:2607:f8b0:4864:20::62b]) by sourceware.org (Postfix) with ESMTPS id 7C5C33857355 for ; Tue, 30 May 2023 17:13:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7C5C33857355 Received: by mail-pl1-x62b.google.com with SMTP id d9443c01a7336-1b011cffe7fso31048885ad.1 for ; Tue, 30 May 2023 10:13:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685466792; x=1688058792; 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=UPPZsmIfo4uNh7rx2C3B268rJb215AXBTeAuFkp6//k=; b=PUFlUmHoYJF20nMNXuE7S5IUpQAM1PpwaQEm2NTpublcU/daNp6SA805WRHZXlxc5m qeBQ1xAtNZlj49MinKkz9XZ4Wf6xMImyh1X22l/viE+mYkwDUvU7cnkucCqS1rZmpnwD DrH94gPKz05+mCJO6olfEbSKnjwJAj2ygHMEX1Erl74ilpUjhZ6iwGLwn6edFVSLkv3d Dku/NEhFUeqJADnjyuVVd2z8HTgV9OC6nIp/V+DmdgQ6p55pC7sjutxzTDkEHZ+h5zkC XlUXTqCZ1BX9F6kWI2CzTifv1CFjuRuO1R69IYD1Zf0M/tGeyLvvkhDB53/UOZaDL6HQ rroA== X-Gm-Message-State: AC+VfDwaqXMKlEXMYn9gn9Ry28SHZ+D4JOUVfXsgaruKdzeiCArUSOkk YM0DMMkgaqPOuJnYAcMXZK/uZv/xM8M= X-Received: by 2002:a17:903:1c6:b0:1b0:2743:10f4 with SMTP id e6-20020a17090301c600b001b0274310f4mr2694507plh.6.1685466792217; Tue, 30 May 2023 10:13:12 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id m10-20020a1709026bca00b001add2ba4459sm10448218plt.32.2023.05.30.10.13.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 10:13:11 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 76D527401DE; Tue, 30 May 2023 10:13:10 -0700 (PDT) To: binutils@sourceware.org Cc: Kaylee Blake Subject: [PATCH 1/6] ELF: Strip section header in ELF objects Date: Tue, 30 May 2023 10:12:47 -0700 Message-Id: <20230530171252.269552-2-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230530171252.269552-1-hjl.tools@gmail.com> References: <20230530171252.269552-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3024.4 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?1767339971566522018?= X-GMAIL-MSGID: =?utf-8?q?1767340048845989772?= 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, an new objcopy and strip option, --strip-sections, to remove ELF section header. bfd/ 2020-03-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/ 2020-03-XX H.J. Lu PR ld/25617 * NEWS: Mention --strip-sections for objcopy and strip. * doc/binutils.texi: Document --strip-sections for objcopy and strip. * objcopy.c (remove_section_header): New. (command_line_switch): Add OPTION_REMOVE_SECTION_HEADER. (strip_options): Add --strip-sections. (copy_options): Likewise. (copy_usage): Add --strip-sections. (strip_usage): Likewise. (copy_object): Handle --strip-sections for ELF files. (strip_main): Handle OPTION_REMOVE_SECTION_HEADER. (copy_main): Likewise. ld/ 2020-03-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..790d1dd3b04 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..515a768722a 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-sections, 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..793902a848e 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-sections}] [@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-sections +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-sections}] [@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-sections +Strip section header. 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 49d54bff9b2..28d94d470d1 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_sections = false; /* Strip section header. */ typedef struct merged_note_section { @@ -355,6 +356,7 @@ enum command_line_switch OPTION_REDEFINE_SYMS, OPTION_REMOVE_LEADING_CHAR, OPTION_REMOVE_RELOCS, + OPTION_STRIP_SECTIONS, OPTION_RENAME_SECTION, OPTION_REVERSE_BYTES, OPTION_PE_SECTION_ALIGNMENT, @@ -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-sections", no_argument, 0, OPTION_STRIP_SECTIONS}, {"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-sections", no_argument, 0, OPTION_STRIP_SECTIONS}, {"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-sections 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-sections Strip section header 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_sections) + { + 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_sections) + { + non_fatal (_("--strip_sections 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_sections) non_fatal (_("%s: Could not find any mergeable note sections"), bfd_get_filename (ibfd)); @@ -4752,6 +4774,9 @@ strip_main (int argc, char *argv[]) case OPTION_REMOVE_RELOCS: handle_remove_relocations_option (optarg); break; + case OPTION_STRIP_SECTIONS: + strip_sections = true; + break; case 's': strip_symbols = STRIP_ALL; break; @@ -5221,6 +5246,10 @@ copy_main (int argc, char *argv[]) handle_remove_relocations_option (optarg); break; + case OPTION_STRIP_SECTIONS: + strip_sections = 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 Tue May 30 17:12:48 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: 101025 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2335854vqr; Tue, 30 May 2023 10:15:29 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6xzM5DAo9vddb2qyO43ssjVz6ZL5OUb5eztpHCYo4UjjIgH9rYawf7uU8t4729KbGIFql6 X-Received: by 2002:aa7:cfd8:0:b0:514:91bd:a967 with SMTP id r24-20020aa7cfd8000000b0051491bda967mr2191760edy.9.1685466929688; Tue, 30 May 2023 10:15:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685466929; cv=none; d=google.com; s=arc-20160816; b=MnNW5k2PhpJrqEyy5pqb6jZs+0rbs68ZAQ12pyI2eSck73jSrGsj4MNkkaH9+c1kl/ hyQbfFzg+gtsyMKPG2IAkj3yzJu0JfKKrZYzPRS1AS9igpy349zPIBB9YFSLShl+gJfL 8EnkwpQx6yGqaBMjkmRW+LCjLMilj9C5bnIg32VZ1b+68BNvc+efrcAi6VokFkzutZkl 5E4jiWXErYrwvw3CV+PDWp2R5fZMVYZwqO5EdQXSNcT4WDngRsjIXVOIIOgOnMOvN1RD mP3PLsDaY1Kkhhvty4pgk0fZiN2H1bRUEFUPnnJRatLEfeoIgAtyp/caR3g96OE5QVKB N6bA== 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=/+N38C5VWm+hBRgnrSqQ7+xzKBwU0OxNuC+zd2jaIA0=; b=jELHlNRwlERrWBiMFV8tset3eWBajXT6IPOPNidFSqf/Gugjo+9O0FEZBIX0fljSkq G2IvdqqFZt+9G6hpeh928Y9CximZ+5p9Q0zgYMKUNoycIzc2BaBeFqDNyvyc0r5OuPl+ oNzlNm5gGV1k9rJFpplQwf7m2O0FoRkfbAJvpsBjlcCBqX0ElCth32ZbWBLq6DG03Ooj 3T+9snm7dVFKtJ4Or2HwwEJv6CZPQ8ZyvzUkvJjn0aclkSQF262NnniM9PVlrWStIZ26 mcEg4HpnwdoFMV8oIToSsuf8QKx7bZVT2PztmIL3c6snaFPG8tLwqMcMsx1GE1wtXIoR EP3Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=fehCTZO4; 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 (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id e17-20020a056402149100b0050ca8c906a3si306250edv.48.2023.05.30.10.15.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 10:15:29 -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=fehCTZO4; 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 7948D385663E for ; Tue, 30 May 2023 17:14:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7948D385663E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685466868; bh=/+N38C5VWm+hBRgnrSqQ7+xzKBwU0OxNuC+zd2jaIA0=; 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=fehCTZO4lsz1z5Bl2q3APgx4k5i48ogfBzWluQiYwVoCNrifLFNP4Y5Vy5tu5ZY4t QHktMZI/JsO3mjSuDOOLup6lX932QMdvIiaPrYzVit1dHvH+1nA7FqRX7Ryv+UjrKa 3Yx1iCncM+J1UBTm1S56rgPkCFNl9o+EtDiNCjkI= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pl1-x62e.google.com (mail-pl1-x62e.google.com [IPv6:2607:f8b0:4864:20::62e]) by sourceware.org (Postfix) with ESMTPS id CAAE13856DCD for ; Tue, 30 May 2023 17:13:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CAAE13856DCD Received: by mail-pl1-x62e.google.com with SMTP id d9443c01a7336-1b01d3bb571so25918785ad.2 for ; Tue, 30 May 2023 10:13:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685466793; x=1688058793; 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=/+N38C5VWm+hBRgnrSqQ7+xzKBwU0OxNuC+zd2jaIA0=; b=Z6LgTYVeOLhZGKkEVLGrxPVVyIr4Zc0lW70cQE9qM1uGzWCPHZAidJkFMXrguoVsF6 JufAPYNvo5hNLKd6yfxrIhW4F42pEoNXLJgwGTmbmeFfMW2NNQVeOwTRLx429nxOl0nX Vax5tjF2t16+vsqCNuqxHi4VQK+Q3CwIdgokY2FW2lKE49z6WZ80X8Q0fMaYETDQdOjd L/lO0GbgN52arXojHttSEZPGr2K90bg6paXsF6ZRUuMtbwSbQUsxt99KZuXmIZjGG8+y hYinqYk4BN4bCRZwxwGHpjqbrWDqmRo7yCe9zIVp1PZD4fIuh1+w2vORFVvTlQC4MUy/ kEzQ== X-Gm-Message-State: AC+VfDyiLYjTJ859Mb+89WMviuhyHaM4F5qydG2XsPETmuTj6k86CXOp JgEbQHbwr6O67AJCkdpA/HZvaMmL8Mc= X-Received: by 2002:a17:902:cecf:b0:1b0:3ab6:5143 with SMTP id d15-20020a170902cecf00b001b03ab65143mr2863522plg.68.1685466792463; Tue, 30 May 2023 10:13:12 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id b15-20020a170903228f00b001ab2592ed33sm10549053plh.171.2023.05.30.10.13.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 10:13:11 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 851B07402E8; Tue, 30 May 2023 10:13:10 -0700 (PDT) To: binutils@sourceware.org Cc: Kaylee Blake Subject: [PATCH 2/6] bfd: Improve nm and objdump without section header Date: Tue, 30 May 2023 10:12:48 -0700 Message-Id: <20230530171252.269552-3-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230530171252.269552-1-hjl.tools@gmail.com> References: <20230530171252.269552-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3024.7 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?1767340171298398287?= X-GMAIL-MSGID: =?utf-8?q?1767340171298398287?= 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 | 738 ++++++++++++++++++++++++++++++++++++++++++++++---- bfd/elfcode.h | 55 +++- bfd/elflink.c | 12 + 4 files changed, 755 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 94954a8fbb9..331d8c8378c 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,560 @@ _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) + goto error_return; + + 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); + } + } + + 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 +2447,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; @@ -8600,6 +9168,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; } @@ -8610,6 +9183,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 *); @@ -8817,35 +9392,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; @@ -8858,10 +9449,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; @@ -8871,9 +9463,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; @@ -8904,9 +9500,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; @@ -8945,11 +9545,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; @@ -8959,40 +9560,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); @@ -9035,7 +9652,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; @@ -9078,9 +9695,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; @@ -9115,7 +9736,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 790d1dd3b04..032c2f0f17a 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 Tue May 30 17:12:49 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: 101028 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2337149vqr; Tue, 30 May 2023 10:17:34 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ48IkRLw9/kJtsbn8fkRNFIyo4TpwKYxzvLr/d9Mw7VKrvbdqGmGkqbfar6uiy7A+R+ZP5J X-Received: by 2002:a17:907:26c7:b0:973:92d4:9f4e with SMTP id bp7-20020a17090726c700b0097392d49f4emr2994704ejc.53.1685467054514; Tue, 30 May 2023 10:17:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685467054; cv=none; d=google.com; s=arc-20160816; b=H3eyFyIQB35MrafmRQBURa0QxHVEdJCCaFR3KQmYyD+9aVWoeL1II8aXHiciJ6Q4TW 5ZaoXl2f9+4OOuKJLeDeQQ8PckQ7GqT7vmBcRDEhrr+GeZp0/x5HGy/ziZNrUU8Gh653 1ex+u8dPcQsiaeLtmG3dNM3uTi3yFymgbp6/kJhr2DfDSPTfwBB7S8OqTeI7nBZ+pg4Z JBemNCwZ+IXTNWAkNFrd1mWoxHmwid2B3kswn/cIcmEtc9aSfS3r3qL8Vp1lzdxGeoZS lEKQLQsT0Djm7xFgLzZ+SCfMaSKvYCxDHRH4we66w3d7hSM1inKvy4eFOMzoeg7nuRuo N/Qg== 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=2XDHLLwutvxPUkpfZF7zU4zcbp8fbvO7iYwBBoL9k7M=; b=Id7KHJLSj4r9SpZJqAT4WYm9IqUQZUfX7yHEBj1ZcT4u4WdP5/wfC7UtP7ygWXf+3I 1/2Ls2fWLmcWRtoyFKy4Lv+IX234IUKz3cTslK8bQJUc3LIgUjhRHTVuVAd6jKHh1GZ9 Vxyl4K2bh520ewUbDadbKxs4Jk7QQmIhF9mxziiJqw4Q7eyyF2Zcj+k2Za1jcmv021I/ MIaDL31rkfwB8rXlukJn2p+i1FhWvGaMkFH6J1CUYySyJel7wfsiORwpLqWAFnJkS7wk pnEIh6QPup6q+J8NDBD9CytznKO6ArLjN+BEG8jwxBcu/hreo8TaSxa5E2anVl3dJBiS vF8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=ioKU7w42; 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 (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id tc25-20020a1709078d1900b0094a780acf82si8103604ejc.211.2023.05.30.10.17.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 10:17:34 -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=ioKU7w42; 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 9210B3855592 for ; Tue, 30 May 2023 17:15:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9210B3855592 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685466946; bh=2XDHLLwutvxPUkpfZF7zU4zcbp8fbvO7iYwBBoL9k7M=; 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=ioKU7w42ozEjUGBA5bXYkzCevo7/ISTlMIP6XjgivlSqe9NqThbj9DyG8XBiOrcRe bZXia9w1Kky2H+kbFq9stWODFtx5wOdk4hiol1Ezo2YPnkrU5FknYMfJPPDEs24yf8 SjtUcNac3HLIDrPaDvym2gWQ2B65Y56OTTGbHbmY= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pf1-x42f.google.com (mail-pf1-x42f.google.com [IPv6:2607:f8b0:4864:20::42f]) by sourceware.org (Postfix) with ESMTPS id 04142385770F for ; Tue, 30 May 2023 17:13:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 04142385770F Received: by mail-pf1-x42f.google.com with SMTP id d2e1a72fcca58-64d2c865e4eso3576167b3a.0 for ; Tue, 30 May 2023 10:13:16 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685466796; x=1688058796; 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=2XDHLLwutvxPUkpfZF7zU4zcbp8fbvO7iYwBBoL9k7M=; b=X5OVJFPa+Qzd26fKHIDDVv+GRGkciWeazYr2I5P7tSufGTf8rtfItgGEV6XodLxzIF psFmlWIOtKQBDPO8NCKv9vH279bQ9sOw2yzHPZgA8wGUX6WxrYE9WzYZpp0zH9EKYCM6 vkrTCAg2HAKSQXLfI/8BKLufM7sdr/dGjSyLVGv0eCFuxvg0ZPOwt33aYYNs8YRmGh43 r9njQW46MMqsKhD395i+9oFOROEQU9JaMIq8d5wTgrdNQuTV/oqo3LMqWh38TRJ7jTfc +I2f+GgUqjA3jwcyBMeUOlK7TpP/vW/37xrMxBtqrcdOeoyAZ+TE91Q8ZOmwgFGlVL8q nmHA== X-Gm-Message-State: AC+VfDwyOE9YTLnC7ZzGiQEhLChMHBKk1ZNJy77r20J7npE3cYr+71e9 ezgNBYLK1tg08U2X0Ya8lD/XrCQp7Ts= X-Received: by 2002:a05:6a00:1992:b0:624:2e60:f21e with SMTP id d18-20020a056a00199200b006242e60f21emr3665297pfl.29.1685466796026; Tue, 30 May 2023 10:13:16 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id n18-20020aa78a52000000b005e0699464e3sm1824691pfa.206.2023.05.30.10.13.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 10:13:15 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id AB4507401DE; Tue, 30 May 2023 10:13:14 -0700 (PDT) To: binutils@sourceware.org Cc: Kaylee Blake Subject: [PATCH 3/6] ld: Add a simple test for -z nosectionheader Date: Tue, 30 May 2023 10:12:49 -0700 Message-Id: <20230530171252.269552-4-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230530171252.269552-1-hjl.tools@gmail.com> References: <20230530171252.269552-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3025.0 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?1767340301900497888?= X-GMAIL-MSGID: =?utf-8?q?1767340301900497888?= From: Kaylee Blake 2020-03-XX Kaylee Blake PR ld/25617 * testsuite/ld-elf/nosectionheader.d: New file. --- ld/testsuite/ld-elf/nosectionheader.d | 12 ++++++++++++ 1 file changed, 12 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..7154e095e18 --- /dev/null +++ b/ld/testsuite/ld-elf/nosectionheader.d @@ -0,0 +1,12 @@ +#source: start.s +#ld: -z nosectionheader +#readelf: -h -S + +#... + 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 Tue May 30 17:12:50 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: 101022 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2335301vqr; Tue, 30 May 2023 10:14:38 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7ubi5O/klOOlpZzNCw7Lhm/bcJylDF55YhUPShyeRRimV3hNakQe94j7JTRLke71CFeaka X-Received: by 2002:a17:907:3e81:b0:974:1eb9:f750 with SMTP id hs1-20020a1709073e8100b009741eb9f750mr3614313ejc.36.1685466878311; Tue, 30 May 2023 10:14:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685466878; cv=none; d=google.com; s=arc-20160816; b=tdQWbYK699+Q+Tn0kI0yWsHNrdVCThW0gci98EDUZdcunbArBy5Qsjj92fQKLQfp6c dQHNXybotjV4+hEiwx1cxmHjHg8RYNe/ATA/s/ogp78NifVcTPmiVYXN+3416Te3UUFZ Unrdy0ex9I8j3QAvv1pRdgRkQT5ApSwhRCic7yOrHybuutyFH4OKFZ+DDmqw9MFAJuZr Ppm9Cw5Ft9AhtXO9Td7DbRBhiE3oT8rUhwAgb1d/xp/4mr8SoVBiRMNyaOwjDIeTwbWl FKZgTB0zAZo3k5Bsp2i59ORrTwFeYQi1gpH+4w38+PhJI0CCSuhRULodtZjzY5MPjEgM Fh2A== 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=Xaf0X4Kuw3Z5IzzCvb+hJGSCbyiH/+P2KKksCgp6glE=; b=MSXu/pYDQ2tw8jWeCXbS7W4fEhVKzLeW+KpAvzdpl/+H4dnEJpqEBD2vnRFWC4/6VZ lN6+GuH5sgpCL2t+n2TrLU3lDa7URTazokP34ogLCP+Wt7sXxjly0Xs9dKAn7b99He8P fN7E70DN2jfrsLK+m+Vm3va6Q+by7cKqmtaSzrCakF+XFSFfxa2R+UuZ1rdS5a8h6/PN tD7LWsbbTZAb1/nwP9q9kw+J1tt/Bc1rDgUT3swvddcrtPnNbSndEZrES1QuQsInH5mT +AggojKbZ3fIB1rF+zAtaOjvZ1VV0eJXh0SMqgSqWQFWihhQgBZdK3+4VeXHiFPMd49I u1ZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b="yPu/Ca7z"; 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 gv50-20020a1709072bf200b00969ea55d647si873723ejc.92.2023.05.30.10.14.38 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 10:14:38 -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="yPu/Ca7z"; 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 A49243856DC2 for ; Tue, 30 May 2023 17:14:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A49243856DC2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685466843; bh=Xaf0X4Kuw3Z5IzzCvb+hJGSCbyiH/+P2KKksCgp6glE=; 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=yPu/Ca7zPBub4MOENKiMVWlZxTB3A7536JyIWnclG8OTpKAJ69h05nERy+d7pAQyU Whr11YTCvRHeFInbw8MWB4xz3aI2XhTXzw7nWog6a3PzCSTx3qze0fml0YJErOcJxL JOl21F2mv1lu3hqPIIcppKcMBcthSoEamX/QAMSA= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pf1-x42b.google.com (mail-pf1-x42b.google.com [IPv6:2607:f8b0:4864:20::42b]) by sourceware.org (Postfix) with ESMTPS id 452473856DE6 for ; Tue, 30 May 2023 17:13:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 452473856DE6 Received: by mail-pf1-x42b.google.com with SMTP id d2e1a72fcca58-64d2f99c8c3so3455470b3a.0 for ; Tue, 30 May 2023 10:13:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685466796; x=1688058796; 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=Xaf0X4Kuw3Z5IzzCvb+hJGSCbyiH/+P2KKksCgp6glE=; b=B8fdpkkfcBdljULuPmaj5FFUrVbkrCA2i56MjL9dDlI8jvc7hcUCAQon91Ok7UHk73 xwcBIBUAl2SqwCd7Hsv2qpSDy4/h6cbaWHyFeTJAG56tqir5GApWAdzR/z5lXe4LLs35 X9LQTrit00Cyo3SZn04tA4I/TEgakcVgOb+iK64RwvAwBg6M14T/91wfHMWAP6yNrLnZ 3JSp1JlEJOiXKx9bFV8oYm+C4xn5QwuJwclPGOFjiMRAF6+HrsAVRdDCinrb3sPfFP+b oKb5EHcQOTxd5+UauQRf7GLPbDESqELCKVfJNH8kPORDS+tdrJG+3OWwPy5HVma6+324 nDlQ== X-Gm-Message-State: AC+VfDxYAisQJWhMu23uXL6vl8zROm2OCrIMcODCe0BCA2Sv0c2htx+W rkzbhlLllZTRf+3D8z5HB0I= X-Received: by 2002:a17:902:8503:b0:1ae:4bbb:e958 with SMTP id bj3-20020a170902850300b001ae4bbbe958mr2884377plb.14.1685466796153; Tue, 30 May 2023 10:13:16 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id bf5-20020a170902b90500b001b0772fe3fdsm363726plb.265.2023.05.30.10.13.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 10:13:15 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id B7E937402E8; Tue, 30 May 2023 10:13:14 -0700 (PDT) To: binutils@sourceware.org Cc: Kaylee Blake Subject: [PATCH 4/6] binutils: Add a --strip-sections test Date: Tue, 30 May 2023 10:12:50 -0700 Message-Id: <20230530171252.269552-5-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230530171252.269552-1-hjl.tools@gmail.com> References: <20230530171252.269552-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3024.8 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?1767340117428333641?= X-GMAIL-MSGID: =?utf-8?q?1767340117428333641?= PR ld/25617 * testsuite/binutils-all/objcopy.exp: Run strip-sections-1. * testsuite/binutils-all/strip-sections-1.d: New file. --- binutils/testsuite/binutils-all/objcopy.exp | 5 +++++ binutils/testsuite/binutils-all/strip-sections-1.d | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 binutils/testsuite/binutils-all/strip-sections-1.d diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp index 361e430f119..d39ea141a3a 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-sections + run_dump_test "strip-sections-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-sections-1.d b/binutils/testsuite/binutils-all/strip-sections-1.d new file mode 100644 index 00000000000..76b1dd69c70 --- /dev/null +++ b/binutils/testsuite/binutils-all/strip-sections-1.d @@ -0,0 +1,5 @@ +#PROG: strip +#strip: -g --strip-sections +#readelf: -S + +There are no sections in this file. From patchwork Tue May 30 17:12:51 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: 101027 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2336456vqr; Tue, 30 May 2023 10:16:31 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4fVQv/Cf8PBgNTUNP/nn7FQNd6iAXLMMv497sTRkkm5mVIfOanQTURS39I1ahMKgl6+T/Z X-Received: by 2002:a2e:a3d0:0:b0:2a8:a651:8098 with SMTP id w16-20020a2ea3d0000000b002a8a6518098mr1286980lje.38.1685466991300; Tue, 30 May 2023 10:16:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685466991; cv=none; d=google.com; s=arc-20160816; b=q9Lg5J99mfIfTYep19+oCJAokmPTUu4j9j3jiOW2nkRjG8wm1QgFaOuwjhN2kf3ltf flmBV6H2QnLF/kq7dQfc6KS8Xy8IO0BMBwovyR5Uw1augfw6ngeouGtB9G+bsJoXn5mP tXUzA1jJ+EOP8PZvr4jfUA+idA6x5SBbKsvbtWXU62PglDvaOHyQJsrQ85pHxyw5sfjC yiV2epz0F/b5IVm6om0HPF59iQpkAINdi9QZVSKkE4HcnepKThH+RS06vNI7W78MsJvP d2k5DvjRE9rJJJe/4RAoD/8pGIPC1NRV+0vet4lOvNolgNiTlV5yeHB/MMQ3Y27gnvl8 E01A== 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=/ZhXwxFeK9ZgU8G0Db3owbqLBVs6ePPIT0lkReJHgFw=; b=Qh9wsmthE8CH3w0qK0EEEEVdiZC7YrCKwCu08Hn5j0l4I4+se6D2dcXha1VPgfi5sH ZSQVKG0B9FXi0yBr4FO+RneRixy3tSrnpEwhbN0uLz+TDqleGyvQBBG8KZN8yDOfpT9f CQiYg/1Trl69C10njyBuaJZfbqpPl3+pLOM/fPX1zC8RrMoxnOtt1zdjR5zxYPLXg6vy ddxE9nGnW7nA1dzOJFxy5e1vxyCf2YUQsa3g4Bfpi328QpVMfByOXT/mksflM6SSH1qZ 1vUhrNWgmUZMUV7Tk8JJWU8LlXbWUNF7M94E5af6lAh3WdpGnh7HRl1pYPjBf+1p3W80 gjiw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=EDk9p7MD; 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 (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id gq2-20020a170906e24200b0097374e5090dsi4598271ejb.664.2023.05.30.10.16.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 10:16:31 -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=EDk9p7MD; 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 3A4173855892 for ; Tue, 30 May 2023 17:15:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3A4173855892 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685466903; bh=/ZhXwxFeK9ZgU8G0Db3owbqLBVs6ePPIT0lkReJHgFw=; 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=EDk9p7MDbJsGi8zxq2edG8dVznc5CDHf+Y9eN0ZKHeCywE8SlR8/Yr4nNB6M7MDqB 1pEbaJbrvBFSpp57MIGxFd36VU2fGV0QPuzyEAM0YS6kt12UxhMHEOZuU0pmdBRqe9 dWYoOQUACkzqNKgBZ+gwzqvZvU21DJI5uIAc6B94= 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 C95733856967 for ; Tue, 30 May 2023 17:13:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C95733856967 Received: by mail-pf1-x42c.google.com with SMTP id d2e1a72fcca58-64d18d772bdso5419106b3a.3 for ; Tue, 30 May 2023 10:13:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685466797; x=1688058797; 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=/ZhXwxFeK9ZgU8G0Db3owbqLBVs6ePPIT0lkReJHgFw=; b=QYwVOtChFi+RlTjc4CFb7upWrT5wnohNEh2aQXdMIaL80E0ATpUbFnSHSXDEv+ZP4z zpXKL4vFxe9dr+eU91z3DOq9S2NZWSkazhYsrgt9nSuehRIXvb2PAA38iBC0E+H8M64A 03AAQD6UTHSqWJhGD9vsu9TcRCnHJ39sojlEOhRZUbh1HXD+5HRZxQ8G3DRk5ptnk9Pr RLDv7JFWse+TJHR9x1iulQx+Tpe7ywgLOCrEbDtWF+ILYX5KZvmR/XCrzWJOoLr+rsFh M4Mht+V3Q22xmdAygJDn4yJO1Q8xPBfW9EcNa4l92BatruN8tyG+v8UoAwYLDcwhYm8a eXhw== X-Gm-Message-State: AC+VfDwSDpDdTd1gJM49Ej2XX7XACcE4s76hGjoFKjVK4Am71jGv7mbP KCmZhebCiDqqrW8+xkVtBzPjEm/KwWo= X-Received: by 2002:a05:6a00:1745:b0:643:59cd:6cad with SMTP id j5-20020a056a00174500b0064359cd6cadmr3587797pfc.24.1685466796488; Tue, 30 May 2023 10:13:16 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id w12-20020aa7858c000000b006466d70a313sm1870361pfn.120.2023.05.30.10.13.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 10:13:15 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id C605B7402E9; Tue, 30 May 2023 10:13:14 -0700 (PDT) To: binutils@sourceware.org Cc: Kaylee Blake Subject: [PATCH 5/6] ld: Add tests for -z nosectionheader and --strip-sections Date: Tue, 30 May 2023 10:12:51 -0700 Message-Id: <20230530171252.269552-6-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230530171252.269552-1-hjl.tools@gmail.com> References: <20230530171252.269552-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3025.0 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?1767340236107446519?= X-GMAIL-MSGID: =?utf-8?q?1767340236107446519?= Add tests to verify that the linker option, -z nosectionheader and objcopy and strip option, --strip-sections, 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 | 22 ++ .../ld-elf/start-shared-noheader-sysv.rd | 22 ++ ld/testsuite/ld-elf/start-shared-noheader.nd | 5 + 14 files changed, 544 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..d6dd99b32d8 --- /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: 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..97f9885473a --- /dev/null +++ b/ld/testsuite/ld-elf/no-section-header.exp @@ -0,0 +1,370 @@ +# Expect script for -z nosectionheader and --strip-sections 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-sections $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-sections tmpdir/$test\n" + set got [remote_exec host "$prog --strip-sections 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-sections tmpdir/pr25617-1a-no-sec-hdr.so\n" + set got [remote_exec host "$prog --strip-sections 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-sections tmpdir/pr25617-1a-now-no-sec-hdr.so\n" + set got [remote_exec host "$prog --strip-sections 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..3397a576baa --- /dev/null +++ b/ld/testsuite/ld-elf/start-shared-noheader-gnu.rd @@ -0,0 +1,22 @@ +#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..23a87f98bcd --- /dev/null +++ b/ld/testsuite/ld-elf/start-shared-noheader-sysv.rd @@ -0,0 +1,22 @@ +#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..2d3ba70e530 --- /dev/null +++ b/ld/testsuite/ld-elf/start-shared-noheader.nd @@ -0,0 +1,5 @@ +[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 From patchwork Tue May 30 17:12:52 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: 101021 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2334987vqr; Tue, 30 May 2023 10:14:04 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7/X1/XC786Mnayc+RDumZLI8YqRqAF/MK9H8W0Cae4dUB+3TyqZ7llGxgQNKZ+Jf8902ps X-Received: by 2002:a17:907:72d6:b0:96f:45cd:6c21 with SMTP id du22-20020a17090772d600b0096f45cd6c21mr3244182ejc.30.1685466844776; Tue, 30 May 2023 10:14:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685466844; cv=none; d=google.com; s=arc-20160816; b=cuto3m9nTyI8izoVH4VOahnyVgDTQkz6QkD+i4JD5oS04p9D1UhQftbw12++KXrf7l I5KL8JF89xWV1EATR3GoY+d2K9IRdLXMibas5MfT6/Lm/IBVJBubRalCcn6c4v8UYSxI AxtSInt6fOS2Oo/NDLuz7mB35KETZ4W6OjDjQB5lWuI4T7bggI2JxbBSZ/YociRoZ3TN NRuyHrhz2bkv6M+8gxHwCO/zhfNTClWIXPRaow7X65iAwlXtQy11yrsqvVK27dQ/liGf hU2a9qNGMWotmRlE6fVbpWKWYrbjQp7X1Xyh9hKIz53/IruhRMDr9QQOfqg/U4vuBUo1 QCyA== 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=zNo2P8f5UwV5HToK9vey1gQknsiqzqi4RgDpXOLbgS0iIZbKjMDKN+y6rAHdu0+Lqn cCMQACkqhc8BI9SMJtH+8gl1JEmlH/yq5rMnNamsRkQ6R4yRowDcqmQRUVNptd9gxqBg jVuf9kEXwgmU2X9rEnn+LOyP1jCzLhayCgx9lXSF4NqEaM7PGfAL1V9hduSoGgGQdfgq TCZ2hZZabO34WpoV5qFH3fplMJy/s8q06JpjF1vEZ2hZZXs1cl2InrvlCt+8CEzqVuhI 4GTSA5ldk6uNDidQkTfyke/hI/IOy5hSWiUuGXhUYGcEkySklGFYUbB7IcC0o7wTx19l O3Xg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=tn6EWyiW; 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 (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id c15-20020a170906924f00b009660c6fca5asi5878231ejx.1045.2023.05.30.10.14.04 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 10:14:04 -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=tn6EWyiW; 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 5F9F43855892 for ; Tue, 30 May 2023 17:13:48 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5F9F43855892 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1685466828; 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=tn6EWyiWTvfxWElGtsgscPXDpQ/WEpTO9K5rP3ivTYe5NiaGOetuwXu9K77WC455x Mwkwy/5txMXkwt09RnOQXgn2WYHLmPv4pbWwdS40D5wv5XtmLx0KpWxKwb/G4MESl0 SkoNBYNZGmz1jxa/AOouDUpbymb/DuceuB+S3GOM= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pl1-x630.google.com (mail-pl1-x630.google.com [IPv6:2607:f8b0:4864:20::630]) by sourceware.org (Postfix) with ESMTPS id 541EB3856948 for ; Tue, 30 May 2023 17:13:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 541EB3856948 Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-1b01bd7093aso26794485ad.1 for ; Tue, 30 May 2023 10:13:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685466796; x=1688058796; 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=YumuPxWgT/Z9VXZp8eQy2KuLvW7OtWA2DfeESadAjVNmB50huphl+PWnWjHegtbWz2 BDDFg7Qya2nGKWHEjf0TB1UgPM0XU6i99sQ55HUdeZmtVzLzT/AiNqah74EUW42fLdE+ X5+pHIMFux89WfE4VjulKZ34ZJMLnxCWEU2N70UfTNKB59VvJJ9G8+YzsKG4aCGaKbSc E1fOBXvcPKesACvXhJX7R+qsOHrtH8oOSoXl8nT8Hy867tbLWx5NlQBrW2XY0oUNsfmr LnVr6zGXVzJA/m3UYXBqB3evoZ2J4CUlzUIxu382W4uopzpdbV8/p33HBSyZIxC7q7YC /vhw== X-Gm-Message-State: AC+VfDyzQxT3J2DP6sWGzVey+SGJhSLCcJUJ/QKHDpGwxKAXyoQqn+Pm BVq5IXoCsdJJPzuGr/g9ztDPZyamtM8= X-Received: by 2002:a17:902:ecc2:b0:1b0:fe9:e57e with SMTP id a2-20020a170902ecc200b001b00fe9e57emr3544052plh.0.1685466796307; Tue, 30 May 2023 10:13:16 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.59.160.123]) by smtp.gmail.com with ESMTPSA id a4-20020a1709027d8400b0019a5aa7eab0sm10509359plm.54.2023.05.30.10.13.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 10:13:15 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id D18287402EA; Tue, 30 May 2023 10:13:14 -0700 (PDT) To: binutils@sourceware.org Cc: Kaylee Blake Subject: [PATCH 6/6] ld: Add -z nosectionheader test to bootstrap.exp Date: Tue, 30 May 2023 10:12:52 -0700 Message-Id: <20230530171252.269552-7-hjl.tools@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230530171252.269552-1-hjl.tools@gmail.com> References: <20230530171252.269552-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3024.9 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?1767340082221795384?= X-GMAIL-MSGID: =?utf-8?q?1767340082221795384?= 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 "" }