From patchwork Wed Oct 28 22:04:25 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 9438 Received: (qmail 12709 invoked by alias); 28 Oct 2015 22:04:30 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 12699 invoked by uid 89); 28 Oct 2015 22:04:30 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.6 required=5.0 tests=AWL, BAYES_20, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-ob0-f178.google.com MIME-Version: 1.0 X-Received: by 10.60.67.1 with SMTP id j1mr36222997oet.61.1446069866051; Wed, 28 Oct 2015 15:04:26 -0700 (PDT) In-Reply-To: References: <20151028114906.GA7686@gmail.com> Date: Wed, 28 Oct 2015 15:04:25 -0700 Message-ID: Subject: Re: [PATCH] [BZ #19178] ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA conflict From: "H.J. Lu" To: GNU C Library On Wed, Oct 28, 2015 at 6:42 AM, H.J. Lu wrote: > On Wed, Oct 28, 2015 at 4:49 AM, H.J. Lu wrote: >> _dl_debug_bindings updates relocation type class with 4 and 8. But >> ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA may be defined to 4. This patch >> adds ELF_RTYPE_CLASS_TLS/ELF_RTYPE_CLASS_IFUNC and use them in >> _dl_debug_bindings. >> >> Tested on i686 and x86-64. OK for master and 2.22 branch? >> >> >> H.J. >> -- >> [BZ #19178] >> * dl-lookup.c (_dl_debug_bindings): Replace 4 and 8 with >> ELF_RTYPE_CLASS_TLS and ELF_RTYPE_CLASS_IFUNC. >> * sysdeps/generic/ldsodefs.h (ELF_RTYPE_CLASS_TLS): New. >> (ELF_RTYPE_CLASS_IFUNC): Likewise. > > > It doesn't work with prelink. > Here is the correct patch. Verified with prelink. OK for master and 2.22 branch? From 1ed43952877eb3183a8093849e33c8dab0cf7ddf Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 28 Oct 2015 07:49:44 -0700 Subject: [PATCH] Clear ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA for prelink prelink runs ld.so with the environment variable LD_TRACE_PRELINKING set to dump the relocation type class from _dl_debug_bindings. prelink has the following relocation type classes: where ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA has a conflict with RTYPE_CLASS_TLS. Since prelink doesn't use ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA, we should clear the ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA bit when the DL_DEBUG_PRELINK bit is set. [BZ #19178] * elf/dl-lookup.c (RTYPE_CLASS_VALID): New. (RTYPE_CLASS_PLT): Likewise. (RTYPE_CLASS_COPY): Likewise. (RTYPE_CLASS_TLS): Likewise. (_dl_debug_bindings): Use RTYPE_CLASS_TLS and RTYPE_CLASS_VALID to set relocation type class for DL_DEBUG_PRELINK. Clear the ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA bit for DL_DEBUG_PRELINK. --- elf/dl-lookup.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index 581fb20..deb3754 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -1016,6 +1016,18 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map, #ifdef SHARED if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK) { +/* ELF_RTYPE_CLASS_XXX must match RTYPE_CLASS_XXX used by prelink with + LD_TRACE_PRELINKING. */ +#define RTYPE_CLASS_VALID 8 +#define RTYPE_CLASS_PLT (8|1) +#define RTYPE_CLASS_COPY (8|2) +#define RTYPE_CLASS_TLS (8|4) +#if ELF_RTYPE_CLASS_PLT != 0 && ELF_RTYPE_CLASS_PLT != 1 +# error ELF_RTYPE_CLASS_PLT must be 0 or 1! +#endif +#if ELF_RTYPE_CLASS_COPY != 0 && ELF_RTYPE_CLASS_COPY != 2 +# error ELF_RTYPE_CLASS_COPY must be 0 or 2! +#endif int conflict = 0; struct sym_val val = { NULL, NULL }; @@ -1071,12 +1083,17 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map, if (value->s) { + /* Clear the ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA bit since + it isn't used by prelink. */ + type_class &= ~ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA; if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info) == STT_TLS)) - type_class = 4; + /* Clear the RTYPE_CLASS_VALID bit in RTYPE_CLASS_TLS. */ + type_class = RTYPE_CLASS_TLS & ~RTYPE_CLASS_VALID; else if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info) == STT_GNU_IFUNC)) - type_class |= 8; + /* Set the RTYPE_CLASS_VALID bit. */ + type_class |= RTYPE_CLASS_VALID; } if (conflict -- 2.4.3