From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1791) id 673693938C27; Mon, 9 Aug 2021 20:25:53 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 673693938C27 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Adhemerval Zanella To: glibc-cvs@sourceware.org Subject: [glibc/azanella/rtld-shared] elf: Define a new dynamic section tag - DT_GNU_FLAGS_1 (BZ #22745) X-Act-Checkin: glibc X-Git-Author: Vivek Das Mohapatra X-Git-Refname: refs/heads/azanella/rtld-shared X-Git-Oldrev: 1d7b32ee6145c46c4f4f8a208a6b72e0668d7cf3 X-Git-Newrev: 3b233f1ef048eea24b8dbf44fc9c7bac82b8fbd3 Message-Id: <20210809202553.673693938C27@sourceware.org> Date: Mon, 9 Aug 2021 20:25:53 +0000 (GMT) X-BeenThere: glibc-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Glibc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 09 Aug 2021 20:25:53 -0000 https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=3b233f1ef048eea24b8dbf44fc9c7bac82b8fbd3 commit 3b233f1ef048eea24b8dbf44fc9c7bac82b8fbd3 Author: Vivek Das Mohapatra Date: Thu Jul 8 17:32:48 2021 +0100 elf: Define a new dynamic section tag - DT_GNU_FLAGS_1 (BZ #22745) 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. Checked on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: Adhemerval Zanella Diff: --- 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 4738dfa28f..f24b6579b3 100644 --- a/elf/elf.h +++ b/elf/elf.h @@ -898,6 +898,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 /* GNU extension flags */ #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 */ @@ -912,7 +913,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. @@ -1001,6 +1002,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 /* Load max 1 copy of this DSO. */ + /* 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..8082d84ba1 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 (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES) + && 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 4af16cb596..6ed35eb808 100644 --- a/include/link.h +++ b/include/link.h @@ -283,6 +283,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;