From patchwork Tue Feb 9 17:18:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vivek Dasmohapatra X-Patchwork-Id: 41992 X-Patchwork-Delegate: azanella@linux.vnet.ibm.com 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 923ED398B888; Tue, 9 Feb 2021 17:18:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 923ED398B888 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1612891135; bh=EOFTtEh2d6DLyizV/D1O0YN3PMY0M/KX285FwtTtQ5w=; 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=QkDmwUxETJ6yn509gNmlCitIXRQqTfE2fI1mXfcsP8iS3L5/erYtxtIFEOGu3YaSE jz+TmgvV/+9ZIRBgRwmzYOUVVHrN8ksmFvv7Ui+N/0aYq6uDXHAb7tPFwZVwae7Uc/ hf0dKxcNcNOfh3Guc9iIfFctQte4rwdnGS5ZnSVs= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3]) by sourceware.org (Postfix) with ESMTPS id 1D841396AC03 for ; Tue, 9 Feb 2021 17:18:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 1D841396AC03 Received: from noise.lan (unknown [IPv6:2001:4d48:ad5c:ef00:8e70:5aff:fe59:c29c]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: vivek) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 4D18B1F451DE for ; Tue, 9 Feb 2021 17:18:46 +0000 (GMT) To: libc-alpha@sourceware.org Subject: [RFC][PATCH v8 09/20] Define a new dynamic section tag - DT_GNU_FLAGS_1 Date: Tue, 9 Feb 2021 17:18:28 +0000 Message-Id: <20210209171839.7911-10-vivek@collabora.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210209171839.7911-1-vivek@collabora.com> References: <20210209171839.7911-1-vivek@collabora.com> MIME-Version: 1.0 X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_NUMSUBJECT, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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: =?utf-8?q?Vivek_Das=C2=A0Mohapatra_via_Libc-alpha?= From: Vivek Dasmohapatra Reply-To: =?utf-8?q?Vivek_Das=C2=A0Mohapatra?= Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" Define a new flags section DT_GNU_FLAGS_1 (no more bits are available in DT_GNU_FLAGS). One flag is currently defined: DF_GNU_1_UNIQUE. libc and its companion DSOs (libpthread et al) should have this section and flag set. --- elf/elf.h | 7 ++++++- elf/get-dynamic-info.h | 12 ++++++++++++ include/elf.h | 2 ++ include/link.h | 1 + 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/elf/elf.h b/elf/elf.h index 4f838d4af2..9f9b8e4291 100644 --- a/elf/elf.h +++ b/elf/elf.h @@ -895,6 +895,7 @@ typedef struct Dyn.d_un.d_val field of the Elf*_Dyn structure. This follows Sun's approach. */ #define DT_VALRNGLO 0x6ffffd00 +#define DT_GNU_FLAGS_1 0x6ffffdf4 /* Open DSO once across all namespaces */ #define DT_GNU_PRELINKED 0x6ffffdf5 /* Prelinking timestamp */ #define DT_GNU_CONFLICTSZ 0x6ffffdf6 /* Size of conflict section */ #define DT_GNU_LIBLISTSZ 0x6ffffdf7 /* Size of library list */ @@ -909,7 +910,7 @@ typedef struct #define DT_SYMINENT 0x6ffffdff /* Entry size of syminfo */ #define DT_VALRNGHI 0x6ffffdff #define DT_VALTAGIDX(tag) (DT_VALRNGHI - (tag)) /* Reverse order! */ -#define DT_VALNUM 12 +#define DT_VALNUM 13 /* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the Dyn.d_un.d_ptr field of the Elf*_Dyn structure. @@ -998,6 +999,10 @@ typedef struct #define DF_1_WEAKFILTER 0x20000000 #define DF_1_NOCOMMON 0x40000000 +/* State flags selectable in the `d_un.d_val' element of the DT_GNU_FLAGS_1 + entry in the dynamic section. */ +#define DF_GNU_1_UNIQUE 0x00000001 + /* Flags for the feature selection in DT_FEATURE_1. */ #define DTF_1_PARINIT 0x00000001 #define DTF_1_CONFEXP 0x00000002 diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h index d8ec32377d..d441b39576 100644 --- a/elf/get-dynamic-info.h +++ b/elf/get-dynamic-info.h @@ -175,6 +175,18 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp) if (l->l_flags_1 & DF_1_NOW) info[DT_BIND_NOW] = info[VERSYMIDX (DT_FLAGS_1)]; } + if (info[DT_VALTAGIDX (DT_GNU_FLAGS_1) + + DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM + DT_EXTRANUM] != NULL) + { + l->l_gnu_flags_1 = info[DT_VALTAGIDX (DT_GNU_FLAGS_1) + + DT_NUM + DT_THISPROCNUM + + DT_VERSIONTAGNUM + DT_EXTRANUM]->d_un.d_val; + + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0) + && l->l_gnu_flags_1 & ~DT_GNU_1_SUPPORTED_MASK) + _dl_debug_printf ("\nWARNING: Unsupported flag value(s) of 0x%x in DT_GNU_FLAGS_1.\n", + l->l_gnu_flags_1 & ~DT_GNU_1_SUPPORTED_MASK); + } if (info[DT_RUNPATH] != NULL) /* If both RUNPATH and RPATH are given, the latter is ignored. */ info[DT_RPATH] = NULL; diff --git a/include/elf.h b/include/elf.h index 14ed67ff67..5eee37c294 100644 --- a/include/elf.h +++ b/include/elf.h @@ -25,5 +25,7 @@ (DF_1_NOW | DF_1_NODELETE | DF_1_INITFIRST | DF_1_NOOPEN \ | DF_1_ORIGIN | DF_1_NODEFLIB | DF_1_PIE) +#define DT_GNU_1_SUPPORTED_MASK DF_GNU_1_UNIQUE + #endif /* !_ISOMAC */ #endif /* elf.h */ diff --git a/include/link.h b/include/link.h index b51fa0cbdf..55e0cad71d 100644 --- a/include/link.h +++ b/include/link.h @@ -285,6 +285,7 @@ struct link_map unsigned int l_used; /* Various flag words. */ + ElfW(Word) l_gnu_flags_1; ElfW(Word) l_feature_1; ElfW(Word) l_flags_1; ElfW(Word) l_flags;