From patchwork Sun Mar 18 01:53:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Samuel Thibault X-Patchwork-Id: 26360 Received: (qmail 48527 invoked by alias); 18 Mar 2018 01:53:39 -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 48496 invoked by uid 89); 18 Mar 2018 01:53:38 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_HELO_PASS, SPF_NEUTRAL autolearn=ham version=3.3.2 spammy=H*r:sk:static-, Hx-spam-relays-external:sk:static-, H*RU:sk:static- X-HELO: hera.aquilenet.fr From: Samuel Thibault To: libc-alpha@sourceware.org Cc: Samuel Thibault Subject: [PATCH] hurd: Fix early rtld access to errno Date: Sun, 18 Mar 2018 02:53:32 +0100 Message-Id: <20180318015332.9759-1-samuel.thibault@ens-lyon.org> * sysdeps/generic/dl-sysdep.h (RTLD_EXTERN_ERRNO): Define macro to 0. * sysdeps/mach/hurd/i386/dl-sysdep.h: Include . [IS_IN(rtld)] (RTLD_EXTERN_ERRNO): Define macro to 1. [!IS_IN(rtld)] (RTLD_EXTERN_ERRNO): Define macro to 0. * include/errno.h [IS_IN(rtld) && !defined RTLD_EXTERN_ERRNO]: Error out. [!IS_IN(rtld)] (RTLD_EXTERN_ERRNO): Define to 0. [RTLD_EXTERN_ERRNO]: Do not use TLS access to errno. --- include/errno.h | 6 +++++- sysdeps/generic/dl-sysdep.h | 8 ++++++++ sysdeps/mach/hurd/i386/dl-sysdep.h | 27 +++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 sysdeps/mach/hurd/i386/dl-sysdep.h diff --git a/include/errno.h b/include/errno.h index 3c3d2288c8..792f974518 100644 --- a/include/errno.h +++ b/include/errno.h @@ -7,8 +7,12 @@ # ifndef RTLD_PRIVATE_ERRNO # error "dl-sysdep.h must define RTLD_PRIVATE_ERRNO!" # endif +# ifndef RTLD_EXTERN_ERRNO +# error "dl-sysdep.h must define RTLD_EXTERN_ERRNO!" +# endif # else # define RTLD_PRIVATE_ERRNO 0 +# define RTLD_EXTERN_ERRNO 0 # endif # if RTLD_PRIVATE_ERRNO @@ -20,7 +24,7 @@ # define errno rtld_errno extern int rtld_errno attribute_hidden; -# elif IS_IN_LIB +# elif IS_IN_LIB && !RTLD_EXTERN_ERRNO # include diff --git a/sysdeps/generic/dl-sysdep.h b/sysdeps/generic/dl-sysdep.h index 2cb8565b5b..d787f142e9 100644 --- a/sysdeps/generic/dl-sysdep.h +++ b/sysdeps/generic/dl-sysdep.h @@ -32,3 +32,11 @@ #else # define RTLD_PRIVATE_ERRNO 0 #endif + +/* This macro must be defined to either 0 or 1. + + If 1, then ld.so will use the external errno access through + __errno_location(). This may be needed if early TLS access to + errno can not work. */ + +#define RTLD_EXTERN_ERRNO 0 diff --git a/sysdeps/mach/hurd/i386/dl-sysdep.h b/sysdeps/mach/hurd/i386/dl-sysdep.h new file mode 100644 index 0000000000..1533753a49 --- /dev/null +++ b/sysdeps/mach/hurd/i386/dl-sysdep.h @@ -0,0 +1,27 @@ +/* System-specific settings for dynamic linker code. Hurd version. + Copyright (C) 2002-2018 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 + +/* TLS access can not work early in ld.so. */ + +#if IS_IN (rtld) +# define RTLD_EXTERN_ERRNO 1 +#else +# define RTLD_EXTERN_ERRNO 0 +#endif