From patchwork Fri Nov 20 07:30:24 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Maciej W. Rozycki" X-Patchwork-Id: 9753 Received: (qmail 34836 invoked by alias); 20 Nov 2015 07:30:31 -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 34824 invoked by uid 89); 20 Nov 2015 07:30:30 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mailapp01.imgtec.com Date: Fri, 20 Nov 2015 07:30:24 +0000 From: "Maciej W. Rozycki" To: CC: Matthew Fortune , Daniel Sanders , Leonid Yegoshin Subject: [RFC PATCH 3/5] MIPS: Record AT_FLAGS auxiliary vector's entry In-Reply-To: Message-ID: References: User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Record AT_FLAGS auxiliary vector's entry on the MIPS platform, adjusting generic code so as to enable this code for platforms which make a use of it. Pass the value recorded on to run-time loader newly invoked from static executables. It is debatable as to whether `_dl_flags' needs to be initialized in `_rtld_global_ro', however follow the precedent of `_dl_inhibit_cache'. Adjust formatting in a minor way in neighboring lines of dl-static.c, to follow the GNU Coding Standard. * sysdeps/generic/ldsodefs.h (rtld_global_ro) [NEED_DL_FLAGS]: Add `_dl_flags' struct member. * sysdeps/unix/sysv/linux/mips/dl-sysdep.h: New file. * elf/dl-support.c (_dl_flags) [NEED_DL_FLAGS]: New variable. (_dl_aux_init) [NEED_DL_FLAGS] : Set `GLRO (dl_flags)'. * elf/dl-sysdep.c (_dl_sysdep_start) [NEED_DL_FLAGS] : Set `GLRO (dl_flags)'. * elf/rtld.c (_rtld_global_ro) [NEED_DL_FLAGS]: Initialize `_dl_flags' member. * sysdeps/unix/sysv/linux/mips/dl-static.c (_dl_var_init): Add DL_FLAGS anonymous enum value. Set `GLRO (dl_flags)'. (variables): Add a pointer to `GLRO (dl_flags)'. --- glibc-mips-at-flags.diff Index: glibc/elf/dl-support.c =================================================================== --- glibc.orig/elf/dl-support.c 2015-11-10 14:06:46.548882325 +0000 +++ glibc/elf/dl-support.c 2015-11-10 14:07:01.451769679 +0000 @@ -138,6 +138,11 @@ void (*_dl_init_static_tls) (struct link size_t _dl_pagesize = EXEC_PAGESIZE; +#ifdef NEED_DL_FLAGS +/* The AT_FLAGS value passed by the kernel. */ +uintptr_t _dl_flags; +#endif + int _dl_inhibit_cache; unsigned int _dl_osversion; @@ -236,6 +241,11 @@ _dl_aux_init (ElfW(auxv_t) *av) if (av->a_un.a_val != 0) GLRO(dl_pagesize) = av->a_un.a_val; break; +#ifdef NEED_DL_FLAGS + case AT_FLAGS: + GLRO (dl_flags) = av->a_un.a_val; + break; +#endif case AT_CLKTCK: GLRO(dl_clktck) = av->a_un.a_val; break; Index: glibc/elf/dl-sysdep.c =================================================================== --- glibc.orig/elf/dl-sysdep.c 2015-11-10 13:40:06.158497219 +0000 +++ glibc/elf/dl-sysdep.c 2015-11-10 14:07:01.566120503 +0000 @@ -126,6 +126,11 @@ _dl_sysdep_start (void **start_argptr, case AT_PAGESZ: GLRO(dl_pagesize) = av->a_un.a_val; break; +#ifdef NEED_DL_FLAGS + case AT_FLAGS: + GLRO (dl_flags) = av->a_un.a_val; + break; +#endif case AT_ENTRY: user_entry = av->a_un.a_val; break; Index: glibc/elf/rtld.c =================================================================== --- glibc.orig/elf/rtld.c 2015-11-10 14:06:46.617728628 +0000 +++ glibc/elf/rtld.c 2015-11-10 14:07:01.623249929 +0000 @@ -165,6 +165,9 @@ struct rtld_global_ro _rtld_global_ro at ._dl_lazy = 1, ._dl_fpu_control = _FPU_DEFAULT, ._dl_pagesize = EXEC_PAGESIZE, +#ifdef NEED_DL_FLAGS + ._dl_flags = 0, +#endif ._dl_inhibit_cache = 0, /* Function pointers. */ Index: glibc/sysdeps/generic/ldsodefs.h =================================================================== --- glibc.orig/sysdeps/generic/ldsodefs.h 2015-11-10 13:56:33.755429398 +0000 +++ glibc/sysdeps/generic/ldsodefs.h 2015-11-10 14:07:01.732333197 +0000 @@ -472,6 +472,11 @@ struct rtld_global_ro /* Cached value of `getpagesize ()'. */ EXTERN size_t _dl_pagesize; +#ifdef NEED_DL_FLAGS + /* The AT_FLAGS value passed by the kernel. */ + EXTERN uintptr_t _dl_flags; +#endif + /* Do we read from ld.so.cache? */ EXTERN int _dl_inhibit_cache; Index: glibc/sysdeps/unix/sysv/linux/mips/dl-static.c =================================================================== --- glibc.orig/sysdeps/unix/sysv/linux/mips/dl-static.c 2015-11-10 13:40:06.241480977 +0000 +++ glibc/sysdeps/unix/sysv/linux/mips/dl-static.c 2015-11-10 14:07:01.832920115 +0000 @@ -26,17 +26,20 @@ _dl_var_init (void *array[]) /* It has to match "variables" below. */ enum { - DL_PAGESIZE = 0 + DL_PAGESIZE = 0, + DL_FLAGS }; - GLRO(dl_pagesize) = *((size_t *) array[DL_PAGESIZE]); + GLRO (dl_pagesize) = *((size_t *) array[DL_PAGESIZE]); + GLRO (dl_flags) = *((uintptr_t *) array[DL_FLAGS]); } #else static void *variables[] = { - &GLRO(dl_pagesize) + &GLRO (dl_pagesize), + &GLRO (dl_flags) }; static void Index: glibc/sysdeps/unix/sysv/linux/mips/dl-sysdep.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ glibc/sysdeps/unix/sysv/linux/mips/dl-sysdep.h 2015-11-10 14:07:01.873416812 +0000 @@ -0,0 +1,23 @@ +/* System-specific settings for dynamic linker code. MIPS/Linux version. + Copyright (C) 2015 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_next + +/* Record the AT_FLAGS value passed by the kernel in the auxiliary vector + to the application. */ +#define NEED_DL_FLAGS 1