From patchwork Fri Apr 22 19:01:33 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: 1621130 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=ks3BjSMO; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KlP0R6mf1z9s07 for ; Sat, 23 Apr 2022 05:01:59 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 75B933856DD5 for ; Fri, 22 Apr 2022 19:01:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 75B933856DD5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650654117; bh=E4Fas5l64BnRB7Mn/oByyxRmxGOTmP9qyPpS0RiKqQA=; 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=ks3BjSMORvn80LJaqcmcPIWM2Xtjg/dR0b+8pLoqQjRu+81M4PuCxwAwFnIYfdBiQ hU/huNATWG5AMxg9n2S03801HPk5gypoaNqQtK7FasL7rbdXHEyZyWdYgiovB+wQJ7 fW8ViP91hxdMXX8dARRs+V7u3SUVfFQ2aVg9++h8= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pl1-x62a.google.com (mail-pl1-x62a.google.com [IPv6:2607:f8b0:4864:20::62a]) by sourceware.org (Postfix) with ESMTPS id 3F32D3858C51 for ; Fri, 22 Apr 2022 19:01:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3F32D3858C51 Received: by mail-pl1-x62a.google.com with SMTP id d15so12800444pll.10 for ; Fri, 22 Apr 2022 12:01:42 -0700 (PDT) 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=E4Fas5l64BnRB7Mn/oByyxRmxGOTmP9qyPpS0RiKqQA=; b=QtcTow4tegTyKBww9T3fbbP7Cn6NdshX7MjyFJYCMWpd4xKtk+24SKNEVofevWB2+A +7dAMwprW7LBo22HEHkBJqQ73qkUQOx6HfGOT1hS7hY4/CwWUg9dLn9cLN70rebKp5J8 PWu3EZMiWdMW28Il9xEhQ9kJ9aTD7kX6wBG58j+mhYoD9SyFyRlDCP0rgL18IKnzvV7h yCH0dOtfdeEj6es4j8kdrpcpXg92xor62eepEil5i13hyNWQuZKMxRz8/yw1cluYjx4w 3jgSYZy/TkP0nnlwQeqx/NJ4fYyKtTokQaWOBvni3LzLRkVvtMrSKnA/Q62aYE0RlX+c HxqQ== X-Gm-Message-State: AOAM531NZIgJ0sM+UToFOmHEbD8ThsWdfI+iJgVaqs6xl0NoGYy8RuCk OxSFn0MxqhmRfINis/s4oa3nqZgS2nA= X-Google-Smtp-Source: ABdhPJxc304yHLh9jgIQ01gk1pzQ1BzY7IReD/K27vRHqd5nfSTRu2izf+HQ/Nv77XAYwySXMXc5gg== X-Received: by 2002:a17:902:daca:b0:15c:e27e:ec12 with SMTP id q10-20020a170902daca00b0015ce27eec12mr398512plx.73.1650654101325; Fri, 22 Apr 2022 12:01:41 -0700 (PDT) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id f16-20020aa78b10000000b0050a81508653sm3305622pfd.198.2022.04.22.12.01.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Apr 2022 12:01:40 -0700 (PDT) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 61722C0287; Fri, 22 Apr 2022 12:01:39 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH v11 1/7] elf: Define DT_RELR related macros and types Date: Fri, 22 Apr 2022 12:01:33 -0700 Message-Id: <20220422190139.2615492-2-hjl.tools@gmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220422190139.2615492-1-hjl.tools@gmail.com> References: <20220422190139.2615492-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3027.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP 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+incoming=patchwork.ozlabs.org@sourceware.org Sender: "Libc-alpha" --- elf/elf.h | 13 +++++++++++-- scripts/glibcelf.py | 4 ++++ 2 files changed, 15 insertions(+), 2 deletions(-) Reviewed-by: Fangrui Song 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/scripts/glibcelf.py b/scripts/glibcelf.py index 8f7d0ca184..637f632038 100644 --- a/scripts/glibcelf.py +++ b/scripts/glibcelf.py @@ -298,6 +298,7 @@ class Sht(_OpenIntEnum): SHT_PREINIT_ARRAY = 16 SHT_GROUP = 17 SHT_SYMTAB_SHNDX = 18 + SHT_RELR = 19 SHT_GNU_ATTRIBUTES = 0x6ffffff5 SHT_GNU_HASH = 0x6ffffff6 SHT_GNU_LIBLIST = 0x6ffffff7 @@ -587,6 +588,9 @@ class Dt(_OpenIntEnum): DT_PREINIT_ARRAY = 32 DT_PREINIT_ARRAYSZ = 33 DT_SYMTAB_SHNDX = 34 + DT_RELRSZ = 35 + DT_RELR = 36 + DT_RELRENT = 37 DT_GNU_PRELINKED = 0x6ffffdf5 DT_GNU_CONFLICTSZ = 0x6ffffdf6 DT_GNU_LIBLISTSZ = 0x6ffffdf7 From patchwork Fri Apr 22 19:01:34 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: 1621132 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=nmVfb7u2; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KlP1F3GlYz9s07 for ; Sat, 23 Apr 2022 05:02:41 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 34BCB3858C2C for ; Fri, 22 Apr 2022 19:02:39 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 34BCB3858C2C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650654159; bh=lmNriViuo+43B624oWazAuWQ7bBqdEIrJjEjHgym9xk=; 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=nmVfb7u2QcW3ROJRIsRbklSnSgyDSdtujYic2wtPtt+azbgKkRFU3DF8zFlby1pdR 31ErTETleXauEtF2Yd6bEHBp1DuNh10WbBEbRaPw/gOMR56lonwbjNAVzwmnMnX9oi pxrwjn4OIsDi45l+qjDMyQsRQP5dsQyFB3YLBAF4= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pl1-x62e.google.com (mail-pl1-x62e.google.com [IPv6:2607:f8b0:4864:20::62e]) by sourceware.org (Postfix) with ESMTPS id D2B2E3858C2C for ; Fri, 22 Apr 2022 19:01:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D2B2E3858C2C Received: by mail-pl1-x62e.google.com with SMTP id b7so12814033plh.2 for ; Fri, 22 Apr 2022 12:01:42 -0700 (PDT) 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=lmNriViuo+43B624oWazAuWQ7bBqdEIrJjEjHgym9xk=; b=jUfIPlaX77gdnu0roHn5UNRCcLf3S4uuEPNpR5o0VJWX0TE0oA0eE6QF6VzMV4eeRk gDyQBXaY3cGVVVt+Yo1RZLbNL3W5zOF2QCbOGAdmgixRI+KvdX4dcZW/vsuUap9u9Pri /GKR6pdJXCJBH2mONTj4GGg98zoy+V/xPoqS5wuv9n7vzMeA4LKczctcrjYotK9WIOQa HpAjG2Y1jA4t+500RQBdp+JXF63rcgzMJFNo70B4CZBr+SWmmyIw2k6aJo+id1Dbgnd8 sjzGbHhsVSx/ZagrWlFLcVoszPSztez75Nps9lJXAkIjjn3HvgyIG0eOY6wEcWP7vmym jiSA== X-Gm-Message-State: AOAM531WZ3fUVcgUvDygqw53uGm7+DPyIdsGuRjjYShethDkPHv8gxXj 9fdWimoBBwBtsBXr1da9Qy4= X-Google-Smtp-Source: ABdhPJxbW/1Bh6Z9GHL7z3dB/l+JJXGJ7N4yNGG11UJY0tKMU++oBgCNYK0LJxbEajwjgWqtENeUEQ== X-Received: by 2002:a17:902:d50c:b0:159:3fa:266 with SMTP id b12-20020a170902d50c00b0015903fa0266mr6046272plg.132.1650654101732; Fri, 22 Apr 2022 12:01:41 -0700 (PDT) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id i1-20020a17090a650100b001cd8e9ea22asm6697649pjj.52.2022.04.22.12.01.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Apr 2022 12:01:40 -0700 (PDT) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 6D3BBC02A4; Fri, 22 Apr 2022 12:01:39 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH v11 2/7] Add GLIBC_ABI_DT_RELR for DT_RELR support Date: Fri, 22 Apr 2022 12:01:34 -0700 Message-Id: <20220422190139.2615492-3-hjl.tools@gmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220422190139.2615492-1-hjl.tools@gmail.com> References: <20220422190139.2615492-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3026.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, 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+incoming=patchwork.ozlabs.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 dependency. When there is a DT_VERNEED entry with libc.so on DT_NEEDED, issue an error if there is a DT_RELR entry without GLIBC_ABI_DT_RELR dependency. 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. Reviewed-by: Fangrui Song --- elf/Makefile | 14 ++++++++++++-- elf/Versions | 5 +++++ elf/dl-version.c | 35 +++++++++++++++++++++++++++++++++-- include/link.h | 2 ++ scripts/abilist.awk | 2 ++ scripts/versions.awk | 7 ++++++- 6 files changed, 60 insertions(+), 5 deletions(-) diff --git a/elf/Makefile b/elf/Makefile index 8ed6c3b0b1..f288f866f2 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -1143,8 +1143,12 @@ $(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 \ + $(objpfx)check-abi-version-libc.out +tests-special += \ + $(objpfx)check-abi-ld.out \ + $(objpfx)check-abi-version-libc.out \ +# tests-special update-abi: update-abi-ld update-all-abi: update-all-abi-ld @@ -2773,3 +2777,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-abi-version-libc.out: $(common-objpfx)libc.so + LC_ALL=C $(READELF) -V -W $< \ + | sed -ne '/.gnu.version_d/, /.gnu.version_r/ p' \ + | grep GLIBC_ABI_DT_RELR > $@; \ + $(evaluate-test) diff --git a/elf/Versions b/elf/Versions index 8bed855d8c..a9ff278de7 100644 --- a/elf/Versions +++ b/elf/Versions @@ -23,6 +23,11 @@ libc { GLIBC_2.35 { _dl_find_object; } + 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; + } GLIBC_PRIVATE { # functions used in other libraries __libc_early_init; diff --git a/elf/dl-version.c b/elf/dl-version.c index b47bd91727..cda0889209 100644 --- a/elf/dl-version.c +++ b/elf/dl-version.c @@ -214,12 +214,19 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode) while (1) { /* Match the symbol. */ + const char *string = strtab + aux->vna_name; result |= match_symbol (DSO_FILENAME (map->l_name), map->l_ns, aux->vna_hash, - strtab + aux->vna_name, - needed->l_real, verbose, + string, needed->l_real, verbose, aux->vna_flags & VER_FLG_WEAK); + /* 0xfd0e42: _dl_elf_hash ("GLIBC_ABI_DT_RELR"). */ + if (aux->vna_hash == 0xfd0e42 + && __glibc_likely (strcmp (string, + "GLIBC_ABI_DT_RELR") + == 0)) + map->l_dt_relr_ref = 1; + /* Compare the version index. */ if ((unsigned int) (aux->vna_other & 0x7fff) > ndx_high) ndx_high = aux->vna_other & 0x7fff; @@ -352,6 +359,30 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode) } } + /* When there is a DT_VERNEED entry with libc.so on DT_NEEDED, issue + an error if there is a DT_RELR entry without GLIBC_ABI_DT_RELR + dependency. */ + if (dyn != NULL + && map->l_info[DT_NEEDED] != NULL + && map->l_info[DT_RELR] != NULL + && __glibc_unlikely (!map->l_dt_relr_ref)) + { + const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]); + const ElfW(Dyn) *d; + for (d = map->l_ld; d->d_tag != DT_NULL; ++d) + if (d->d_tag == DT_NEEDED) + { + const char *name = strtab + d->d_un.d_val; + if (strncmp (name, "libc.so.", 8) == 0) + { + _dl_exception_create + (&exception, DSO_FILENAME (map->l_name), + N_("DT_RELR without GLIBC_ABI_DT_RELR dependency")); + goto call_error; + } + } + } + return result; } diff --git a/include/link.h b/include/link.h index 03db14c7b0..0ac82d7c77 100644 --- a/include/link.h +++ b/include/link.h @@ -177,6 +177,8 @@ struct link_map lt_library, /* Library needed by main executable. */ lt_loaded /* Extra run-time loaded shared object. */ } l_type:2; + unsigned int l_dt_relr_ref:1; /* Nonzero if GLIBC_ABI_DT_RELR is + referenced. */ unsigned int l_relocated:1; /* Nonzero if object's relocations done. */ unsigned int l_init_called:1; /* Nonzero if DT_INIT function called. */ unsigned int l_global:1; /* Nonzero if object in _dl_global_scope. */ 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 Fri Apr 22 19:01:35 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: 1621145 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=xV5EZ35U; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KlP5T0YlPz9s07 for ; Sat, 23 Apr 2022 05:06:20 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A24733856DFF for ; Fri, 22 Apr 2022 19:06:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A24733856DFF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650654378; bh=bsfyoR2FdM1Ngjegr2oZ9BVFO3f5OBRhwMyug701hO0=; 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=xV5EZ35U96prsHZs2J3SDbbymNKpJDGQKEb4dhcEjvWBzaCxMkkPGWlihtdsHXq0J tV2/4Ku/yb45gbby2OZOsQOgrNPY5wQKNMjmD7s4ug1ZFaNa3o10U2YPZDPiMStzfm MXA4Aul4GjLWRPt4aer1ghbsGJs4dXWfzuqzNnak= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pl1-x633.google.com (mail-pl1-x633.google.com [IPv6:2607:f8b0:4864:20::633]) by sourceware.org (Postfix) with ESMTPS id 2DCD43858C83 for ; Fri, 22 Apr 2022 19:01:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2DCD43858C83 Received: by mail-pl1-x633.google.com with SMTP id c12so12812230plr.6 for ; Fri, 22 Apr 2022 12:01:45 -0700 (PDT) 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=bsfyoR2FdM1Ngjegr2oZ9BVFO3f5OBRhwMyug701hO0=; b=z+2UMDNFNNG7wT0ef8jkxcJpBM/rYJkl3WT1TctGm1KnpMn1Ah3GJBaPkN+7FonFlR 8thPzlEuC95r7JQu6wNEJR56/J4De1dksG8Q9273XPHrwHiwEDQKgvGUDiVZD4BtdTr+ SxXmBwWgzvDzRyHnc42hFJx99rLHlNwuJua/6QzfNWgm4DpfCz5ggFeEEPJQLmGEYrsL NWkX/Ees+AmoZ8BoSZHspDDsgnJOFmesGog/TBQKnEEeH0UsM9cP0K4jlE5jxg6y1CQn N7pz6vuN2W08vYzvCjquBQ46lq0UTZLnPTrROZFFreNgt5u8RInmG5gOOMcJEUDrwUNM 8hxQ== X-Gm-Message-State: AOAM5322qO22nSFV0LRdcysBeMpU9Sg6NoB63lBJyNK6b4bBZgjLFhmK ExoTN+60VJ2ZLJuvtcySPoM= X-Google-Smtp-Source: ABdhPJyjvTEAtAn5KBzsRbhSYgI6YWj2UPrhzxaOoXTwAFlZzdbDr50Z2o5sC5DOMGHMRAN67dKQFg== X-Received: by 2002:a17:90a:5991:b0:1d9:27f3:74cc with SMTP id l17-20020a17090a599100b001d927f374ccmr247809pji.90.1650654104075; Fri, 22 Apr 2022 12:01:44 -0700 (PDT) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id k22-20020aa790d6000000b0050a765d5d48sm3327574pfk.160.2022.04.22.12.01.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Apr 2022 12:01:42 -0700 (PDT) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 5C916C0262; Fri, 22 Apr 2022 12:01:41 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH v11 3/7] elf: Support DT_RELR relative relocation format [BZ #27924] Date: Fri, 22 Apr 2022 12:01:35 -0700 Message-Id: <20220422190139.2615492-4-hjl.tools@gmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220422190139.2615492-1-hjl.tools@gmail.com> References: <20220422190139.2615492-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3026.3 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_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, 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+incoming=patchwork.ozlabs.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. Change make variale to have-dt-relr. 3. Rename tst-relr-no-pie to tst-relr-pie for --disable-default-pie. 4. Use TEST_VERIFY in tst-relr.c. 5. Add the check-tst-relr-pie.out test to check for linker generated libc.so version dependency on GLIBC_ABI_DT_RELR. 6. Move ELF_DYNAMIC_DO_RELR before ELF_DYNAMIC_DO_REL. --- configure | 37 ++++++++++++++++++++++++ configure.ac | 5 ++++ elf/Makefile | 25 ++++++++++++++++ elf/dynamic-link.h | 34 ++++++++++++++++++++++ elf/get-dynamic-info.h | 3 ++ elf/tst-relr-pie.c | 1 + elf/tst-relr.c | 65 ++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 170 insertions(+) create mode 100644 elf/tst-relr-pie.c create mode 100644 elf/tst-relr.c diff --git a/configure b/configure index 650bfd982c..5a730dc5fc 100755 --- a/configure +++ b/configure @@ -6076,6 +6076,43 @@ $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" + { $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 605efd549d..a045f6608e 100644 --- a/configure.ac +++ b/configure.ac @@ -1336,6 +1336,11 @@ 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]) + 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 f288f866f2..60e41035d7 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -541,6 +541,25 @@ tests-special += \ # tests-special endif endif +ifeq ($(have-dt-relr),yes) +tests += \ + tst-relr \ +# tests +ifeq ($(have-fpie),yes) +tests += \ + tst-relr-pie \ +# tests +tests-pie += \ + tst-relr-pie \ +# tests-pie +tests-special += \ + $(objpfx)check-tst-relr-pie.out \ +# tests-special +endif +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 tests-special += $(objpfx)tst-relro-ldso.out $(objpfx)tst-relro-libc.out @@ -2783,3 +2802,9 @@ $(objpfx)check-abi-version-libc.out: $(common-objpfx)libc.so | sed -ne '/.gnu.version_d/, /.gnu.version_r/ p' \ | grep GLIBC_ABI_DT_RELR > $@; \ $(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..019088f248 100644 --- a/elf/dynamic-link.h +++ b/elf/dynamic-link.h @@ -146,12 +146,46 @@ 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] == NULL) \ + 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 int 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)); \ + if (((map) != &GL(dl_rtld_map) || DO_RTLD_BOOTSTRAP)) \ + ELF_DYNAMIC_DO_RELR (map); \ ELF_DYNAMIC_DO_REL ((map), (scope), edr_lazy, skip_ifunc); \ ELF_DYNAMIC_DO_RELA ((map), (scope), edr_lazy, skip_ifunc); \ } while (0) 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..c634ce0d21 --- /dev/null +++ b/elf/tst-relr.c @@ -0,0 +1,65 @@ +/* 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 +#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 < array_length (arr); 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 Fri Apr 22 19:01:36 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: 1621140 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=NZnQqokA; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KlP3l4rTGz9s07 for ; Sat, 23 Apr 2022 05:04:51 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A97893856DFC for ; Fri, 22 Apr 2022 19:04:49 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A97893856DFC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650654289; bh=h4FvO3F1pWd/GHcDZuXhDOzLzIHXFFaIuFl819ej2DM=; 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=NZnQqokAZaXjLFxOcwbz13KGJ9/W7yz891LqWQQWhtotnYKCi7PDT3KETpMOeZULH Zd1Ozgq3K2qcd/hoGahYUyLAHNz5wusXluzP7vzbAnibmglH6lIGhvgJVPsC+eQOox GVDWIh8PFc+90V407cUzNOJiX18Y0JKcLSyQa+aE= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pl1-x62f.google.com (mail-pl1-x62f.google.com [IPv6:2607:f8b0:4864:20::62f]) by sourceware.org (Postfix) with ESMTPS id B4596385842B for ; Fri, 22 Apr 2022 19:01:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B4596385842B Received: by mail-pl1-x62f.google.com with SMTP id d15so12800716pll.10 for ; Fri, 22 Apr 2022 12:01:44 -0700 (PDT) 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=h4FvO3F1pWd/GHcDZuXhDOzLzIHXFFaIuFl819ej2DM=; b=Y4UN+Lz0KHx2/JdvPRsKGPIDVAm0nNSAjwtjlBmr9sfeL8FfSCtI76PVxy832xX5yP OAz5PU3+wzA0SvKLbcAKCRICMeOreN7NqzXXiLNVTWywKhv8vJf126GocZD2NN/pU7yH jqjItatXbLSRz1Ds4m2g1eXoRP+3hkqjCN+mUrTiL5q8jl0Z3fwv4fvNkWvT9NbNWEK/ LQMoWRQxb7rRDn9DB6xj1zG7CBKFq9TkcugqO+FjfaUf4EZgSNv2CGF1fIgI+W0N1hxs fVvyWA1LEzaqP4XQo1MPXI8uYifCwm8DYW+9N1ME7CN6qdEZPF7LTSYzHqsUjx5Y0uWP bUuQ== X-Gm-Message-State: AOAM533qKJjOZt0pHbvJ3PmHClp0ceTPytRmnP66a3IXgQntgp0ZH8u2 25wVO81R9vQuSsI7ctM0QDo= X-Google-Smtp-Source: ABdhPJzFysuhzarM+dN4qH0pQu2bKwNCs4BvyMxuZ/gZfi7zMuV+gZj9qNBiVeWI3/bdiuqRpcHbhQ== X-Received: by 2002:a17:90b:3b4f:b0:1d2:7117:d758 with SMTP id ot15-20020a17090b3b4f00b001d27117d758mr17757826pjb.105.1650654103731; Fri, 22 Apr 2022 12:01:43 -0700 (PDT) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id l2-20020a056a0016c200b004f7e3181a41sm3428696pfc.98.2022.04.22.12.01.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Apr 2022 12:01:42 -0700 (PDT) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 699C7C02EA; Fri, 22 Apr 2022 12:01:41 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH v11 4/7] elf: Properly handle zero DT_RELA/DT_REL values Date: Fri, 22 Apr 2022 12:01:36 -0700 Message-Id: <20220422190139.2615492-5-hjl.tools@gmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220422190139.2615492-1-hjl.tools@gmail.com> References: <20220422190139.2615492-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3027.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP 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+incoming=patchwork.ozlabs.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. Reviewed-by: Fangrui Song --- elf/dynamic-link.h | 6 +++++- elf/get-dynamic-info.h | 24 ++++++++++++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h index 019088f248..debbb8c9f7 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] != NULL \ + && (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..0314baf020 100644 --- a/elf/get-dynamic-info.h +++ b/elf/get-dynamic-info.h @@ -75,24 +75,36 @@ elf_get_dynamic_info (struct link_map *l, bool bootstrap, # define ADJUST_DYN_INFO(tag) \ do \ - if (info[tag] != NULL) \ - info[tag]->d_un.d_ptr += l_addr; \ + { \ + if (info[tag] != NULL) \ + info[tag]->d_un.d_ptr += l_addr; \ + } \ while (0) ADJUST_DYN_INFO (DT_HASH); 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 Fri Apr 22 19:01:37 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: 1621147 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=RAIr6uvy; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KlP6G5XQgz9s07 for ; Sat, 23 Apr 2022 05:07:02 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id AA5933856247 for ; Fri, 22 Apr 2022 19:07:00 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AA5933856247 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650654420; bh=aKOrj9p0Cl+StfSLu3F5fvj7KfgWTegHOX2dS/WMJZQ=; 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=RAIr6uvyo9iUIHNuFXG1KnA1QiZWPgbaTPSCXjIWxj6hMrO8IzJnEyFRUFOXkiqlP 4xdsoZ6Ier8JA74XHHD0w7GNjOMUBU0eBq8dK7JrSO9IDGRpbAQ4hu4PXc0ZQeYaZe 1WNlXdqu7DzH6ioX7QztT7clxD3bNy28ETcgoKxA= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pg1-x52a.google.com (mail-pg1-x52a.google.com [IPv6:2607:f8b0:4864:20::52a]) by sourceware.org (Postfix) with ESMTPS id 989F63858C51 for ; Fri, 22 Apr 2022 19:01:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 989F63858C51 Received: by mail-pg1-x52a.google.com with SMTP id g3so7422112pgg.3 for ; Fri, 22 Apr 2022 12:01:45 -0700 (PDT) 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=aKOrj9p0Cl+StfSLu3F5fvj7KfgWTegHOX2dS/WMJZQ=; b=dJvbkkw0ddaXVFu/wTh4GSQVqcBcF9s6Z3PlWTdXom8uKS0Gt+1HZ1VvcSHAzNK2w/ jk9bOD25qhmlIwMS48PN65gGertKGQsVVZYrOwh5DnKhxIPnqra5VkgnExB/v8CX1qSq Rm0epEKuUn6E61rB5szfi66Olgvu4fhsAaqNbZZG+yi8jeZ+yzsm0J73zoaX14mzl+Vs FHDcCmFxdIitBaNOD1tg1HyttN2PH77gLbZ7TS1qeYXlCIQ3ceiteUSoE/iTEHOqLtx1 TovkkNROhFN3HwLwO2yMaGiOBPaAO/Jd3QfOVV1A3kywDst2qnG1oR+mIA7QYtsqhNZu mx5g== X-Gm-Message-State: AOAM530MjTNsbIjF2id6cF2waNsYLH/JnCbnm/GapY139OzqxOui4kH8 5HM2A7tJi5Jr8GDYiyYZLHs= X-Google-Smtp-Source: ABdhPJxSwaYppuaLNtKNbBhShFzjAaU9KZwhmjpytHCdS2iX5fv3HjH3TNv8e+7yNetw8eL0nsnILg== X-Received: by 2002:aa7:8d47:0:b0:4f6:a7f9:1ead with SMTP id s7-20020aa78d47000000b004f6a7f91eadmr6493434pfe.42.1650654104382; Fri, 22 Apr 2022 12:01:44 -0700 (PDT) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id h189-20020a636cc6000000b0039841f669bcsm2900072pgc.78.2022.04.22.12.01.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Apr 2022 12:01:42 -0700 (PDT) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 6A54EC0302; Fri, 22 Apr 2022 12:01:41 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH v11 5/7] elf: Add more DT_RELR tests Date: Fri, 22 Apr 2022 12:01:37 -0700 Message-Id: <20220422190139.2615492-6-hjl.tools@gmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220422190139.2615492-1-hjl.tools@gmail.com> References: <20220422190139.2615492-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3026.3 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_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, 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+incoming=patchwork.ozlabs.org@sourceware.org Sender: "Libc-alpha" Verify that: 1. A DT_RELR shared library without DT_NEEDED works. 2. A DT_RELR shared library without DT_VERNEED works. 3. A DT_RELR shared library without libc.so on DT_NEEDED works. --- elf/Makefile | 76 ++++++++++++++++++++++++++++++++++++++++-- elf/tst-relr-mod2.c | 46 +++++++++++++++++++++++++ elf/tst-relr-mod3a.c | 49 +++++++++++++++++++++++++++ elf/tst-relr-mod3b.c | 22 ++++++++++++ elf/tst-relr-mod4a.c | 19 +++++++++++ elf/tst-relr-mod4b.c | 19 +++++++++++ elf/tst-relr-mod4b.map | 3 ++ elf/tst-relr2.c | 27 +++++++++++++++ elf/tst-relr3.c | 27 +++++++++++++++ elf/tst-relr4.c | 1 + 10 files changed, 286 insertions(+), 3 deletions(-) create mode 100644 elf/tst-relr-mod2.c create mode 100644 elf/tst-relr-mod3a.c create mode 100644 elf/tst-relr-mod3b.c create mode 100644 elf/tst-relr-mod4a.c create mode 100644 elf/tst-relr-mod4b.c create mode 100644 elf/tst-relr-mod4b.map create mode 100644 elf/tst-relr2.c create mode 100644 elf/tst-relr3.c create mode 100644 elf/tst-relr4.c diff --git a/elf/Makefile b/elf/Makefile index 60e41035d7..bd9d03f527 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -544,7 +544,20 @@ endif ifeq ($(have-dt-relr),yes) tests += \ tst-relr \ + tst-relr2 \ + tst-relr3 \ + tst-relr4 \ # tests +modules-names-dt-relr = \ + tst-relr-mod2 \ + tst-relr-mod3a \ + tst-relr-mod3b \ + tst-relr-mod4a \ + tst-relr-mod4b \ +# modules-names-dt-relr +modules-names += $(modules-names-dt-relr) +# These shared libraries have special build rules. +modules-names-nobuild += $(modules-names-dt-relr) ifeq ($(have-fpie),yes) tests += \ tst-relr-pie \ @@ -559,6 +572,11 @@ endif CFLAGS-tst-relr-pie.c += $(pie-ccflag) LDFLAGS-tst-relr += -Wl,-z,pack-relative-relocs LDFLAGS-tst-relr-pie += -Wl,-z,pack-relative-relocs +CFLAGS-tst-relr-mod2.c += $(no-stack-protector) +CFLAGS-tst-relr-mod3a.c += $(no-stack-protector) +CFLAGS-tst-relr-mod3b.c += $(no-stack-protector) +CFLAGS-tst-relr-mod4a.c += $(no-stack-protector) +CFLAGS-tst-relr-mod4b.c += $(no-stack-protector) endif endif @@ -636,7 +654,7 @@ test-extras += \ tst-tlsmod17a \ tst-tlsmod18a \ # test-extras -modules-names = \ +modules-names += \ circlemod1 \ circlemod1a \ circlemod2 \ @@ -1006,8 +1024,13 @@ extra-test-objs += $(addsuffix .os,$(strip $(modules-names))) # filtmod1.so, tst-big-note-lib.so, tst-ro-dynamic-mod.so have special # rules. -modules-names-nobuild := filtmod1 tst-big-note-lib tst-ro-dynamic-mod \ - tst-audit24bmod1 tst-audit24bmod2 +modules-names-nobuild += \ + filtmod1 \ + tst-audit24bmod1 \ + tst-audit24bmod2 \ + tst-big-note-lib \ + tst-ro-dynamic-mod \ +# modules-names-nobuild tests += $(tests-static) @@ -2808,3 +2831,50 @@ $(objpfx)check-tst-relr-pie.out: $(objpfx)tst-relr-pie | sed -ne '/required from libc.so/,$$ p' \ | grep GLIBC_ABI_DT_RELR > $@; \ $(evaluate-test) + +# The test checks if a DT_RELR shared library without DT_NEEDED works as +# intended, so it uses an explicit link rule. +$(objpfx)tst-relr2: $(objpfx)tst-relr-mod2.so +$(objpfx)tst-relr-mod2.so: $(objpfx)tst-relr-mod2.os + $(LINK.o) -nostdlib -nostartfiles -Wl,-z,pack-relative-relocs \ + $(LDFLAGS-soname-fname) \ + -shared -o $@.new $(filter-out $(map-file),$^) + $(call after-link,$@.new) + mv -f $@.new $@ + +# The test checks if a DT_RELR shared library without DT_VERNEED works as +# intended, so it uses an explicit link rule. +$(objpfx)tst-relr3: $(objpfx)tst-relr-mod3a.so +$(objpfx)tst-relr-mod3b.so: $(objpfx)tst-relr-mod3b.os + $(LINK.o) -nostdlib -nostartfiles -Wl,-z,pack-relative-relocs \ + $(LDFLAGS-soname-fname) \ + -shared -o $@.new $(filter-out $(map-file),$^) + $(call after-link,$@.new) + mv -f $@.new $@ + +$(objpfx)tst-relr-mod3a.so: $(objpfx)tst-relr-mod3a.os \ + $(objpfx)tst-relr-mod3b.so + $(LINK.o) -nostdlib -nostartfiles -Wl,-z,pack-relative-relocs \ + $(LDFLAGS-soname-fname) \ + -shared -o $@.new $(filter-out $(map-file),$^) + $(call after-link,$@.new) + mv -f $@.new $@ + +# The test checks if a DT_RELR shared library without libc.so on DT_NEEDED +# works as intended, so it uses an explicit link rule. +$(objpfx)tst-relr4: $(objpfx)tst-relr-mod4a.so +$(objpfx)tst-relr-mod4b.so: $(objpfx)tst-relr-mod4b.os + $(LINK.o) -nostdlib -nostartfiles -Wl,-z,pack-relative-relocs \ + $(LDFLAGS-soname-fname) \ + -Wl,--version-script=tst-relr-mod4b.map \ + -shared -o $@.new $(filter-out $(map-file),$^) + $(call after-link,$@.new) + mv -f $@.new $@ + +$(objpfx)tst-relr-mod4a.so: $(objpfx)tst-relr-mod4a.os \ + $(objpfx)tst-relr-mod4b.so + $(LINK.o) -nostdlib -nostartfiles -Wl,-z,pack-relative-relocs \ + $(LDFLAGS-soname-fname) \ + -shared -o $@.new $(filter-out $(map-file),$^) + $(call after-link,$@.new) + mv -f $@.new $@ diff --git a/elf/tst-relr-mod2.c b/elf/tst-relr-mod2.c new file mode 100644 index 0000000000..dc0a63365c --- /dev/null +++ b/elf/tst-relr-mod2.c @@ -0,0 +1,46 @@ +/* Test for DT_RELR in a shared library without DT_NEEDED. + 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 + +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 }; + +int +foo (void) +{ + int err = 0; + for (int i = 0; i < array_length (arr); i++) + if (!((arr[i] == 0 && val[i] == 0) + || (arr[i] == &o && val[i] == 1) + || (arr[i] == &x && val[i] == 2))) + err++; + return err; +} diff --git a/elf/tst-relr-mod3a.c b/elf/tst-relr-mod3a.c new file mode 100644 index 0000000000..d1621c91b1 --- /dev/null +++ b/elf/tst-relr-mod3a.c @@ -0,0 +1,49 @@ +/* Test for DT_RELR in a shared library without DT_VERNEED. + 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 + +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 }; + +extern void bar (void); + +int +foo (void) +{ + int err = 0; + for (int i = 0; i < array_length (arr); i++) + if (!((arr[i] == 0 && val[i] == 0) + || (arr[i] == &o && val[i] == 1) + || (arr[i] == &x && val[i] == 2))) + err++; + bar (); + return err; +} diff --git a/elf/tst-relr-mod3b.c b/elf/tst-relr-mod3b.c new file mode 100644 index 0000000000..544cb4bc05 --- /dev/null +++ b/elf/tst-relr-mod3b.c @@ -0,0 +1,22 @@ +/* Test for DT_RELR in a shared library without DT_VERNEED. + 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 + . */ + +void +bar (void) +{ +} diff --git a/elf/tst-relr-mod4a.c b/elf/tst-relr-mod4a.c new file mode 100644 index 0000000000..e1bfebd4ac --- /dev/null +++ b/elf/tst-relr-mod4a.c @@ -0,0 +1,19 @@ +/* Test for DT_RELR in a shared library without libc.so on DT_NEEDED. + 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 "tst-relr-mod3a.c" diff --git a/elf/tst-relr-mod4b.c b/elf/tst-relr-mod4b.c new file mode 100644 index 0000000000..617dff79c3 --- /dev/null +++ b/elf/tst-relr-mod4b.c @@ -0,0 +1,19 @@ +/* Test for DT_RELR in a shared library without libc.so on DT_NEEDED. + 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 "tst-relr-mod3b.c" diff --git a/elf/tst-relr-mod4b.map b/elf/tst-relr-mod4b.map new file mode 100644 index 0000000000..7f02247262 --- /dev/null +++ b/elf/tst-relr-mod4b.map @@ -0,0 +1,3 @@ +DT_RELR { + global: bar; +}; diff --git a/elf/tst-relr2.c b/elf/tst-relr2.c new file mode 100644 index 0000000000..10d77f1791 --- /dev/null +++ b/elf/tst-relr2.c @@ -0,0 +1,27 @@ +/* Test for DT_RELR in a shared library without DT_NEEDED. + 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 + . */ + +extern int foo (void); + +static int +do_test (void) +{ + return foo (); +} + +#include diff --git a/elf/tst-relr3.c b/elf/tst-relr3.c new file mode 100644 index 0000000000..69106cf7b7 --- /dev/null +++ b/elf/tst-relr3.c @@ -0,0 +1,27 @@ +/* Test for DT_RELR in a shared library without libc.so on DT_NEEDED. + 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 + . */ + +extern int foo (void); + +static int +do_test (void) +{ + return foo (); +} + +#include diff --git a/elf/tst-relr4.c b/elf/tst-relr4.c new file mode 100644 index 0000000000..19a75013f8 --- /dev/null +++ b/elf/tst-relr4.c @@ -0,0 +1 @@ +#include "tst-relr3.c" From patchwork Fri Apr 22 19:01:38 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: 1621143 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=OcxN0Urw; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KlP4Y32bxz9s07 for ; Sat, 23 Apr 2022 05:05:33 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 9082B3856DCD for ; Fri, 22 Apr 2022 19:05:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9082B3856DCD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650654331; bh=+4IhDuM6MhjJ8/n8Xx75N94dfZF/0fWhyLySSBjbUDg=; 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=OcxN0UrwGDn5c3Kw1vgY3icRydCJyASBUpf0H3wAJMA9pZy0NafowhjJaWZaCgicM NAK63o0KkGKG0NcyRSx7FUBp4j8epdXDYU2E2sOCRs1tUtXxYbQmzEt0HvqToS7fqf KikyjuYE8ffThKfvsdh4yQjTp3K01FSb6xAei/Gc= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pl1-x636.google.com (mail-pl1-x636.google.com [IPv6:2607:f8b0:4864:20::636]) by sourceware.org (Postfix) with ESMTPS id 5EB3E3858427 for ; Fri, 22 Apr 2022 19:01:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5EB3E3858427 Received: by mail-pl1-x636.google.com with SMTP id s14so12797393plk.8 for ; Fri, 22 Apr 2022 12:01:44 -0700 (PDT) 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=+4IhDuM6MhjJ8/n8Xx75N94dfZF/0fWhyLySSBjbUDg=; b=QooVIMnJnn7YjD4CwpnoZY9vx9clQmAGp5ZvpmZOhs9kwFXNS+OfEYmRDlDZ3cD9fu rhZyg9br8ed2hDj0wl4CLBDzUxFxQu+4RvfDlXgt4oclBBNmoEFTHhTwwQ144cS6LuJc Q0wo2AOPmrIx2u9VgSSgkk47n4jWTc0PmoYSWxzwC8YAw0nIzdD23HzNLOxZ719T19Ck 6ke692/NiFFlA9dswv5+Xjnese22zVScTK+oX2FtDNvOoMmXDhoRP1B0cs73yJQF1Klv fmHF+1vwtNwWmSMsdszjRGWtJ+qJo9pra0D/Kjc3SZdVJvhs1LKHQOZl+pL2wmTpRVOv jXLw== X-Gm-Message-State: AOAM531WHYo1YT/cfsin+8jE1BMpBjdA4DPfE4QuLxZOSVPFMGyoKUYy q2PRmXsuCE6KospOZAoYVPw= X-Google-Smtp-Source: ABdhPJxAXXEw/sv+JbosRRb6es3mfkpAWbdCRZjdXAlzNJMMkS6hiqlMQvUFH34CrEvOmoFoPNX0cw== X-Received: by 2002:a17:902:b58b:b0:15b:5a3f:814b with SMTP id a11-20020a170902b58b00b0015b5a3f814bmr5639150pls.154.1650654103235; Fri, 22 Apr 2022 12:01:43 -0700 (PDT) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id g6-20020a17090a714600b001d7f3bb11d7sm3274430pjs.53.2022.04.22.12.01.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Apr 2022 12:01:42 -0700 (PDT) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 74F0BC0287; Fri, 22 Apr 2022 12:01:41 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH v11 6/7] Add --disable-default-dt-relr Date: Fri, 22 Apr 2022 12:01:38 -0700 Message-Id: <20220422190139.2615492-7-hjl.tools@gmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220422190139.2615492-1-hjl.tools@gmail.com> References: <20220422190139.2615492-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3027.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP 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+incoming=patchwork.ozlabs.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. Also add a new configuration option, --disable-default-dt-relr, to avoid DT_RELR usage in glibc shared libraries and PIEs. Reviewed-by: Fangrui Song --- INSTALL | 6 ++++++ Makeconfig | 19 +++++++++++++++++++ Makerules | 2 ++ configure | 18 ++++++++++++++++++ configure.ac | 13 +++++++++++++ elf/Makefile | 4 +++- manual/install.texi | 5 +++++ 7 files changed, 66 insertions(+), 1 deletion(-) diff --git a/INSTALL b/INSTALL index b68884ccd6..09c9920a77 100644 --- a/INSTALL +++ b/INSTALL @@ -139,6 +139,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 0aa5fb0099..b75f28f837 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) + relro-LDFLAGS = -Wl,-z,relro LDFLAGS.so += $(relro-LDFLAGS) LDFLAGS-rtld += $(relro-LDFLAGS) @@ -413,6 +430,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)) \ $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \ @@ -445,6 +463,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 428464f092..7c1da551bf 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 5a730dc5fc..91152a5154 100755 --- a/configure +++ b/configure @@ -767,6 +767,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 @@ -1424,6 +1425,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 @@ -3440,6 +3442,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 @@ -7029,6 +7038,15 @@ fi config_vars="$config_vars enable-static-pie = $libc_cv_static_pie" +# Disable build-dt-relr-default if linker does not support it or if 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 +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 a045f6608e..c4198af9dc 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@:>@]), @@ -1825,6 +1830,14 @@ if test "$libc_cv_static_pie" = "yes"; then fi LIBC_CONFIG_VAR([enable-static-pie], [$libc_cv_static_pie]) +# Disable build-dt-relr-default if linker does not support it or if 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 +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 bd9d03f527..c9f5876119 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -1648,6 +1648,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 @@ -2447,7 +2448,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 @@ -2756,6 +2757,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 fcfb6901e4..e446ac66c4 100644 --- a/manual/install.texi +++ b/manual/install.texi @@ -167,6 +167,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 Fri Apr 22 19:01:39 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: 1621139 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=nAXzYSsj; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KlP2x4GFXz9s07 for ; Sat, 23 Apr 2022 05:04:09 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B86B13856DE2 for ; Fri, 22 Apr 2022 19:04:07 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B86B13856DE2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650654247; bh=VfdVi8wa/LJolfSfghY+jykT8QLZOf4XLd8T7bejgS4=; 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=nAXzYSsj0q2Dh30s93Kauj7oVoySVckmFdxdWo0eLkNq494w9UKqG/HwHm1oLtdhD lEjPhu9osZ34KQJuPp3xzLw+En42iQfg2oCeyAKr1RjGtwYdCal2f265Gt+8LN2TfO E/zUz74pBhk6UscB98bvLWhOGikyum9c80Ye3Pcc= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pl1-x62f.google.com (mail-pl1-x62f.google.com [IPv6:2607:f8b0:4864:20::62f]) by sourceware.org (Postfix) with ESMTPS id 06B173858C51 for ; Fri, 22 Apr 2022 19:01:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 06B173858C51 Received: by mail-pl1-x62f.google.com with SMTP id n8so12845870plh.1 for ; Fri, 22 Apr 2022 12:01:43 -0700 (PDT) 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=VfdVi8wa/LJolfSfghY+jykT8QLZOf4XLd8T7bejgS4=; b=ByircWszzlmYQcKu9CVEVgr26lCc8YGnn/LTa6Hv2+P+M3pfGo3UbKfXlttr1TkM+c wSe3TE2s1+MKPOpqdcW8cF2dN+n9JeGOJgI/PA2//7a5d+2YJ/Rq2iPF+t9AHJCjgxX9 X6uizOM8moOm8sLyRitUIMm3a1GGt9q8MockGIKXeqWlhJ46ajwnwZFhNyDnZitRbcpk df+/kOvi1+QiAfrTatkNlUjBacy5TAniG2Hx15pqZ18wvj0FwlpjMavK4EaNErOs/N5v 0MDeam5k7Uqe5q6ft/Slh1pikaqeSZEOoLvZu7R13XKl2G9dFnVbqdrCdp1nuW210DoY XaHA== X-Gm-Message-State: AOAM5322weZgaCLhBOQrtjMFe/RIldAMvXBS3vvR5RhBCInWes/7fq14 Tx02mCr4YLVBhKH06CQnqOrDpxLWouw= X-Google-Smtp-Source: ABdhPJzSvyexddies+yS0TBX6KbpGWK1YKJvf6FNVyYTMooXhVXConOi7B9yvFISN9U0v5R5Yqsn6g== X-Received: by 2002:a17:90a:8583:b0:1d0:ad7f:2452 with SMTP id m3-20020a17090a858300b001d0ad7f2452mr6905694pjn.203.1650654102983; Fri, 22 Apr 2022 12:01:42 -0700 (PDT) Received: from gnu-tgl-3.localdomain ([172.58.35.133]) by smtp.gmail.com with ESMTPSA id p11-20020a65490b000000b003aa7791f3afsm2876468pgs.84.2022.04.22.12.01.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Apr 2022 12:01:42 -0700 (PDT) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 75E48C03BD; Fri, 22 Apr 2022 12:01:41 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH v11 7/7] NEWS: Mention DT_RELR support Date: Fri, 22 Apr 2022 12:01:39 -0700 Message-Id: <20220422190139.2615492-8-hjl.tools@gmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220422190139.2615492-1-hjl.tools@gmail.com> References: <20220422190139.2615492-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3027.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP 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+incoming=patchwork.ozlabs.org@sourceware.org Sender: "Libc-alpha" --- NEWS | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) Reviewed-by: Fangrui Song diff --git a/NEWS b/NEWS index 4b6d9de2b5..ef8ac4acd2 100644 --- a/NEWS +++ b/NEWS @@ -9,7 +9,12 @@ Version 2.36 Major new features: - [Add new features here] +* Support for DT_RELR relative relocation format has been added to + glibc. This is a new ELF dynamic tag that improves the size of + relative relocations in shared object files and position independent + executables (PIE). DT_RELR generation requires linker support for + -z pack-relative-relocs option, which is supported for some targets + in recent binutils versions. Lazy binding doesn't apply to DT_RELR. Deprecated and removed features, and other changes affecting compatibility: