From patchwork Sat Jan 6 22:10:00 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 185690 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:37c1:b0:101:2151:f287 with SMTP id y1csp300179dyq; Sat, 6 Jan 2024 14:10:30 -0800 (PST) X-Google-Smtp-Source: AGHT+IGhkyC4vI97ixV/4nGSq956N5Lq8abIlrmVDNsXt319XImNOOj2I5T1nH47V0j0nPJwt0sR X-Received: by 2002:a05:620a:258f:b0:781:6e32:a894 with SMTP id x15-20020a05620a258f00b007816e32a894mr2488398qko.39.1704579029779; Sat, 06 Jan 2024 14:10:29 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1704579029; cv=pass; d=google.com; s=arc-20160816; b=v7nFF37M9cNMAzgZOueFpmWGnR+gQ6wAZoOXj4kaPCDn4etoe1kpUo4hNDJq/ZzF75 Qxjvef/94eS9/Wwx5x8j5FK0I4f8R5zcWz+t1lf8k38rxLrjgkNlZBOLop50Yt6x/yum +zT2k3Qz7WAfqg8OaHlZ1bEH7SzZp5jPSOsiu7o3hu9fNuixQfwvD/pyRHQsa8EF/AY7 RwLdsp9TchPeNFR0fSIKDq1mg3BXLh5VW1q3wxBgru/pOzmiLr3WYXJ3R1WHor656zls vT5lnAk0xy53r7PeSqzfPsGb0dfa4dPnzdmkS68WzwEzB6aSIJER13gWcDoK61i4QoWH ccDQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to: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:to:from :dkim-signature:arc-filter:dmarc-filter:delivered-to; bh=W+tBgsmOYwlIolJ+//vs3TbqgcAjvaIsblLlWp9PAns=; fh=NLxAvL/bDfPg4AGOtxqvQlND8vazkZrNzKLY8+LAbBY=; b=AR0p3yjX19GcMzhcaOvoVtg9rI8ynMESKC3dDDg0U7A45RGHnJ4JpQVmL1tHih0SL8 0aMBQdoEwkO3h5B2MgdbXnraB/MrgPjMBfntNNZKa37AL2bMlx8XfxjQTAmCjjGWCKi1 mq2QDd9RcWty5jPY8LGQUNM2sAbv4I1AdykjSZj5T8mijehyhGNbivuttkxKmhlOJL0O flZ2oKWBUB05jjKazHIdt7vcSgl70jMfBhi5ZD33dwL8p+BQwOMgKr3VZQSi0jd5cpwS GAEL8ofXq8ca5X4Cb0PaDpx2Dsb34Pibx29F4WxloUQDpiidWGD3ePxRzE1qWZDG+P+2 UpHA== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b="XF/Cflc8"; arc=pass (i=1); 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=QUARANTINE dis=NONE) header.from=gmail.com Received: from server2.sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id bn42-20020a05620a2aea00b0078313d19ba9si1452793qkb.459.2024.01.06.14.10.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 06 Jan 2024 14:10:29 -0800 (PST) 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=@gmail.com header.s=20230601 header.b="XF/Cflc8"; arc=pass (i=1); 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=QUARANTINE dis=NONE) header.from=gmail.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 738653861032 for ; Sat, 6 Jan 2024 22:10:29 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-ot1-x32b.google.com (mail-ot1-x32b.google.com [IPv6:2607:f8b0:4864:20::32b]) by sourceware.org (Postfix) with ESMTPS id C536E3858403 for ; Sat, 6 Jan 2024 22:10:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C536E3858403 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org C536E3858403 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::32b ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704579008; cv=none; b=IP8v7G2MV9szhkyUxxWwDhBPQFfmRlqMQtJ50XnE1qRDl6KnRJ9xw1I+ZkiEFuE6GtUIEfB2ncIrbTR8BjICnYKwBoPA+7B4GeQl05joPpO7sGYUr+eq+N4YS26eyvbGHj2b4cwjkTjvY2+bz+QUP7xBI1HnXMA5ku4eNAKMcFo= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704579008; c=relaxed/simple; bh=qszciE0Phhg5zYVIzZ5nS07f9uHGKc+Bo3XlrIS94y8=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=MWKzqfuMybeBbFMI3xW9XXkPXlNJSK7XyMGMWIkDEuakdEyVaqD8AyAODhwvdZalx6Y80nT0nR/2csp2rOMl+Hxct9LQ+zc1yymNmK9pmiWGph2LPQpWqxlheYoz88+m1Fyf0C8k4XoKpwBgVH1atlEO9qfMYEJiwVqh6u/R0eo= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-ot1-x32b.google.com with SMTP id 46e09a7af769-6dc00dbb560so489721a34.3 for ; Sat, 06 Jan 2024 14:10:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1704579004; x=1705183804; darn=sourceware.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=W+tBgsmOYwlIolJ+//vs3TbqgcAjvaIsblLlWp9PAns=; b=XF/Cflc84rvfzu+CdmlPoomJtK8iV92/3NzDT3zz7Vw4wvXYfd4actnyTNM9RwP9kH u728MwG6eqQwNmOqtpwqCqryG1thJLPz/9yJFEseLn5f9HL/4ZN71FlviDIE8pM/gF9v zR7z5WO899LtdsOygxHOBqClkLcDYmTfDq2ioWcAhg7upc46S/v5HgtTjxQu68d1hK2c Pe0k9orEtGBVkzd/JgYHYMnozUwHAPpKVvzlHbxgxZ/2fMpJimjb8rQ2E1k4/7fPkMVd xNOm8SyOpUbYrrF0i7cZaUJ9tZWnvxR/eeFEcvQkSy1Z2WaRfcOa+oycSzICIS+Nsk6/ fI+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704579004; x=1705183804; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=W+tBgsmOYwlIolJ+//vs3TbqgcAjvaIsblLlWp9PAns=; b=UbyDLjE+jv38TSvS4IL0i5u6th6Gr7ghlMfVuNcnsvS6WVuppbdq1BENB1BDM2CsFG JFuajXOtWUsovA2KPhiITIOKxgmdqkpVPEneshYuJNUTe0MsPvszsA8P58O8WokqtYg+ qTKCXpadOr+7Yy1ntmi7h+7Yi06be+0PfY8ZR8+42nIfRxTYxA1i36vfxrW2K4DP4Dbj 6NR/gjIe62weWohIQwMoTenBk06QdcSCJJ7z2D+vPgIhi1amA5ld/3e/eHLHZtK0vGz1 3+B7M3P4aRTglaWcgJCW2434qloxFebx4kGud2OUqc75Y9gJB0C/lgPy5en6em2AMRKN jxbQ== X-Gm-Message-State: AOJu0Yz0UBnjRLkfRvsqzXR+XVpSgQRfM94T1WyH645CR1BxecBtAb/H n8kXrD9OMP93JZ6sXhXkaqDUvvUrOUU= X-Received: by 2002:a05:6871:7a0e:b0:203:2b71:dad5 with SMTP id pc14-20020a0568717a0e00b002032b71dad5mr1728124oac.8.1704579004415; Sat, 06 Jan 2024 14:10:04 -0800 (PST) Received: from gnu-cfl-3.localdomain ([172.56.169.119]) by smtp.gmail.com with ESMTPSA id a5-20020a636605000000b0059d34fb9ccasm3574671pgc.2.2024.01.06.14.10.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 06 Jan 2024 14:10:03 -0800 (PST) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id EFF4A7403E1 for ; Sat, 6 Jan 2024 14:10:01 -0800 (PST) From: "H.J. Lu" To: binutils@sourceware.org Subject: [PATCH v2 1/2] elf: Add elf_backend_add_glibc_version_dependency Date: Sat, 6 Jan 2024 14:10:00 -0800 Message-ID: <20240106221001.1754844-2-hjl.tools@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240106221001.1754844-1-hjl.tools@gmail.com> References: <20240106221001.1754844-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3020.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_ABUSEAT, RCVD_IN_DNSWL_NONE, RCVD_IN_SBL_CSS, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, URIBL_BLACK 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.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1787380660593510157 X-GMAIL-MSGID: 1787380660593510157 When -z mark-plt is used to add DT_X86_64_PLT, DT_X86_64_PLTSZ and DT_X86_64_PLTENT, the r_addend field of the R_X86_64_JUMP_SLOT relocation stores the offset of the indirect branch instruction. However, glibc versions which don't have this commit in glibc 2.36: commit f8587a61892cbafd98ce599131bf4f103466f084 Author: H.J. Lu Date: Fri May 20 19:21:48 2022 -0700 x86-64: Ignore r_addend for R_X86_64_GLOB_DAT/R_X86_64_JUMP_SLOT According to x86-64 psABI, r_addend should be ignored for R_X86_64_GLOB_DAT and R_X86_64_JUMP_SLOT. Since linkers always set their r_addends to 0, we can ignore their r_addends. Reviewed-by: Fangrui Song won't ignore the r_addend value in the R_X86_64_JUMP_SLOT relocation. Although this commit has been backported to glibc 2.33/2.34/2.35 release branches, it is safer to require glibc 2.36 for such binaries. Extend the glibc version dependency of GLIBC_ABI_DT_RELR for DT_RELR to also add GLIBC_2.36 version dependency for -z mark-plt on the the shared C library if it provides a GLIBC_2.XX symbol version. * elflink.c (elf_find_verdep_info): Moved to ... * elf-bfd.h (elf_find_verdep_info): Here. (elf_backend_data): Add elf_backend_add_glibc_version_dependency. (_bfd_elf_link_add_glibc_version_dependency): New function. (_bfd_elf_link_add_dt_relr_dependency): Likewise. * elf64-x86-64.c (elf_x86_64_add_glibc_version_dependency): Likewise. (elf_backend_add_glibc_version_dependency): New. * elflink.c (elf_link_add_dt_relr_dependency): Renamed to ... (elf_link_add_glibc_verneed): This. Modified to support other glibc dependencies. (_bfd_elf_link_add_glibc_version_dependency): Likewise. (_bfd_elf_link_add_dt_relr_dependency): Likewise. (bfd_elf_size_dynamic_sections): Call elf_backend_add_glibc_version_dependency instead of elf_link_add_dt_relr_dependency. * elfxx-target.h (elf_backend_add_glibc_version_dependency): New. (elfNN_bed): Add elf_backend_add_glibc_version_dependency. ld/ * testsuite/ld-x86-64/mark-plt-1a.rd: New file. * testsuite/ld-x86-64/mark-plt-1b.rd: Likewise. * testsuite/ld-x86-64/x86-64.exp: Run -z mark-plt test for GLIBC_2.36 dependency. --- bfd/elf-bfd.h | 23 ++++ bfd/elf64-x86-64.c | 27 +++++ bfd/elflink.c | 146 +++++++++++++++----------- bfd/elfxx-target.h | 5 + ld/testsuite/ld-x86-64/mark-plt-1a.rd | 7 ++ ld/testsuite/ld-x86-64/mark-plt-1b.rd | 7 ++ ld/testsuite/ld-x86-64/x86-64.exp | 14 +++ 7 files changed, 167 insertions(+), 62 deletions(-) create mode 100644 ld/testsuite/ld-x86-64/mark-plt-1a.rd create mode 100644 ld/testsuite/ld-x86-64/mark-plt-1b.rd diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index a611349e3d9..3ed22fa6c52 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -957,6 +957,19 @@ typedef struct elf_property_list struct elf_property property; } elf_property_list; +/* This structure is used to pass information to + elf_backend_add_glibc_version_dependency. */ + +struct elf_find_verdep_info +{ + /* General link information. */ + struct bfd_link_info *info; + /* The number of dependencies. */ + unsigned int vers; + /* Whether we had a failure. */ + bool failed; +}; + struct bfd_elf_section_reloc_data; struct elf_backend_data @@ -1488,6 +1501,10 @@ struct elf_backend_data bool (*elf_backend_write_section) (bfd *, struct bfd_link_info *, asection *, bfd_byte *); + /* This function adds glibc version dependency. */ + void (*elf_backend_add_glibc_version_dependency) + (struct elf_find_verdep_info *); + /* This function, if defined, returns TRUE if it is section symbols only that are considered local for the purpose of partitioning the symbol table into local and global symbols. This should be NULL @@ -2583,6 +2600,12 @@ extern bool _bfd_elf_link_output_relocs (bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *, struct elf_link_hash_entry **); +extern void _bfd_elf_link_add_glibc_version_dependency + (struct elf_find_verdep_info *, const char *[]); + +extern void _bfd_elf_link_add_dt_relr_dependency + (struct elf_find_verdep_info *); + extern bool _bfd_elf_adjust_dynamic_copy (struct bfd_link_info *, struct elf_link_hash_entry *, asection *); diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index ec001599cc1..1a2e64c031f 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -5568,6 +5568,31 @@ elf_x86_64_link_setup_gnu_properties (struct bfd_link_info *info) return _bfd_x86_elf_link_setup_gnu_properties (info, &init_table); } +static void +elf_x86_64_add_glibc_version_dependency + (struct elf_find_verdep_info *rinfo) +{ + unsigned int i = 0; + const char *version[3] = { NULL, NULL, NULL }; + struct elf_x86_link_hash_table *htab; + + if (rinfo->info->enable_dt_relr) + { + version[i] = "GLIBC_ABI_DT_RELR"; + i++; + } + + htab = elf_x86_hash_table (rinfo->info, X86_64_ELF_DATA); + if (htab != NULL && htab->params->mark_plt) + { + version[i] = "GLIBC_2.36"; + i++; + } + + if (i != 0) + _bfd_elf_link_add_glibc_version_dependency (rinfo, version); +} + static const struct bfd_elf_special_section elf_x86_64_special_sections[]= { @@ -5652,6 +5677,8 @@ elf_x86_64_special_sections[]= elf_x86_64_link_setup_gnu_properties #define elf_backend_hide_symbol \ _bfd_x86_elf_hide_symbol +#define elf_backend_add_glibc_version_dependency \ + elf_x86_64_add_glibc_version_dependency #undef elf64_bed #define elf64_bed elf64_x86_64_bed diff --git a/bfd/elflink.c b/bfd/elflink.c index a577c957514..c2494b3e12e 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -46,19 +46,6 @@ struct elf_info_failed bool failed; }; -/* This structure is used to pass information to - _bfd_elf_link_find_version_dependencies. */ - -struct elf_find_verdep_info -{ - /* General link information. */ - struct bfd_link_info *info; - /* The number of dependencies. */ - unsigned int vers; - /* Whether we had a failure. */ - bool failed; -}; - static bool _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *, struct elf_info_failed *); @@ -2217,64 +2204,64 @@ _bfd_elf_export_symbol (struct elf_link_hash_entry *h, void *data) return true; } -/* Return true if GLIBC_ABI_DT_RELR is added to the list of version - dependencies successfully. GLIBC_ABI_DT_RELR will be put into the - .gnu.version_r section. */ +/* Return the glibc version reference if VERSION_DEP is added to the + list of glibc version dependencies successfully. VERSION_DEP will + be put into the .gnu.version_r section. */ -static bool -elf_link_add_dt_relr_dependency (struct elf_find_verdep_info *rinfo) +static Elf_Internal_Verneed * +elf_link_add_glibc_verneed (struct elf_find_verdep_info *rinfo, + Elf_Internal_Verneed *glibc_verref, + const char *version_dep) { - bfd *glibc_bfd = NULL; Elf_Internal_Verneed *t; Elf_Internal_Vernaux *a; size_t amt; - const char *relr = "GLIBC_ABI_DT_RELR"; - /* See if we already know about GLIBC_PRIVATE_DT_RELR. */ - for (t = elf_tdata (rinfo->info->output_bfd)->verref; - t != NULL; - t = t->vn_nextref) + if (glibc_verref != NULL) { - const char *soname = bfd_elf_get_dt_soname (t->vn_bfd); - /* Skip the shared library if it isn't libc.so. */ - if (!soname || !startswith (soname, "libc.so.")) - continue; + t = glibc_verref; for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr) { - /* Return if GLIBC_PRIVATE_DT_RELR dependency has been - added. */ - if (a->vna_nodename == relr - || strcmp (a->vna_nodename, relr) == 0) - return true; - - /* Check if libc.so provides GLIBC_2.XX version. */ - if (!glibc_bfd && startswith (a->vna_nodename, "GLIBC_2.")) - glibc_bfd = t->vn_bfd; + /* Return if VERSION_DEP dependency has been added. */ + if (a->vna_nodename == version_dep + || strcmp (a->vna_nodename, version_dep) == 0) + return t; } - - break; } + else + { + bool is_glibc; - /* Skip if it isn't linked against glibc. */ - if (glibc_bfd == NULL) - return true; + for (t = elf_tdata (rinfo->info->output_bfd)->verref; + t != NULL; + t = t->vn_nextref) + { + const char *soname = bfd_elf_get_dt_soname (t->vn_bfd); + if (soname != NULL && startswith (soname, "libc.so.")) + break; + } - /* This is a new version. Add it to tree we are building. */ - if (t == NULL) - { - amt = sizeof *t; - t = (Elf_Internal_Verneed *) bfd_zalloc (rinfo->info->output_bfd, - amt); + /* Skip the shared library if it isn't libc.so. */ if (t == NULL) + return t; + + is_glibc = false; + for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr) { - rinfo->failed = true; - return false; + /* Return if VERSION_DEP dependency has been added. */ + if (a->vna_nodename == version_dep + || strcmp (a->vna_nodename, version_dep) == 0) + return t; + + /* Check if libc.so provides GLIBC_2.XX version. */ + if (!is_glibc && startswith (a->vna_nodename, "GLIBC_2.")) + is_glibc = true; } - t->vn_bfd = glibc_bfd; - t->vn_nextref = elf_tdata (rinfo->info->output_bfd)->verref; - elf_tdata (rinfo->info->output_bfd)->verref = t; + /* Skip if it isn't linked against glibc. */ + if (!is_glibc) + return NULL; } amt = sizeof *a; @@ -2282,10 +2269,10 @@ elf_link_add_dt_relr_dependency (struct elf_find_verdep_info *rinfo) if (a == NULL) { rinfo->failed = true; - return false; + return NULL; } - a->vna_nodename = relr; + a->vna_nodename = version_dep; a->vna_flags = 0; a->vna_nextptr = t->vn_auxptr; a->vna_other = rinfo->vers + 1; @@ -2293,7 +2280,45 @@ elf_link_add_dt_relr_dependency (struct elf_find_verdep_info *rinfo) t->vn_auxptr = a; - return true; + return t; +} + +/* Add VERSION_DEP to the list of version dependencies when linked + against glibc. */ + +void +_bfd_elf_link_add_glibc_version_dependency + (struct elf_find_verdep_info *rinfo, + const char *version_dep[]) +{ + Elf_Internal_Verneed *t = NULL; + + do + { + t = elf_link_add_glibc_verneed (rinfo, t, *version_dep); + /* Return if there is no glibc version reference. */ + if (t == NULL) + return; + version_dep++; + } + while (*version_dep != NULL); +} + +/* Add GLIBC_ABI_DT_RELR to the list of version dependencies when + linked against glibc. */ + +void +_bfd_elf_link_add_dt_relr_dependency (struct elf_find_verdep_info *rinfo) +{ + if (rinfo->info->enable_dt_relr) + { + const char *version[] = + { + "GLIBC_ABI_DT_RELR", + NULL + }; + _bfd_elf_link_add_glibc_version_dependency (rinfo, version); + } } /* Look through the symbols which are defined in other shared @@ -7047,12 +7072,9 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, if (sinfo.failed) return false; - if (info->enable_dt_relr) - { - elf_link_add_dt_relr_dependency (&sinfo); - if (sinfo.failed) - return false; - } + bed->elf_backend_add_glibc_version_dependency (&sinfo); + if (sinfo.failed) + return false; if (elf_tdata (output_bfd)->verref == NULL) s->flags |= SEC_EXCLUDE; diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index d4b14a022e3..a7f2fc6e320 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -667,6 +667,10 @@ #ifndef elf_backend_write_section #define elf_backend_write_section NULL #endif +#ifndef elf_backend_add_glibc_version_dependency +#define elf_backend_add_glibc_version_dependency \ + _bfd_elf_link_add_dt_relr_dependency +#endif #ifndef elf_backend_elfsym_local_is_section #define elf_backend_elfsym_local_is_section NULL #endif @@ -897,6 +901,7 @@ static const struct elf_backend_data elfNN_bed = elf_backend_can_make_multiple_eh_frame, elf_backend_encode_eh_address, elf_backend_write_section, + elf_backend_add_glibc_version_dependency, elf_backend_elfsym_local_is_section, elf_backend_mips_irix_compat, elf_backend_mips_rtype_to_howto, diff --git a/ld/testsuite/ld-x86-64/mark-plt-1a.rd b/ld/testsuite/ld-x86-64/mark-plt-1a.rd new file mode 100644 index 00000000000..1234fbe038c --- /dev/null +++ b/ld/testsuite/ld-x86-64/mark-plt-1a.rd @@ -0,0 +1,7 @@ +#... +Version needs section '.gnu.version_r' contains 1 entry: + Addr: 0x[0-9a-f]+ +Offset: 0x[0-9a-f]+ +Link: +[0-9]+ +\(.dynstr\) + +0+: Version: 1 +File: libc\.so\.6(|\.1) +Cnt: +[0-9]+ +#... + 0x[a-f0-9]+: Name: GLIBC_2.36 Flags: none Version: [0-9]+ +#pass diff --git a/ld/testsuite/ld-x86-64/mark-plt-1b.rd b/ld/testsuite/ld-x86-64/mark-plt-1b.rd new file mode 100644 index 00000000000..6556a6d939e --- /dev/null +++ b/ld/testsuite/ld-x86-64/mark-plt-1b.rd @@ -0,0 +1,7 @@ +#... +Version needs section '.gnu.version_r' contains 1 entry: + Addr: 0x[0-9a-f]+ +Offset: 0x[0-9a-f]+ +Link: +[0-9]+ +\(.dynstr\) + +0+: Version: 1 +File: libc\.so\.6(|\.1) +Cnt: +[0-9]+ +#... + 0x[a-f0-9]+: Name: GLIBC_ABI_DT_RELR Flags: none Version: [0-9]+ +#pass diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 0af9f047600..d17bb9b7d7e 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -2257,4 +2257,18 @@ run_dump_test "mark-plt-1b-x32" run_dump_test "mark-plt-1c-x32" run_dump_test "mark-plt-1d-x32" +if { [check_compiler_available] } { + run_cc_link_tests [list \ + [list \ + "Build mark-plt-1.so" \ + "-shared -Wl,-z,mark-plt,-z,pack-relative-relocs" \ + "-fPIC" \ + { mark-plt-1.s } \ + {{readelf {-W --version-info} mark-plt-1a.rd} \ + {readelf {-W --version-info} mark-plt-1b.rd}} \ + "mark-plt-1.so" \ + ] \ + ] +} + set ASFLAGS "$saved_ASFLAGS" From patchwork Sat Jan 6 22:10:01 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 185689 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:37c1:b0:101:2151:f287 with SMTP id y1csp300120dyq; Sat, 6 Jan 2024 14:10:16 -0800 (PST) X-Google-Smtp-Source: AGHT+IGtsGDrVh67CKkPX0rUVlI0WflNeKAuvLZUV3CJd0O90FxFbqo8MBvDutDL8xYQ0F9ZVZPc X-Received: by 2002:a05:622a:1346:b0:429:8b91:613c with SMTP id w6-20020a05622a134600b004298b91613cmr843737qtk.126.1704579015951; Sat, 06 Jan 2024 14:10:15 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1704579015; cv=pass; d=google.com; s=arc-20160816; b=VTboNkFx1DR85cFrXW7H1BTMgq5j0V4Mi0R39ODxrF+fXeDtmYjA+zHKF+RuSSsTfR lSI4y91YlHSpmKaQEivRlDZRl6xIKpk0nsl8NNAIUpr+ZVkd+tEgEwRtqAN90f25tbRJ J2jcrTjCOCFAdx748W9KbDM/3XsmnBgozKKgjoJjrjt/DVipC9tUi9b9YBmAN90/tuLE w/jQQBfZ1a00N6YhHslw2Bv4yQoEz36e8jVrQwEG2rN2oRPJp7JTYQ7fnvU7FT5ASNQB sQrwZjtRjWEGNdwsbPVUInGgEgT92+PEm+JRS2x1fsRpI1a/6NEq0ExxeIoC2ukwqO0n 52Rg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to: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:to:from :dkim-signature:arc-filter:dmarc-filter:delivered-to; bh=6gTCBDH+1xH9nbW7+cTjZ5bSLqpenuDHcDWSVD4+WlU=; fh=NLxAvL/bDfPg4AGOtxqvQlND8vazkZrNzKLY8+LAbBY=; b=ymrFMO7utHY6GT2HdF9/w6WdX6FAx8Pum62h1FzQFr7hOJoz4mV+bhNSquKLeE3kug fNOmIkHY/5S2T5Io5snvijwlqG0OxGD7aGFBvlth5U5tJj4tkxJrieOI6j6NnEKOzcBy fnV9jowrSJCsJ/6HvPwn6O3AxvLx5+SNFLTZa1LG2DB8AefhXUkvCxanXnp2CqhQRdq3 aGyHmsL+9wBkDn0S4lmc3x1rkPdHjD/RaIlk7lgR0I9JHa2Dg9VrMcdLjYqIvsl0dgVx mnMdskVc1iVQSUZotqIz7g9xNmhZKnVkRlgkwJuVVajdVBM3lpDS5c9TeV6u4Vr0WbUc 2TxQ== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=DqLNDc2x; arc=pass (i=1); 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=QUARANTINE dis=NONE) header.from=gmail.com Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id t33-20020a05622a182100b004281e31baf2si4799428qtc.604.2024.01.06.14.10.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 06 Jan 2024 14:10:15 -0800 (PST) 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=@gmail.com header.s=20230601 header.b=DqLNDc2x; arc=pass (i=1); 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=QUARANTINE dis=NONE) header.from=gmail.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A133F386100C for ; Sat, 6 Jan 2024 22:10:15 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-il1-x133.google.com (mail-il1-x133.google.com [IPv6:2607:f8b0:4864:20::133]) by sourceware.org (Postfix) with ESMTPS id 60F9F3858D20 for ; Sat, 6 Jan 2024 22:10:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 60F9F3858D20 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 60F9F3858D20 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::133 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704579007; cv=none; b=vAdPOVw4hEoRIN7VyDO80yHbZKqJeg99O0c0iu9f5Q7SJsSLNj1p0feXh4ef0X1uvMCEAzjV7OCyrRpdS8PdZHPsH5Bh8bvK0aLuIt4bLBGEwXHZ8RRTML4KEPDT1TfVtVds/k+MhKHewt+oQOiPny1fNYU6rhDPepHxxeHOvVo= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704579007; c=relaxed/simple; bh=LDSHdsBOPOn+VSHrAk24vN1Z7YgIRji18tbQbkrQj+0=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=UL7Io8LMUL/nDvGjPdBBi/WDqU01qtOHHFwZo6MipOpbPR86F16qAyrDpo4rzGurVq8CYNFgl2N/t9iydEYS/7WtTMEwc0N1+7mCLsHMEvWI6eTINWBwZRSKNGoArG2A5B2p4UDuEM3Y7UJKW3FqMj+qu+ghTAVyzJme5YjmM24= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-il1-x133.google.com with SMTP id e9e14a558f8ab-3606f133bb5so7358745ab.1 for ; Sat, 06 Jan 2024 14:10:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1704579004; x=1705183804; darn=sourceware.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=6gTCBDH+1xH9nbW7+cTjZ5bSLqpenuDHcDWSVD4+WlU=; b=DqLNDc2xsNpXDTC6Y7/edX91xT9uEmSJx0wzVo5wBF07eunvt4tojFr0xrtnxMbt2k y4QrUZgloLZb1Tg65E33nuBX4yJ/sFkn/a+zgmSY0NmQpJTxuA278nVRje82Ah15Baiz NycODXtJzU3ZkSrBfpG88oLoMCPX8E1AS4NiZEL5MuT2H9VR3E78wWoNGznwpVsCgACu 6VAUIrSubmtlXJN0YDlpVdrf6Qo/p+OokXK5R1QfCOWO4BfU6P7C6SxyfinC38gTysim XWiPxLibqwPyKGh4I5kxWyiutKoFuSUF5OephA/191cIAaZvhUJytxC6fIdlGsn6Nvt/ yOLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704579004; x=1705183804; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6gTCBDH+1xH9nbW7+cTjZ5bSLqpenuDHcDWSVD4+WlU=; b=VFjvqBD6uy1TVyc/ScmXXRST40F7VlgytXjcwXBodHe0kzHBnEPZuenMl8lrE1q5Rs fvEPglYH4yBEqYT3gdiHlkZqVm2/WRHmLk+/vETdtiv62I8f0my65Ym2FW2R2TRf4oF0 CDmrMKevlSpjikUCsUhuiBWbkUmMU61DAe165pWQ01qU+zVJwtUpEHICkxWdOqt/j+f7 jnkIotaAnsZeJjHUMikQuzJ1vxCRLRDd8sfrBqQpMxK6CjfSkx04EdvqfBH4/5byn6u5 tqvYOGylDW6+9viwD5drdNaMDaRK4sEyqEZQT+JfMaabjA4RTXFM+BZ/DXlgfdcAH7XD XzNg== X-Gm-Message-State: AOJu0YzE3R1mGNA8ZEnzEo11Xb+p1oG59zTTfwZEnXl/MOVd083rBLkU zPmMT4wNUpeb1UIbFe8DvNZvaGwnxUs= X-Received: by 2002:a05:6e02:1bec:b0:35f:ec05:fd26 with SMTP id y12-20020a056e021bec00b0035fec05fd26mr2962991ilv.33.1704579003992; Sat, 06 Jan 2024 14:10:03 -0800 (PST) Received: from gnu-cfl-3.localdomain ([172.56.169.119]) by smtp.gmail.com with ESMTPSA id cz8-20020a17090ad44800b0028afd8b1e0bsm3514909pjb.57.2024.01.06.14.10.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 06 Jan 2024 14:10:03 -0800 (PST) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 06B90740670 for ; Sat, 6 Jan 2024 14:10:02 -0800 (PST) From: "H.J. Lu" To: binutils@sourceware.org Subject: [PATCH v2 2/2] ld: Add --enable-mark-plt configure option Date: Sat, 6 Jan 2024 14:10:01 -0800 Message-ID: <20240106221001.1754844-3-hjl.tools@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240106221001.1754844-1-hjl.tools@gmail.com> References: <20240106221001.1754844-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3021.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_ABUSEAT, RCVD_IN_DNSWL_NONE, RCVD_IN_SBL_CSS, 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.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1787380646450862032 X-GMAIL-MSGID: 1787380646450862032 Add --enable-mark-plt linker configure option to mark PLT entries with DT_X86_64_PLT, DT_X86_64_PLTSZ and DT_X86_64_PLTENT dynamic tags by default. * NEWS: Mention -z mark-plt/-z nomark-plt and --enable-mark-plt. * config.in: Regenerated. * configure: Likewise. * configure.ac: Add --enable-mark-plt. (DEFAULT_LD_Z_MARK_PLT): New AC_DEFINE_UNQUOTED. * emulparams/x86-64-plt.sh (PARSE_AND_LIST_OPTIONS_X86_64_PLT): Support DEFAULT_LD_Z_MARK_PLT. * emultempl/elf-x86.em (elf_x86_64_before_parse): New function. (LDEMUL_BEFORE_PARSE): New. Set to elf_x86_64_before_parse for x86-64 targets. --- ld/NEWS | 5 +++++ ld/config.in | 4 ++++ ld/configure | 26 ++++++++++++++++++++++++-- ld/configure.ac | 17 +++++++++++++++++ ld/emulparams/x86-64-plt.sh | 7 ++++++- ld/emultempl/elf-x86.em | 17 +++++++++++++++++ 6 files changed, 73 insertions(+), 3 deletions(-) diff --git a/ld/NEWS b/ld/NEWS index a2c0b7fbcfe..cedd0d72d1b 100644 --- a/ld/NEWS +++ b/ld/NEWS @@ -1,5 +1,10 @@ -*- text -*- +* Add -z mark-plt/-z nomark-plt options to x86-64 ELF linker to mark PLT + entries with DT_X86_64_PLT, DT_X86_64_PLTSZ and DT_X86_64_PLTENT dynamic + tags. Also added --enable-mark-plt configure option to mark PLT entries + by default. + * Support Intel APX relocations. * On RISC-V, add ld target option --[no-]check-uleb128. Should rebuild the diff --git a/ld/config.in b/ld/config.in index 86d90d53752..52d62f06ff0 100644 --- a/ld/config.in +++ b/ld/config.in @@ -45,6 +45,10 @@ default. */ #undef DEFAULT_LD_WARN_RWX_SEGMENTS +/* Define to 1 if you want to enable -z mark-plt in ELF x86-64 linker by + default. */ +#undef DEFAULT_LD_Z_MARK_PLT + /* Define to 1 if you want to enable -z relro in ELF linker by default. */ #undef DEFAULT_LD_Z_RELRO diff --git a/ld/configure b/ld/configure index 07eb669d906..b7f29ca68b7 100755 --- a/ld/configure +++ b/ld/configure @@ -852,6 +852,7 @@ enable_new_dtags enable_relro enable_textrel_check enable_separate_code +enable_mark_plt enable_warn_execstack enable_error_execstack enable_warn_rwx_segments @@ -1546,6 +1547,7 @@ Optional Features: --enable-textrel-check=[yes|no|warning|error] enable DT_TEXTREL check in ELF linker --enable-separate-code enable -z separate-code in ELF linker by default + --enable-mark-plt enable -z mark-plt in ELF x86-64 linker by default --enable-warn-execstack enable warnings when creating an executable stack --enable-error-execstack turn executable stack warnings into errors @@ -11681,7 +11683,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11684 "configure" +#line 11686 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11787,7 +11789,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11790 "configure" +#line 11792 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -15682,6 +15684,17 @@ esac fi +# Decide if -z mark-plt should be enabled in ELF x86-64 linker by default. +ac_default_ld_z_mark_plt=unset +# Check whether --enable-mark-plt was given. +if test "${enable_mark_plt+set}" = set; then : + enableval=$enable_mark_plt; case "${enableval}" in + yes) ac_default_ld_z_mark_plt=1 ;; + no) ac_default_ld_z_mark_plt=0 ;; +esac +fi + + # By default warn when an executable stack is created due to object files # requesting such, not when the user specifies -z execstack. @@ -19365,6 +19378,15 @@ cat >>confdefs.h <<_ACEOF _ACEOF +if test "${ac_default_ld_z_mark_plt}" = unset; then + ac_default_ld_z_mark_plt=0 +fi + +cat >>confdefs.h <<_ACEOF +#define DEFAULT_LD_Z_MARK_PLT $ac_default_ld_z_mark_plt +_ACEOF + + cat >>confdefs.h <<_ACEOF diff --git a/ld/configure.ac b/ld/configure.ac index b46f415fe9b..4a11787ae71 100644 --- a/ld/configure.ac +++ b/ld/configure.ac @@ -213,6 +213,16 @@ AC_ARG_ENABLE(separate-code, no) ac_default_ld_z_separate_code=0 ;; esac]) +# Decide if -z mark-plt should be enabled in ELF x86-64 linker by default. +ac_default_ld_z_mark_plt=unset +AC_ARG_ENABLE(mark-plt, + AS_HELP_STRING([--enable-mark-plt], + [enable -z mark-plt in ELF x86-64 linker by default]), +[case "${enableval}" in + yes) ac_default_ld_z_mark_plt=1 ;; + no) ac_default_ld_z_mark_plt=0 ;; +esac]) + # By default warn when an executable stack is created due to object files # requesting such, not when the user specifies -z execstack. @@ -562,6 +572,13 @@ AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_SEPARATE_CODE, $ac_default_ld_z_separate_code, [Define to 1 if you want to enable -z separate-code in ELF linker by default.]) +if test "${ac_default_ld_z_mark_plt}" = unset; then + ac_default_ld_z_mark_plt=0 +fi +AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_MARK_PLT, + $ac_default_ld_z_mark_plt, + [Define to 1 if you want to enable -z mark-plt in ELF x86-64 linker by default.]) + AC_DEFINE_UNQUOTED(DEFAULT_LD_WARN_EXECSTACK, $ac_default_ld_warn_execstack, diff --git a/ld/emulparams/x86-64-plt.sh b/ld/emulparams/x86-64-plt.sh index 92732401dc7..d1a5c65937f 100644 --- a/ld/emulparams/x86-64-plt.sh +++ b/ld/emulparams/x86-64-plt.sh @@ -1,5 +1,10 @@ PARSE_AND_LIST_OPTIONS_X86_64_PLT=' - fprintf (file, _("\ + if (DEFAULT_LD_Z_MARK_PLT != 0) + fprintf (file, _("\ + -z mark-plt Mark PLT with dynamic tags (default)\n\ + -z nomark-plt Do not mark PLT with dynamic tags\n")); + else + fprintf (file, _("\ -z mark-plt Mark PLT with dynamic tags\n\ -z nomark-plt Do not mark PLT with dynamic tags (default)\n")); ' diff --git a/ld/emultempl/elf-x86.em b/ld/emultempl/elf-x86.em index 0ccad72ab9a..a6eda14253f 100644 --- a/ld/emultempl/elf-x86.em +++ b/ld/emultempl/elf-x86.em @@ -56,3 +56,20 @@ EOF LDEMUL_BEFORE_PARSE=elf_x86_before_parse fi + +case x${OUTPUT_FORMAT} in + x*x86-64*) +fragment <