From patchwork Thu Feb 3 18:09:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 50749 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 756873858434 for ; Thu, 3 Feb 2022 18:13:47 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 756873858434 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1643912027; bh=wJt/e9Bmq/6GptKxL9X0MvEFL5yn6l0zPPKTECCPesA=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=PodD6dnX0rU5u3qcvZuZY2KlDH9e60JqFpt+ykuTiVqb9PVFhn94e4NIqA/wvby3y 40sI8UZ9R5jNzgp12ygNn0aJol+vz87/KdguCY2Bzj146DRKU5mvvfb35djBJARss3 zX7db2stPEWV95AG2qs174G9QHASOSVrSTpgRktQ= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@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 04E043858D39 for ; Thu, 3 Feb 2022 18:09:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 04E043858D39 Received: by mail-pl1-x630.google.com with SMTP id d18so2844074plg.2 for ; Thu, 03 Feb 2022 10:09:51 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wJt/e9Bmq/6GptKxL9X0MvEFL5yn6l0zPPKTECCPesA=; b=UuGGck2WWWQ8NPfKG3LIguNtujYRe7l/SSUSpSKUX1ojYChWCTdbfyzr3CsOQW/EqN Qu4KWhi4MiTQhJUUwanbWMuiDKBuEZghma76FSfiIHNJrgF/jsFFoIPqfeweWWdUulzI nU8QoU+TALHbminGWcbe4AHuWrEwk7kMbZ3Bg8fSuJQvTwmQfd+x7DPVBQog6IWdoqLp bt08+FsX/SDP8gzQWKIoORLKB6JaRrZIaCdGJSLamvrzIg0KNFiNX/6r85Q5D0LIu6ya Co7wJWaCn3AN5OH2LuYO316G6XjqJGSsujosBSLZzX6jdk6/VOGugGblGmifSPcgw0ov BHGg== X-Gm-Message-State: AOAM531or2mhcrhByrOstqYD4TvFK+cnwPmoMQfFSU+VEmJYXi+6kKxR 6uUawof1Jwkqos4OVcak6S40HZq4fVA= X-Google-Smtp-Source: ABdhPJwBZRqISDyPHrIIZGj+o5kuxmQrLGSM2B/ZJaTt3VFs+KW/nLuocmQabC9ITy6ZYfkrzmdm8w== X-Received: by 2002:a17:90b:2385:: with SMTP id mr5mr14956719pjb.186.1643911790971; Thu, 03 Feb 2022 10:09:50 -0800 (PST) Received: from gnu-tgl-2.localdomain ([172.58.38.240]) by smtp.gmail.com with ESMTPSA id s6sm36464491pgh.86.2022.02.03.10.09.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Feb 2022 10:09:50 -0800 (PST) Received: from gnu-tgl-2.. (localhost [IPv6:::1]) by gnu-tgl-2.localdomain (Postfix) with ESMTP id C40393004A5; Thu, 3 Feb 2022 10:09:48 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH 1/7] elf: Support DT_RELR relative relocation format [BZ #27924] Date: Thu, 3 Feb 2022 10:09:42 -0800 Message-Id: <20220203180948.2744-2-hjl.tools@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220203180948.2744-1-hjl.tools@gmail.com> References: <20220203180948.2744-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3029.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, URIBL_BLACK autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" From: Fangrui Song PIE and shared objects usually have many relative relocations. In 2017/2018, SHT_RELR/DT_RELR was proposed on https://groups.google.com/g/generic-abi/c/bX460iggiKg/m/GxjM0L-PBAAJ ("Proposal for a new section type SHT_RELR") and is a pre-standard. RELR usually takes 3% or smaller space than R_*_RELATIVE relocations. The virtual memory size of a mostly statically linked PIE is typically 5~10% smaller. --- Notes I will not include in the submitted commit: Available on https://sourceware.org/git/?p=glibc.git;a=shortlog;h=refs/heads/maskray/relr "pre-standard": even Solaris folks are happy with the refined generic-abi proposal. Cary Coutant will apply the change https://sourceware.org/pipermail/libc-alpha/2021-October/131781.html This patch is simpler than Chrome OS's glibc patch and makes ELF_DYNAMIC_DO_RELR available to all ports. I don't think the current glibc implementation supports ia64 in an ELFCLASS32 container. That said, the style I used is works with an ELFCLASS32 container for 64-bit machine if ElfW(Addr) is 64-bit. * Chrome OS folks have carried a local patch since 2018 (latest version: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/refs/heads/main/sys-libs/glibc/files/local/glibc-2.32). I.e. this feature has been battle tested. * Android bionic supports 2018 and switched to DT_RELR==36 in 2020. * The Linux kernel has supported CONFIG_RELR since 2019-08 (https://git.kernel.org/linus/5cf896fb6be3effd9aea455b22213e27be8bdb1d). * A musl patch (by me) exists but is not applied: https://www.openwall.com/lists/musl/2019/03/06/3 * rtld-elf from FreeBSD 14 will support DT_RELR. I believe upstream glibc should support DT_RELR to benefit all Linux distributions. I filed some feature requests to get their attention: * Gentoo: https://bugs.gentoo.org/818376 * Arch Linux: https://bugs.archlinux.org/task/72433 * Debian https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=996598 * Fedora https://bugzilla.redhat.com/show_bug.cgi?id=2014699 As of linker support (to the best of my knowledge): * LLD support DT_RELR. * https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/refs/heads/main/sys-devel/binutils/files/ has a gold patch. * GNU ld feature request https://sourceware.org/bugzilla/show_bug.cgi?id=27923 Changes from the original patch: 1. Check the linker option, -z pack-relative-relocs, which add a GLIBC_ABI_DT_RELR symbol version dependency on the shared C library if it provides a GLIBC_2.XX symbol version. 2. Define HAVE_DT_RELR and support DT_RELR only if -z pack-relative-relocs is available. 3. Change make variale to have-dt-relr. 4. Rename tst-relr-no-pie to tst-relr-pie for --disable-default-pie. 5. Use TEST_VERIFY in tst-relr.c. 6. Add the check-tst-relr-pie.out test to check for linker generated libc.so version dependency on GLIBC_ABI_DT_RELR. --- config.h.in | 3 ++ configure | 46 ++++++++++++++++++++++++++++++ configure.ac | 11 ++++++++ elf/Makefile | 14 +++++++++ elf/dynamic-link.h | 34 ++++++++++++++++++++++ elf/elf.h | 13 +++++++-- elf/get-dynamic-info.h | 3 ++ elf/tst-relr-pie.c | 1 + elf/tst-relr.c | 64 ++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 elf/tst-relr-pie.c create mode 100644 elf/tst-relr.c diff --git a/config.h.in b/config.h.in index ff8597413d..edd167d96e 100644 --- a/config.h.in +++ b/config.h.in @@ -59,6 +59,9 @@ /* Define if the linker supports the -z combreloc option. */ #undef HAVE_Z_COMBRELOC +/* Define if the linker supports the -z pack-relative-relocs option. */ +#undef HAVE_DT_RELR + /* Define if _rtld_local structure should be forced into .sdata section. */ #undef HAVE_SDATA_SECTION diff --git a/configure b/configure index 8e5bee775a..a9bdcb4ee5 100755 --- a/configure +++ b/configure @@ -6115,6 +6115,52 @@ $as_echo "$libc_linker_feature" >&6; } config_vars="$config_vars have-depaudit = $libc_cv_depaudit" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z pack-relative-relocs" >&5 +$as_echo_n "checking for linker that supports -z pack-relative-relocs... " >&6; } +libc_linker_feature=no +if test x"$gnu_ld" = x"yes"; then + cat > conftest.c <&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } + then + if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -Wl,-z,pack-relative-relocs -nostdlib \ + -nostartfiles -fPIC -shared -o conftest.so conftest.c 2>&1 \ + | grep "warning: -z pack-relative-relocs ignored" > /dev/null 2>&1; then + true + else + libc_linker_feature=yes + fi + fi + rm -f conftest* +fi +if test $libc_linker_feature = yes; then + libc_cv_dt_relr=yes +else + libc_cv_dt_relr=no +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5 +$as_echo "$libc_linker_feature" >&6; } +config_vars="$config_vars +have-dt-relr = $libc_cv_dt_relr" +if test "$libc_cv_dt_relr" = yes; then + have_dt_relr=1 +else + have_dt_relr=0 +fi +cat >>confdefs.h <<_ACEOF +#define HAVE_DT_RELR $have_dt_relr +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports --no-dynamic-linker" >&5 $as_echo_n "checking for linker that supports --no-dynamic-linker... " >&6; } libc_linker_feature=no diff --git a/configure.ac b/configure.ac index 87f67d25ec..36a647cc14 100644 --- a/configure.ac +++ b/configure.ac @@ -1367,6 +1367,17 @@ LIBC_LINKER_FEATURE([--depaudit], [-Wl,--depaudit,x], [libc_cv_depaudit=yes], [libc_cv_depaudit=no]) LIBC_CONFIG_VAR([have-depaudit], [$libc_cv_depaudit]) +LIBC_LINKER_FEATURE([-z pack-relative-relocs], + [-Wl,-z,pack-relative-relocs], + [libc_cv_dt_relr=yes], [libc_cv_dt_relr=no]) +LIBC_CONFIG_VAR([have-dt-relr], [$libc_cv_dt_relr]) +if test "$libc_cv_dt_relr" = yes; then + have_dt_relr=1 +else + have_dt_relr=0 +fi +AC_DEFINE_UNQUOTED(HAVE_DT_RELR, $have_dt_relr) + LIBC_LINKER_FEATURE([--no-dynamic-linker], [-Wl,--no-dynamic-linker], [libc_cv_no_dynamic_linker=yes], diff --git a/elf/Makefile b/elf/Makefile index 5bdf0a383d..d1094f40ce 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -537,6 +537,14 @@ tests-special += \ # tests-special endif endif +ifeq ($(have-dt-relr),yes) +tests += tst-relr tst-relr-pie +tests-pie += tst-relr-pie +tests-special += $(objpfx)check-tst-relr-pie.out +CFLAGS-tst-relr-pie.c += $(pie-ccflag) +LDFLAGS-tst-relr += -Wl,-z,pack-relative-relocs +LDFLAGS-tst-relr-pie += -Wl,-z,pack-relative-relocs +endif endif ifeq ($(run-built-tests),yes) @@ -2733,3 +2741,9 @@ $(objpfx)tst-p_align3: $(objpfx)tst-p_alignmod3.so $(objpfx)tst-p_align3.out: tst-p_align3.sh $(objpfx)tst-p_align3 $(SHELL) $< $(common-objpfx) '$(test-program-prefix)'; \ $(evaluate-test) + +$(objpfx)check-tst-relr-pie.out: $(objpfx)tst-relr-pie + LC_ALL=C $(OBJDUMP) -p $< \ + | sed -ne '/required from libc.so/,$$ p' \ + | grep GLIBC_ABI_DT_RELR > $@; \ + $(evaluate-test) diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h index 25dd7ca4f2..916439a586 100644 --- a/elf/dynamic-link.h +++ b/elf/dynamic-link.h @@ -146,14 +146,48 @@ elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[], # define ELF_DYNAMIC_DO_RELA(map, scope, lazy, skip_ifunc) /* Nothing to do. */ # endif +# define ELF_DYNAMIC_DO_RELR(map) \ + do { \ + ElfW(Addr) l_addr = (map)->l_addr, *where = 0; \ + const ElfW(Relr) *r, *end; \ + if (!(map)->l_info[DT_RELR]) \ + break; \ + r = (const ElfW(Relr) *)D_PTR((map), l_info[DT_RELR]); \ + end = (const ElfW(Relr) *)((const char *)r + \ + (map)->l_info[DT_RELRSZ]->d_un.d_val); \ + for (; r < end; r++) \ + { \ + ElfW(Relr) entry = *r; \ + if ((entry & 1) == 0) \ + { \ + where = (ElfW(Addr) *)(l_addr + entry); \ + *where++ += l_addr; \ + } \ + else \ + { \ + for (long i = 0; (entry >>= 1) != 0; i++) \ + if ((entry & 1) != 0) \ + where[i] += l_addr; \ + where += CHAR_BIT * sizeof(ElfW(Relr)) - 1; \ + } \ + } \ + } while (0); + /* This can't just be an inline function because GCC is too dumb to inline functions containing inlines themselves. */ +# ifdef RTLD_BOOTSTRAP +# define DO_RTLD_BOOTSTRAP 1 +# else +# define DO_RTLD_BOOTSTRAP 0 +# endif # define ELF_DYNAMIC_RELOCATE(map, scope, lazy, consider_profile, skip_ifunc) \ do { \ int edr_lazy = elf_machine_runtime_setup ((map), (scope), (lazy), \ (consider_profile)); \ ELF_DYNAMIC_DO_REL ((map), (scope), edr_lazy, skip_ifunc); \ ELF_DYNAMIC_DO_RELA ((map), (scope), edr_lazy, skip_ifunc); \ + if (HAVE_DT_RELR && ((map) != &GL(dl_rtld_map) || DO_RTLD_BOOTSTRAP)) \ + ELF_DYNAMIC_DO_RELR (map); \ } while (0) #endif diff --git a/elf/elf.h b/elf/elf.h index 0735f6b579..0195029188 100644 --- a/elf/elf.h +++ b/elf/elf.h @@ -443,7 +443,8 @@ typedef struct #define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */ #define SHT_GROUP 17 /* Section group */ #define SHT_SYMTAB_SHNDX 18 /* Extended section indices */ -#define SHT_NUM 19 /* Number of defined types. */ +#define SHT_RELR 19 /* RELR relative relocations */ +#define SHT_NUM 20 /* Number of defined types. */ #define SHT_LOOS 0x60000000 /* Start OS-specific. */ #define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes. */ #define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */ @@ -662,6 +663,11 @@ typedef struct Elf64_Sxword r_addend; /* Addend */ } Elf64_Rela; +/* RELR relocation table entry */ + +typedef Elf32_Word Elf32_Relr; +typedef Elf64_Xword Elf64_Relr; + /* How to extract and insert information held in the r_info field. */ #define ELF32_R_SYM(val) ((val) >> 8) @@ -887,7 +893,10 @@ typedef struct #define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/ #define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */ #define DT_SYMTAB_SHNDX 34 /* Address of SYMTAB_SHNDX section */ -#define DT_NUM 35 /* Number used */ +#define DT_RELRSZ 35 /* Total size of RELR relative relocations */ +#define DT_RELR 36 /* Address of RELR relative relocations */ +#define DT_RELRENT 37 /* Size of one RELR relative relocaction */ +#define DT_NUM 38 /* Number used */ #define DT_LOOS 0x6000000d /* Start of OS-specific */ #define DT_HIOS 0x6ffff000 /* End of OS-specific */ #define DT_LOPROC 0x70000000 /* Start of processor-specific */ diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h index 6c2ccd6db4..6c2a3a12b1 100644 --- a/elf/get-dynamic-info.h +++ b/elf/get-dynamic-info.h @@ -89,6 +89,7 @@ elf_get_dynamic_info (struct link_map *l, bool bootstrap, # if ! ELF_MACHINE_NO_REL ADJUST_DYN_INFO (DT_REL); # endif + ADJUST_DYN_INFO (DT_RELR); ADJUST_DYN_INFO (DT_JMPREL); ADJUST_DYN_INFO (VERSYMIDX (DT_VERSYM)); ADJUST_DYN_INFO (ADDRIDX (DT_GNU_HASH)); @@ -113,6 +114,8 @@ elf_get_dynamic_info (struct link_map *l, bool bootstrap, if (info[DT_REL] != NULL) assert (info[DT_RELENT]->d_un.d_val == sizeof (ElfW(Rel))); #endif + if (info[DT_RELR] != NULL) + assert (info[DT_RELRENT]->d_un.d_val == sizeof (ElfW(Relr))); if (bootstrap || static_pie_bootstrap) { assert (info[DT_RUNPATH] == NULL); diff --git a/elf/tst-relr-pie.c b/elf/tst-relr-pie.c new file mode 100644 index 0000000000..7df0cdbfd6 --- /dev/null +++ b/elf/tst-relr-pie.c @@ -0,0 +1 @@ +#include "tst-relr.c" diff --git a/elf/tst-relr.c b/elf/tst-relr.c new file mode 100644 index 0000000000..56addd2ad4 --- /dev/null +++ b/elf/tst-relr.c @@ -0,0 +1,64 @@ +/* Basic tests for DT_RELR. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include + +static int o, x; + +#define ELEMS O O O O O O O O X X X X X X X O O X O O X X X E X E E O X O E +#define E 0, + +#define O &o, +#define X &x, +void *arr[] = { ELEMS }; +#undef O +#undef X + +#define O 1, +#define X 2, +static char val[] = { ELEMS }; + +static int +do_test (void) +{ + ElfW(Dyn) *d = _DYNAMIC; + if (d) + { + bool has_relr = false; + for (; d->d_tag != DT_NULL; d++) + if (d->d_tag == DT_RELR) + has_relr = true; + +#if defined __PIE__ || defined __pie__ || defined PIE || defined pie + TEST_VERIFY (has_relr); +#else + TEST_VERIFY (!has_relr); +#endif + } + + for (int i = 0; i < sizeof (arr) / sizeof (arr[0]); i++) + TEST_VERIFY ((arr[i] == 0 && val[i] == 0) + || (arr[i] == &o && val[i] == 1) + || (arr[i] == &x && val[i] == 2)); + + return 0; +} + +#include From patchwork Thu Feb 3 18:09:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 50745 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A26203858422 for ; Thu, 3 Feb 2022 18:10:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A26203858422 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1643911859; bh=Or+WVb5rXrYsvdhasbV9QkWy+ToNh7k/Dn7u1EQ/wAA=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=QxPxxZcRpI+DkjfqCc690yw1pa3aCtJpNvFPH8ANgp69sxG694xRREg8SRCLd3E9P /+9QSKY+r0sI3FryBwG/lDuJdUzk7bttrja35/+gn/0auWAz7k8YQ/164pikVLzpDW 0Hu4D42sgpRnXJXhWyvhldcmBqjTOYad2zjIGKtI= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by sourceware.org (Postfix) with ESMTPS id E87403858C78 for ; Thu, 3 Feb 2022 18:09:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E87403858C78 Received: by mail-pj1-x1031.google.com with SMTP id m7so3210713pjk.0 for ; Thu, 03 Feb 2022 10:09:52 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Or+WVb5rXrYsvdhasbV9QkWy+ToNh7k/Dn7u1EQ/wAA=; b=KuGsB4Oa0qWfz5wwXQ+yLT0Fs3Np+YokbJb7YnuM09PN9J29uqI/E558nx+VwFb/zS /1FuneeZxilUMr9AjjMrH7cNzn4mNBODjGladpYYD7XwxChUimQJigMmzFVYImicnTgD OYG+Eo6DP4NjpUsdHuED7f8MliM4P1/tP0J+NsFr7CS1G3oZ4CerXo3ugh+Ei/llfkQm lCjJq74ZWtRWdN1K4UL8tnEBduXRR1LAOEiQTyNVpGrrLUfvafo1iHKDHJaxn3RigB9X jpar7dX8qhQPVr6CARCTUQjRylH2+N1Ct0R0GWM0sYwEuYR4FFcRNkhUFvzgyW0v0cXV WO1A== X-Gm-Message-State: AOAM530OqNvD6SYrGo74/cKns79J7cHizYE78mAFwrd2kBWJGO+9KlnW 7xp8y7mBEEBwx+pa6+xp3ZxF0n6ADbM= X-Google-Smtp-Source: ABdhPJzLbu1DI4XX7shTcrbNyOOx7TN8cJuJC7ziAOWjZjuBkRNTwtGXQZ6O6Dd7XCDjz/6Jl2DpEw== X-Received: by 2002:a17:903:1210:: with SMTP id l16mr34407009plh.63.1643911791915; Thu, 03 Feb 2022 10:09:51 -0800 (PST) Received: from gnu-tgl-2.localdomain ([172.58.38.240]) by smtp.gmail.com with ESMTPSA id o1sm32112019pfu.88.2022.02.03.10.09.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Feb 2022 10:09:50 -0800 (PST) Received: from gnu-tgl-2.. (localhost [IPv6:::1]) by gnu-tgl-2.localdomain (Postfix) with ESMTP id CFB8A3004A6; Thu, 3 Feb 2022 10:09:48 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH 2/7] elf: Properly handle zero DT_RELA/DT_REL values Date: Thu, 3 Feb 2022 10:09:43 -0800 Message-Id: <20220203180948.2744-3-hjl.tools@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220203180948.2744-1-hjl.tools@gmail.com> References: <20220203180948.2744-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3020.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, UNWANTED_LANGUAGE_BODY autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" With DT_RELR, there may be no relocations in DT_RELA/DT_REL and their entry values are zero. Don't relocate DT_RELA/DT_REL and update the combined relocation start address if their entry values are zero. --- elf/dynamic-link.h | 6 +++++- elf/get-dynamic-info.h | 18 ++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h index 916439a586..d6c26d95e4 100644 --- a/elf/dynamic-link.h +++ b/elf/dynamic-link.h @@ -84,7 +84,9 @@ elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[], __typeof (((ElfW(Dyn) *) 0)->d_un.d_val) nrelative; int lazy; } \ ranges[2] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; \ \ - if ((map)->l_info[DT_##RELOC]) \ + /* With DT_RELR, DT_RELA/DT_REL can have zero value. */ \ + if ((map)->l_info[DT_##RELOC] \ + && (map)->l_info[DT_##RELOC]->d_un.d_ptr != 0) \ { \ ranges[0].start = D_PTR ((map), l_info[DT_##RELOC]); \ ranges[0].size = (map)->l_info[DT_##RELOC##SZ]->d_un.d_val; \ @@ -98,6 +100,8 @@ elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[], ElfW(Addr) start = D_PTR ((map), l_info[DT_JMPREL]); \ ElfW(Addr) size = (map)->l_info[DT_PLTRELSZ]->d_un.d_val; \ \ + if (ranges[0].start == 0) \ + ranges[0].start = start; \ if (ranges[0].start + ranges[0].size == (start + size)) \ ranges[0].size -= size; \ if (!(do_lazy) \ diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h index 6c2a3a12b1..f4b957684b 100644 --- a/elf/get-dynamic-info.h +++ b/elf/get-dynamic-info.h @@ -83,16 +83,26 @@ elf_get_dynamic_info (struct link_map *l, bool bootstrap, ADJUST_DYN_INFO (DT_PLTGOT); ADJUST_DYN_INFO (DT_STRTAB); ADJUST_DYN_INFO (DT_SYMTAB); + ADJUST_DYN_INFO (DT_RELR); + ADJUST_DYN_INFO (DT_JMPREL); + ADJUST_DYN_INFO (VERSYMIDX (DT_VERSYM)); + ADJUST_DYN_INFO (ADDRIDX (DT_GNU_HASH)); +# undef ADJUST_DYN_INFO + + /* DT_RELA/DT_REL are mandatory. But they may have zero value if + there is DT_RELR. Don't relocate them if they are zero. */ +# define ADJUST_DYN_INFO(tag) \ + do \ + if (info[tag] != NULL && info[tag]->d_un.d_ptr != 0) \ + info[tag]->d_un.d_ptr += l_addr; \ + while (0) + # if ! ELF_MACHINE_NO_RELA ADJUST_DYN_INFO (DT_RELA); # endif # if ! ELF_MACHINE_NO_REL ADJUST_DYN_INFO (DT_REL); # endif - ADJUST_DYN_INFO (DT_RELR); - ADJUST_DYN_INFO (DT_JMPREL); - ADJUST_DYN_INFO (VERSYMIDX (DT_VERSYM)); - ADJUST_DYN_INFO (ADDRIDX (DT_GNU_HASH)); # undef ADJUST_DYN_INFO } if (info[DT_PLTREL] != NULL) From patchwork Thu Feb 3 18:09:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 50744 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 227F83858410 for ; Thu, 3 Feb 2022 18:10:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 227F83858410 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1643911813; bh=I91tfO0BhdGmw0r5huhdoSSEz/N9gMLajrtcFgoi0Ms=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=pDl2f6K+EBj2Vi5RWU4nN5B5HamKwkgWcAXvTjDsbdNMaCK+JQLj6Jp7/Zm+h8lrJ uybZsczeBRYGVcdlzWNzVyQuO12flkfHi4zBsdOgJomG0nAlShjSBBb/bLe5gwM4KQ PZj4LAGe8xw/0UzUxnHTmYDx7nvEjC6Vey0y9wcs= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) by sourceware.org (Postfix) with ESMTPS id 7EBE63858D35 for ; Thu, 3 Feb 2022 18:09:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7EBE63858D35 Received: by mail-pj1-x1030.google.com with SMTP id h12so3162498pjq.3 for ; Thu, 03 Feb 2022 10:09:51 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=I91tfO0BhdGmw0r5huhdoSSEz/N9gMLajrtcFgoi0Ms=; b=K+Bz5+t3+nvsiTty8QRuHmxE16Tp3/YyNN3m3J4xq2cm28GGuCJgMAsImiImI6/vSp CC0iGMiKSPjBymxuaLpqPNAd5LVVIwerPLxoCjK6zLOg6N952ljfRG6mGEo/gyNbUet+ F3do0Y5Up7UViecdIkuqN+Kafj44r7OAvVl27sOppdEJvaf7rwI9Y5LCMLydaydFnds1 SoWBwiprgKFyfcbjdZ988tgl9qQ9+j/yfkjbeQWBKJ59Ov41pRwcxOkR++AbhNOYq0mf b9hg6dwPuO+GzkMwBYJ3LV4+tbDsfr+dwbd4eAb29LQ1hbyO+/vv6S7HgDaDYe5T+HLC LWgg== X-Gm-Message-State: AOAM5324rMD8RsvCp7rQfmBly3g1bfbGd1Ou1GCid54kZx8XBGEX8N/1 Z/gjMNX0/C7sOxi99omUVsvK06fnrsw= X-Google-Smtp-Source: ABdhPJy2xi5AFbMf66D8PgRJ3nsjX+EyV1mGQ+NUYmYJZECsA8QJAIZGFwjb9UxHEEBOSEGizv7NaQ== X-Received: by 2002:a17:90b:3b88:: with SMTP id pc8mr15083659pjb.217.1643911790486; Thu, 03 Feb 2022 10:09:50 -0800 (PST) Received: from gnu-tgl-2.localdomain ([172.58.38.240]) by smtp.gmail.com with ESMTPSA id p16sm13163702pgj.79.2022.02.03.10.09.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Feb 2022 10:09:50 -0800 (PST) Received: from gnu-tgl-2.. (localhost [IPv6:::1]) by gnu-tgl-2.localdomain (Postfix) with ESMTP id D14193004A7; Thu, 3 Feb 2022 10:09:48 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH 3/7] Add GLIBC_ABI_DT_RELR for DT_RELR support Date: Thu, 3 Feb 2022 10:09:44 -0800 Message-Id: <20220203180948.2744-4-hjl.tools@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220203180948.2744-1-hjl.tools@gmail.com> References: <20220203180948.2744-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3029.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, URIBL_BLACK autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" The EI_ABIVERSION field of the ELF header in executables and shared libraries can be bumped to indicate the minimum ABI requirement on the dynamic linker. However, EI_ABIVERSION in executables isn't checked by the Linux kernel ELF loader nor the existing dynamic linker. Executables will crash mysteriously if the dynamic linker doesn't support the ABI features required by the EI_ABIVERSION field. The dynamic linker should be changed to check EI_ABIVERSION in executables. Add a glibc version, GLIBC_ABI_DT_RELR, to indicate DT_RELR support so that the existing dynamic linkers will issue an error on executables with GLIBC_ABI_DT_RELR depdendency. Support __placeholder_only_for_empty_version_map as the placeholder symbol used only for empty version map to generate GLIBC_ABI_DT_RELR without any symbols. --- elf/Makefile | 18 ++++++++++++++++-- elf/Versions | 7 +++++++ elf/libc-abi-version.exp | 1 + scripts/abilist.awk | 2 ++ scripts/versions.awk | 7 ++++++- 5 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 elf/libc-abi-version.exp diff --git a/elf/Makefile b/elf/Makefile index d1094f40ce..c697e7b7ee 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -48,6 +48,10 @@ routines = \ rtld_static_init \ # routines +ifeq ($(have-dt-relr),yes) +check-abi-version-libc = $(objpfx)check-abi-version-libc.out +endif + # The core dynamic linking functions are in libc for the static and # profiled libraries. dl-routines = \ @@ -1106,8 +1110,8 @@ $(eval $(call include_dsosort_tests,dso-sort-tests-1.def)) $(eval $(call include_dsosort_tests,dso-sort-tests-2.def)) endif -check-abi: $(objpfx)check-abi-ld.out -tests-special += $(objpfx)check-abi-ld.out +check-abi: $(objpfx)check-abi-ld.out $(check-abi-version-libc) +tests-special += $(objpfx)check-abi-ld.out $(check-abi-version-libc) update-abi: update-abi-ld update-all-abi: update-all-abi-ld @@ -2747,3 +2751,13 @@ $(objpfx)check-tst-relr-pie.out: $(objpfx)tst-relr-pie | sed -ne '/required from libc.so/,$$ p' \ | grep GLIBC_ABI_DT_RELR > $@; \ $(evaluate-test) + +$(objpfx)check-abi-version-libc.out: libc-abi-version.exp \ + $(objpfx)libc.symlist-abi-version + cmp $^ > $@; \ + $(evaluate-test) + +$(objpfx)libc.symlist-abi-version: $(common-objpfx)libc.so + LC_ALL=C $(NM) -D $< | grep " GLIBC_ABI_" \ + | sed "s/^0\+/00000000/" > $@T + mv -f $@T $@ diff --git a/elf/Versions b/elf/Versions index 8bed855d8c..a84927c95f 100644 --- a/elf/Versions +++ b/elf/Versions @@ -23,6 +23,13 @@ libc { GLIBC_2.35 { _dl_find_object; } +%if HAVE_DT_RELR + GLIBC_ABI_DT_RELR { + # This symbol is used only for empty version map and will be removed + # by scripts/versions.awk. + __placeholder_only_for_empty_version_map; + } +%endif GLIBC_PRIVATE { # functions used in other libraries __libc_early_init; diff --git a/elf/libc-abi-version.exp b/elf/libc-abi-version.exp new file mode 100644 index 0000000000..455088dc6b --- /dev/null +++ b/elf/libc-abi-version.exp @@ -0,0 +1 @@ +00000000 A GLIBC_ABI_DT_RELR diff --git a/scripts/abilist.awk b/scripts/abilist.awk index 24a34ccbed..6cc7af6ac8 100644 --- a/scripts/abilist.awk +++ b/scripts/abilist.awk @@ -55,6 +55,8 @@ $2 == "g" || $2 == "w" && (NF == 7 || NF == 8) { # caused STV_HIDDEN symbols to appear in .dynsym, though that is useless. if (NF > 7 && $7 == ".hidden") next; + if (version ~ /^GLIBC_ABI_/ && !include_abi_version) next; + if (version == "GLIBC_PRIVATE" && !include_private) next; desc = ""; diff --git a/scripts/versions.awk b/scripts/versions.awk index 357ad1355e..d70b07bd1a 100644 --- a/scripts/versions.awk +++ b/scripts/versions.awk @@ -185,8 +185,13 @@ END { closeversion(oldver, veryoldver); veryoldver = oldver; } - printf("%s {\n global:\n", $2) > outfile; oldver = $2; + # Skip the placeholder symbol used only for empty version map. + if ($3 == "__placeholder_only_for_empty_version_map;") { + printf("%s {\n", $2) > outfile; + continue; + } + printf("%s {\n global:\n", $2) > outfile; } printf(" ") > outfile; for (n = 3; n <= NF; ++n) { From patchwork Thu Feb 3 18:09:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 50748 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 871D93858402 for ; Thu, 3 Feb 2022 18:13:05 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 871D93858402 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1643911985; bh=INJyHCnD6uMT/SPam7iAqthgpd39BTfkuuYhPUAG/Uo=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=WJYbIC62klLIWYHdPErRsASlEc29I2pu3JvnM4zbSZopEkrsD/a4nirXDpCaFQ9tY f+CAQSaKa9HDaxeI2m6ddZXDHqWTZcyCxbL79l663XQfhJdYa9Z2z9DbYma22nYSe0 uEW6dwAK5n3Bavpt86xkYqJz+HoT6wX0lpyQDInE= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pf1-x432.google.com (mail-pf1-x432.google.com [IPv6:2607:f8b0:4864:20::432]) by sourceware.org (Postfix) with ESMTPS id 9CE333858D37 for ; Thu, 3 Feb 2022 18:09:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 9CE333858D37 Received: by mail-pf1-x432.google.com with SMTP id i17so2855358pfq.13 for ; Thu, 03 Feb 2022 10:09:51 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=INJyHCnD6uMT/SPam7iAqthgpd39BTfkuuYhPUAG/Uo=; b=M+E2KJUxb92jHloi7P4m0Uc2FP8xstLh+h3BBgWkbWhxn6iHHFOhJAcWeFGC9a1+ux 0+G+XGbZom/sw0Ui58PCryoVBW0offXqsFfiU/kSuISaj5/3mFOWXmR6jN4qy9HBHHEm b9eITShmwqDZoJVp+lowjiw97b7xet5TqGMJhP/23ZcAb28NdWo601jLAs04v1HJSEA2 K/7KNv8AvFFMLma+Hcf2YdJ2rUPIKUYV/VEjMDY5/D+Mwi80d61fmAit53sl21hfb3xY SFqm9EpKcsTD6HmjklUH/NZsM0BU2WNc5aKXgSWV2krzkoQ9CFI8AcniFf8iAdpA6+bi o8/A== X-Gm-Message-State: AOAM533HbR9wjbh6f05jZ85kZlP8bk2qtQsWwthSdQNll2Iq6RXSJsdi E6hCL4HP5UOz19t8jA8C47QQ6JW+6s4= X-Google-Smtp-Source: ABdhPJwsYVJIpnLucqNYrAHjbFP/HZiev0e5p0yWLR3zQXVwr/iT8vnIE37fQo6W0Yd61w3heoYlMQ== X-Received: by 2002:a05:6a00:cb:: with SMTP id e11mr34793609pfj.53.1643911790740; Thu, 03 Feb 2022 10:09:50 -0800 (PST) Received: from gnu-tgl-2.localdomain ([172.58.38.240]) by smtp.gmail.com with ESMTPSA id q19sm29142653pfn.159.2022.02.03.10.09.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Feb 2022 10:09:50 -0800 (PST) Received: from gnu-tgl-2.. (localhost [IPv6:::1]) by gnu-tgl-2.localdomain (Postfix) with ESMTP id DCF183004A8; Thu, 3 Feb 2022 10:09:48 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH 4/7] x86/configure.ac: Define PI_STATIC_AND_HIDDEN/SUPPORT_STATIC_PIE Date: Thu, 3 Feb 2022 10:09:45 -0800 Message-Id: <20220203180948.2744-5-hjl.tools@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220203180948.2744-1-hjl.tools@gmail.com> References: <20220203180948.2744-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3029.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.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Move PI_STATIC_AND_HIDDEN and SUPPORT_STATIC_PIE to sysdeps/x86/configure.ac. --- sysdeps/i386/configure | 6 ------ sysdeps/i386/configure.ac | 7 ------- sysdeps/x86/configure | 6 ++++++ sysdeps/x86/configure.ac | 7 +++++++ sysdeps/x86_64/configure | 6 ------ sysdeps/x86_64/configure.ac | 7 ------- 6 files changed, 13 insertions(+), 26 deletions(-) diff --git a/sysdeps/i386/configure b/sysdeps/i386/configure index ed46d53314..af50c5bfab 100644 --- a/sysdeps/i386/configure +++ b/sysdeps/i386/configure @@ -83,13 +83,7 @@ $as_echo "$libc_cv_ld_static_pie" >&6; } fi fi -$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h - - if test x"$multi_arch" != xno; then $as_echo "#define NO_HIDDEN_EXTERN_FUNC_IN_PIE 1" >>confdefs.h fi - -$as_echo "#define SUPPORT_STATIC_PIE 1" >>confdefs.h - diff --git a/sysdeps/i386/configure.ac b/sysdeps/i386/configure.ac index a6a0672835..234ef2454a 100644 --- a/sysdeps/i386/configure.ac +++ b/sysdeps/i386/configure.ac @@ -53,15 +53,8 @@ rm -f conftest*]) fi fi -dnl It is always possible to access static and hidden symbols in an -dnl position independent way. -AC_DEFINE(PI_STATIC_AND_HIDDEN) - dnl When multi-arch is enabled, all external functions must be called dnl via PIC PLT in PIE, which requires setting up EBX register. if test x"$multi_arch" != xno; then AC_DEFINE(NO_HIDDEN_EXTERN_FUNC_IN_PIE) fi - -dnl Static PIE is supported. -AC_DEFINE(SUPPORT_STATIC_PIE) diff --git a/sysdeps/x86/configure b/sysdeps/x86/configure index 7bdbfdc6dc..46d436fddf 100644 --- a/sysdeps/x86/configure +++ b/sysdeps/x86/configure @@ -189,3 +189,9 @@ $as_echo "$libc_cv_have_x86_movbe" >&6; } fi config_vars="$config_vars enable-x86-isa-level = $libc_cv_include_x86_isa_level" + +$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h + + +$as_echo "#define SUPPORT_STATIC_PIE 1" >>confdefs.h + diff --git a/sysdeps/x86/configure.ac b/sysdeps/x86/configure.ac index 10d5c2e0e5..918b636891 100644 --- a/sysdeps/x86/configure.ac +++ b/sysdeps/x86/configure.ac @@ -127,3 +127,10 @@ if test $libc_cv_include_x86_isa_level = yes; then fi fi LIBC_CONFIG_VAR([enable-x86-isa-level], [$libc_cv_include_x86_isa_level]) + +dnl It is always possible to access static and hidden symbols in an +dnl position independent way. +AC_DEFINE(PI_STATIC_AND_HIDDEN) + +dnl Static PIE is supported. +AC_DEFINE(SUPPORT_STATIC_PIE) diff --git a/sysdeps/x86_64/configure b/sysdeps/x86_64/configure index d4dd0aa7df..44b6055e55 100755 --- a/sysdeps/x86_64/configure +++ b/sysdeps/x86_64/configure @@ -27,11 +27,5 @@ if test x"$build_mathvec" = xnotset; then build_mathvec=yes fi -$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h - - -$as_echo "#define SUPPORT_STATIC_PIE 1" >>confdefs.h - - test -n "$critic_missing" && as_fn_error $? " *** $critic_missing" "$LINENO" 5 diff --git a/sysdeps/x86_64/configure.ac b/sysdeps/x86_64/configure.ac index c4c748c1d0..1215dcb1e4 100644 --- a/sysdeps/x86_64/configure.ac +++ b/sysdeps/x86_64/configure.ac @@ -14,12 +14,5 @@ if test x"$build_mathvec" = xnotset; then build_mathvec=yes fi -dnl It is always possible to access static and hidden symbols in an -dnl position independent way. -AC_DEFINE(PI_STATIC_AND_HIDDEN) - -dnl Static PIE is supported. -AC_DEFINE(SUPPORT_STATIC_PIE) - test -n "$critic_missing" && AC_MSG_ERROR([ *** $critic_missing]) From patchwork Thu Feb 3 18:09:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 50747 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5E82D385841C for ; Thu, 3 Feb 2022 18:12:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5E82D385841C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1643911943; bh=wdd1C9HheSxFQgcuRfueg4dFxS5IAv6ThAHmV33xaSg=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=Tb2FCOkpQ314cEtdz+ZLV1CQaCNgdkw7l5Ecz5VHCsr6c7t275RiPuXjWg75864B5 GWIGzaYI/JuML1h2wjdciGjSNSptgBDA8exBEPk64czNYSr3Mrvz+9U8l3lNTcuV13 pChrzL/lLYpxQ9QSjkfwnxYs7WVs6q7bhze038JA= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by sourceware.org (Postfix) with ESMTPS id 484113858C20 for ; Thu, 3 Feb 2022 18:09:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 484113858C20 Received: by mail-pl1-x632.google.com with SMTP id k17so2876422plk.0 for ; Thu, 03 Feb 2022 10:09:53 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wdd1C9HheSxFQgcuRfueg4dFxS5IAv6ThAHmV33xaSg=; b=5E6QvVDn4mP1sX8wn6p9vzyZMTcAbc+BuJRYNCSO6t0eCwhnp0dgd1fbFWGtM+FU78 RP6MxxU9/c75pqqmEmUgsiazcmfxEzv7PKOhclaOxBDf9/p0IWQIaCIVMkLNZUDjGfFx EQNeCatL3JlMWv5S+GWZmz2K7Gup3jPiLDTS+0wOuP+Ds3fa5tULYK6uYOf1V96WqbbR 56AlabtA085YmN9RjHVJWtP/dwst33DnX9lTav6EPXirPtUtvd+3T+h5BG8tR0tU6udU 6Rfc06fjIXmRU+Dz0rmggegYTpJrZ2LLFf95/Zm0fPEQtByFieqVoXxl6OYntvg2rVlP ZCCg== X-Gm-Message-State: AOAM531wGgihwq697vLcfx6iZLMLr0Rc7yx7ZT5vHqiWeP+orl6Ie+Kd Kg9Jw8g2/7c8YVnNSNn50zw2hpJbKuo= X-Google-Smtp-Source: ABdhPJyoqDfp8tu6pe9Q01biLVOvSCpPVXqMn0NuANj4+XjKIRbO9bozxLhghTXYDgxmK5OHf7c2AQ== X-Received: by 2002:a17:90a:5503:: with SMTP id b3mr15155680pji.187.1643911792410; Thu, 03 Feb 2022 10:09:52 -0800 (PST) Received: from gnu-tgl-2.localdomain ([172.58.38.240]) by smtp.gmail.com with ESMTPSA id mg17sm11071281pjb.19.2022.02.03.10.09.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Feb 2022 10:09:52 -0800 (PST) Received: from gnu-tgl-2.. (localhost [IPv6:::1]) by gnu-tgl-2.localdomain (Postfix) with ESMTP id E88903004A9; Thu, 3 Feb 2022 10:09:48 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH 5/7] x86: Define SUPPORT_DT_RELR Date: Thu, 3 Feb 2022 10:09:46 -0800 Message-Id: <20220203180948.2744-6-hjl.tools@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220203180948.2744-1-hjl.tools@gmail.com> References: <20220203180948.2744-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3030.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.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Define SUPPORT_DT_RELR to indicate that DT_RELR is supported on x86. --- config.h.in | 3 +++ sysdeps/x86/configure | 3 +++ sysdeps/x86/configure.ac | 3 +++ 3 files changed, 9 insertions(+) diff --git a/config.h.in b/config.h.in index edd167d96e..fbf8138fce 100644 --- a/config.h.in +++ b/config.h.in @@ -280,6 +280,9 @@ /* Define if static PIE is enabled. */ #define ENABLE_STATIC_PIE 0 +/* Define if DT_RELR is supported. */ +#undef SUPPORT_DT_RELR + /* The default value of x86 CET control. */ #define DEFAULT_DL_X86_CET_CONTROL cet_elf_property diff --git a/sysdeps/x86/configure b/sysdeps/x86/configure index 46d436fddf..bf4b041f48 100644 --- a/sysdeps/x86/configure +++ b/sysdeps/x86/configure @@ -195,3 +195,6 @@ $as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h $as_echo "#define SUPPORT_STATIC_PIE 1" >>confdefs.h + +$as_echo "#define SUPPORT_DT_RELR 1" >>confdefs.h + diff --git a/sysdeps/x86/configure.ac b/sysdeps/x86/configure.ac index 918b636891..e737fd156a 100644 --- a/sysdeps/x86/configure.ac +++ b/sysdeps/x86/configure.ac @@ -134,3 +134,6 @@ AC_DEFINE(PI_STATIC_AND_HIDDEN) dnl Static PIE is supported. AC_DEFINE(SUPPORT_STATIC_PIE) + +dnl DT_RELR is supported. +AC_DEFINE(SUPPORT_DT_RELR) From patchwork Thu Feb 3 18:09:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 50750 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B47563858417 for ; Thu, 3 Feb 2022 18:14:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B47563858417 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1643912074; bh=e6WAcCgdinu4cFeePG1y3FFJr0hg1AHtduhZ96RqjxE=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=SYOQAjeIQZSFhhy+LYpsBqL8HWBRPEUuOS8DxqmPxOUQP9eWnrvocgYMVeYb4hjqT X6EasKpUUtufVK9GqwIuXBGbdahgNrcB5sRQPqwyB2Y6x9MHu3TKrglhOQH6F2lS3j Ayvjp7wYZyC/IzrcQuUpvDDPpTppjdAUD5sojOao= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by sourceware.org (Postfix) with ESMTPS id B793D3858D35 for ; Thu, 3 Feb 2022 18:09:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B793D3858D35 Received: by mail-pj1-x1031.google.com with SMTP id v15-20020a17090a4ecf00b001b82db48754so3799260pjl.2 for ; Thu, 03 Feb 2022 10:09:53 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=e6WAcCgdinu4cFeePG1y3FFJr0hg1AHtduhZ96RqjxE=; b=ti/zsQmkRqtyBPRJLZBp6/mZW09vm5/g1Dprcf9Rsb8ayZHPZxY/B5GsKFKpnzO1IK S+k4C63dM7yZ4k5lMJChMu9RaSu3W4U/x9/yXm/AFBP0Py4b3Y3fyzdAmFZL9NtzILrV jf3sbxxptiQPThnVQrqS5QiNfrKGYNgZhbqOFTQWt7fW/DExudQ7rQvekW6cF3BU7qCI Xy5U/7dBve4IGr9q63g9oQfyWN2d3H8rkDJRqQ+9wVx1KR3gl65LOp0gtuF1KncsGfyt DyiukADLxvySHKU22+KdsJJObOpGpmxV0p8I3HeQA32yj/lOFkroocTCmxWVPbaefHli e7rA== X-Gm-Message-State: AOAM532Q9Nrw4W5Si7BX2nzX0kHmG4iuTUGKC4SJYNxDKr8oz8sIIQ84 aAwz9Kqo5r5hMJfjShX/5tAl+QVxdQg= X-Google-Smtp-Source: ABdhPJyhePVFgWk6/e4Blr9nXjlOLP+Jn0oUmniDzmva86rq7yG8Qoi+cRc+jBi7sQC6fvhVU/wYzw== X-Received: by 2002:a17:90a:8401:: with SMTP id j1mr14954425pjn.235.1643911792799; Thu, 03 Feb 2022 10:09:52 -0800 (PST) Received: from gnu-tgl-2.localdomain ([172.58.38.240]) by smtp.gmail.com with ESMTPSA id z13sm31279738pfj.23.2022.02.03.10.09.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Feb 2022 10:09:52 -0800 (PST) Received: from gnu-tgl-2.. (localhost [IPv6:::1]) by gnu-tgl-2.localdomain (Postfix) with ESMTP id 0060D3004AA; Thu, 3 Feb 2022 10:09:49 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH 6/7] Add --disable-default-dt-relr Date: Thu, 3 Feb 2022 10:09:47 -0800 Message-Id: <20220203180948.2744-7-hjl.tools@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220203180948.2744-1-hjl.tools@gmail.com> References: <20220203180948.2744-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3029.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.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Enable DT_RELR in glibc shared libraries and position independent executables (PIE) automatically if linker supports -z pack-relative-relocs and the architecture defines SUPPORT_DT_RELR in config.h. At the moment, only x86 targets define SUPPORT_DT_RELR. Also add a new configuration option, --disable-default-dt-relr, to avoid DT_RELR usage in glibc shared libraries and PIEs. --- INSTALL | 6 ++++++ Makeconfig | 19 +++++++++++++++++++ Makerules | 2 ++ configure | 38 ++++++++++++++++++++++++++++++++++++++ configure.ac | 23 +++++++++++++++++++++++ elf/Makefile | 4 +++- manual/install.texi | 5 +++++ 7 files changed, 96 insertions(+), 1 deletion(-) diff --git a/INSTALL b/INSTALL index 63c022d6b9..4a6506f11f 100644 --- a/INSTALL +++ b/INSTALL @@ -133,6 +133,12 @@ if 'CFLAGS' is specified it must enable optimization. For example: used with the GCC option, -static-pie, which is available with GCC 8 or above, to create static PIE. +'--disable-default-dt-relr' + Don't enable DT_RELR in glibc shared libraries and position + independent executables (PIE). By default, DT_RELR is enabled in + glibc shared libraries and position independent executables on + targets that support it. + '--enable-cet' '--enable-cet=permissive' Enable Intel Control-flow Enforcement Technology (CET) support. diff --git a/Makeconfig b/Makeconfig index 47db08d6ae..70c0acc065 100644 --- a/Makeconfig +++ b/Makeconfig @@ -358,6 +358,23 @@ else real-static-start-installed-name = $(static-start-installed-name) endif +# Linker option to enable and disable DT-RELR. +ifeq ($(have-dt-relr),yes) +dt-relr-ldflag = -Wl,-z,pack-relative-relocs +no-dt-relr-ldflag = -Wl,-z,nopack-relative-relocs +else +dt-relr-ldflag = +no-dt-relr-ldflag = +endif + +# Default linker option for DT-RELR. +ifeq (yes,$(build-dt-relr-default)) +default-rt-relr-ldflag = $(dt-relr-ldflag) +else +default-rt-relr-ldflag = $(no-dt-relr-ldflag) +endif +LDFLAGS-rtld += $(default-rt-relr-ldflag) + ifeq (yesyes,$(build-shared)$(have-z-combreloc)) combreloc-LDFLAGS = -Wl,-z,combreloc LDFLAGS.so += $(combreloc-LDFLAGS) @@ -419,6 +436,7 @@ link-extra-libs-tests = $(libsupport) # Command for linking PIE programs with the C library. ifndef +link-pie +link-pie-before-inputs = $(if $($(@F)-no-pie),$(no-pie-ldflag),-pie) \ + $(if $($(@F)-no-dt-relr),$(no-dt-relr-ldflag),$(default-rt-relr-ldflag)) \ -Wl,-O1 -nostdlib -nostartfiles \ $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \ $(combreloc-LDFLAGS) $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \ @@ -451,6 +469,7 @@ endif ifndef +link-static +link-static-before-inputs = -nostdlib -nostartfiles -static \ $(if $($(@F)-no-pie),$(no-pie-ldflag),$(static-pie-ldflag)) \ + $(if $($(@F)-no-dt-relr),$(no-dt-relr-ldflag),$(default-rt-relr-ldflag)) \ $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \ $(firstword $(CRT-$(@F)) $(csu-objpfx)$(real-static-start-installed-name)) \ $(+preinit) $(+prectorT) diff --git a/Makerules b/Makerules index 5de2cec6be..260c7b7253 100644 --- a/Makerules +++ b/Makerules @@ -536,6 +536,7 @@ lib%.so: lib%_pic.a $(+preinit) $(+postinit) $(link-libc-deps) define build-shlib-helper $(LINK.o) -shared -static-libgcc -Wl,-O1 $(sysdep-LDFLAGS) \ $(if $($(@F)-no-z-defs)$(no-z-defs),,-Wl,-z,defs) $(rtld-LDFLAGS) \ + $(if $($(@F)-no-dt-relr),$(no-dt-relr-ldflag),$(default-rt-relr-ldflag)) \ $(extra-B-$(@F:lib%.so=%).so) -B$(csu-objpfx) \ $(extra-B-$(@F:lib%.so=%).so) $(load-map-file) \ -Wl,-soname=lib$(libprefix)$(@F:lib%.so=%).so$($(@F)-version) \ @@ -595,6 +596,7 @@ endef define build-module-helper $(LINK.o) -shared -static-libgcc $(sysdep-LDFLAGS) $(rtld-LDFLAGS) \ $(if $($(@F)-no-z-defs)$(no-z-defs),,-Wl,-z,defs) \ + $(if $($(@F)-no-dt-relr),$(no-dt-relr-ldflag),$(default-rt-relr-ldflag)) \ -B$(csu-objpfx) $(load-map-file) \ $(LDFLAGS.so) $(LDFLAGS-$(@F:%.so=%).so) \ $(link-test-modules-rpath-link) \ diff --git a/configure b/configure index a9bdcb4ee5..e2d09ae84a 100755 --- a/configure +++ b/configure @@ -768,6 +768,7 @@ enable_sanity_checks enable_shared enable_profile enable_default_pie +enable_default_dt_relr enable_timezone_tools enable_hardcoded_path_in_tests enable_hidden_plt @@ -1425,6 +1426,7 @@ Optional Features: --enable-profile build profiled library [default=no] --disable-default-pie Do not build glibc programs and the testsuite as PIE [default=no] + --disable-dt-relr Do not enable DT_RELR in glibc[default=no] --disable-timezone-tools do not install timezone tools [default=install] --enable-hardcoded-path-in-tests @@ -3441,6 +3443,13 @@ else default_pie=yes fi +# Check whether --enable-default-dt-relr was given. +if test "${enable_default_dt_relr+set}" = set; then : + enableval=$enable_default_dt_relr; default_dt_relr=$enableval +else + default_dt_relr=yes +fi + # Check whether --enable-timezone-tools was given. if test "${enable_timezone_tools+set}" = set; then : enableval=$enable_timezone_tools; enable_timezone_tools=$enableval @@ -7140,6 +7149,35 @@ fi config_vars="$config_vars enable-static-pie = $libc_cv_static_pie" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can enable DT_RELR" >&5 +$as_echo_n "checking if we can enable DT_RELR... " >&6; } +libc_cv_dt_relr_supported=$libc_cv_dt_relr +if test "x$libc_cv_dt_relr_supported" != xno; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef SUPPORT_DT_RELR +# error DT_RELR is not supported +#endif +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + libc_cv_dt_relr_supported=yes +else + libc_cv_dt_relr_supported=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_dt_relr_supported" >&5 +$as_echo "$libc_cv_dt_relr_supported" >&6; } + +# Disable build-dt-relr-default if target does not support it or glibc is +# configured with --disable-default-dt-relr. +build_dt_relr_default=$default_dt_relr +if test "x$build_dt_relr_default" != xno; then + build_dt_relr_default=$libc_cv_dt_relr_supported +fi +config_vars="$config_vars +build-dt-relr-default = $build_dt_relr_default" + # Set the `multidir' variable by grabbing the variable from the compiler. # We do it once and save the result in a generated makefile. libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory` diff --git a/configure.ac b/configure.ac index 36a647cc14..e572e99c41 100644 --- a/configure.ac +++ b/configure.ac @@ -197,6 +197,11 @@ AC_ARG_ENABLE([default-pie], [Do not build glibc programs and the testsuite as PIE @<:@default=no@:>@]), [default_pie=$enableval], [default_pie=yes]) +AC_ARG_ENABLE([default-dt-relr], + AS_HELP_STRING([--disable-dt-relr], + [Do not enable DT_RELR in glibc@<:@default=no@:>@]), + [default_dt_relr=$enableval], + [default_dt_relr=yes]) AC_ARG_ENABLE([timezone-tools], AS_HELP_STRING([--disable-timezone-tools], [do not install timezone tools @<:@default=install@:>@]), @@ -1915,6 +1920,24 @@ if test "$libc_cv_static_pie" = "yes"; then fi LIBC_CONFIG_VAR([enable-static-pie], [$libc_cv_static_pie]) +AC_MSG_CHECKING(if we can enable DT_RELR) +libc_cv_dt_relr_supported=$libc_cv_dt_relr +if test "x$libc_cv_dt_relr_supported" != xno; then + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#ifndef SUPPORT_DT_RELR +# error DT_RELR is not supported +#endif]])], [libc_cv_dt_relr_supported=yes], + [libc_cv_dt_relr_supported=no]) +fi +AC_MSG_RESULT($libc_cv_dt_relr_supported) + +# Disable build-dt-relr-default if target does not support it or glibc is +# configured with --disable-default-dt-relr. +build_dt_relr_default=$default_dt_relr +if test "x$build_dt_relr_default" != xno; then + build_dt_relr_default=$libc_cv_dt_relr_supported +fi +LIBC_CONFIG_VAR([build-dt-relr-default], [$build_dt_relr_default]) + # Set the `multidir' variable by grabbing the variable from the compiler. # We do it once and save the result in a generated makefile. libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory` diff --git a/elf/Makefile b/elf/Makefile index c697e7b7ee..9f807cd650 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -1570,6 +1570,7 @@ $(objpfx)nodlopen2.out: $(objpfx)nodlopenmod2.so $(objpfx)filtmod1.so: $(objpfx)filtmod1.os $(objpfx)filtmod2.so $(LINK.o) -shared -o $@ -B$(csu-objpfx) $(LDFLAGS.so) \ + $(default-rt-relr-ldflag) \ -L$(subst :, -L,$(rpath-link)) \ -Wl,-rpath-link=$(rpath-link) \ $< -Wl,-F,$(objpfx)filtmod2.so @@ -2376,7 +2377,7 @@ $(objpfx)tst-big-note: $(objpfx)tst-big-note-lib.so # artificial, large note in tst-big-note-lib.o and invalidate the # test. $(objpfx)tst-big-note-lib.so: $(objpfx)tst-big-note-lib.o - $(LINK.o) -shared -o $@ $(LDFLAGS.so) $< + $(LINK.o) -shared -o $@ $(LDFLAGS.so) $(default-rt-relr-ldflag) $< $(objpfx)tst-unwind-ctor: $(objpfx)tst-unwind-ctor-lib.so @@ -2682,6 +2683,7 @@ $(objpfx)tst-ro-dynamic: $(objpfx)tst-ro-dynamic-mod.so $(objpfx)tst-ro-dynamic-mod.so: $(objpfx)tst-ro-dynamic-mod.os \ tst-ro-dynamic-mod.map $(LINK.o) -nostdlib -nostartfiles -shared -o $@ \ + $(default-rt-relr-ldflag) \ -Wl,--script=tst-ro-dynamic-mod.map \ $(objpfx)tst-ro-dynamic-mod.os diff --git a/manual/install.texi b/manual/install.texi index 29c52f2927..04ea996561 100644 --- a/manual/install.texi +++ b/manual/install.texi @@ -161,6 +161,11 @@ and architecture support it, static executables are built as static PIE and the resulting glibc can be used with the GCC option, -static-pie, which is available with GCC 8 or above, to create static PIE. +@item --disable-default-dt-relr +Don't enable DT_RELR in glibc shared libraries and position independent +executables (PIE). By default, DT_RELR is enabled in glibc shared +libraries and position independent executables on targets that support it. + @item --enable-cet @itemx --enable-cet=permissive Enable Intel Control-flow Enforcement Technology (CET) support. When From patchwork Thu Feb 3 18:09:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 50751 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B4FD93858425 for ; Thu, 3 Feb 2022 18:15:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B4FD93858425 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1643912116; bh=EeYj42BphrhYhG0niiqjbCokGYIuiSeZWct4B0JLBTE=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=JMHyfHmQj0p0G/6tPfAo2U+QEL9U2fQXGVJrX30uE+TNRIow/4+70Q8HtfZ+frodR WcnRPMGh5prOqMB7qxL/7B/3M60ciJxfxvwjrcyKvWVZme2XyzW+vOTs5cF/5ae+lD /pP7PQdkOPdhdmvEZgH/rO0l88zg0Vxlyzhl7mk8= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by sourceware.org (Postfix) with ESMTPS id 0573E3858402 for ; Thu, 3 Feb 2022 18:09:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0573E3858402 Received: by mail-pj1-x1031.google.com with SMTP id z14-20020a17090ab10e00b001b6175d4040so10835644pjq.0 for ; Thu, 03 Feb 2022 10:09:54 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=EeYj42BphrhYhG0niiqjbCokGYIuiSeZWct4B0JLBTE=; b=A90LmR0DTzWmzYF4aVsn1dmUt+UtjXhdFnL7w+/k3DE4JLFqEFIvRhBPmDzs4Lmev/ bixqPfemJJJb5i+LP1KafvS+8yMZPw5patrfjxgG9FjreHF0L36PtuyuhpgsZhPgG4BC /aDOkt9U8JNOx8aUDWIaJasz1FV5BrVOxKszLGlu/n8ifdckGzykNtJfkSiONiGniyrV 4u6Ov56YFxTQIjCG73DwB3fvuPqU4eyf1+rk0lfDw8MGNZFS0W/2JBU7GqqW3Dpai6vj eOlap5DQZ5tAROKjWck+sB4I4ZU02Fo44fTYShyXawgk4jNFLrZeEn/XVyVh/gTFbsTU DASA== X-Gm-Message-State: AOAM5313fDEnuBq/azyoxhxrtKQnmOLSF1EJcTvjjZqGtaSwUy84G5j3 xHzeemTVJW3wWKe16iBQWOdx/iEsMrM= X-Google-Smtp-Source: ABdhPJyFZChyQZuRzsNRDIH9OTestdO0KatkslI2jQ1sHpkQMrFzSITRRbNuxWyX/IOwbKuADblKag== X-Received: by 2002:a17:90a:9a7:: with SMTP id 36mr15048169pjo.154.1643911794125; Thu, 03 Feb 2022 10:09:54 -0800 (PST) Received: from gnu-tgl-2.localdomain ([172.58.38.240]) by smtp.gmail.com with ESMTPSA id k15sm30092210pff.39.2022.02.03.10.09.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Feb 2022 10:09:52 -0800 (PST) Received: from gnu-tgl-2.. (localhost [IPv6:::1]) by gnu-tgl-2.localdomain (Postfix) with ESMTP id 0C0053004AC; Thu, 3 Feb 2022 10:09:49 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH 7/7] NEWS: Mention DT_RELR support Date: Thu, 3 Feb 2022 10:09:48 -0800 Message-Id: <20220203180948.2744-8-hjl.tools@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220203180948.2744-1-hjl.tools@gmail.com> References: <20220203180948.2744-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3029.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.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- NEWS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS b/NEWS index 7b8febcb72..31ace26ca3 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,11 @@ See the end for copying conditions. Please send GNU C library bug reports via using `glibc' in the "product" field. + +Major new features: + +* Support DT_RELR relative relocation format. + Version 2.36