From patchwork Fri Nov 13 23:53:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Samuel Thibault X-Patchwork-Id: 41075 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 028D63857818; Fri, 13 Nov 2020 23:53:33 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from hera.aquilenet.fr (hera.aquilenet.fr [IPv6:2a0c:e300::1]) by sourceware.org (Postfix) with ESMTPS id A01233858020 for ; Fri, 13 Nov 2020 23:53:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org A01233858020 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=ens-lyon.org Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=samuel.thibault@ens-lyon.org Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 3B9D2E14; Sat, 14 Nov 2020 00:53:28 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id KojgDuT6oVtW; Sat, 14 Nov 2020 00:53:27 +0100 (CET) Received: from function.youpi.perso.aquilenet.fr (lfbn-bor-1-56-204.w90-50.abo.wanadoo.fr [90.50.148.204]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 1E342DFD; Sat, 14 Nov 2020 00:53:27 +0100 (CET) Received: from samy by function.youpi.perso.aquilenet.fr with local (Exim 4.94) (envelope-from ) id 1kdisf-0083SA-7S; Sat, 14 Nov 2020 00:53:25 +0100 From: Samuel Thibault To: libc-alpha@sourceware.org Subject: [hurd, commited] hurd: break relocation loop between libc.so and lib{mach, hurd}user.so Date: Sat, 14 Nov 2020 00:53:18 +0100 Message-Id: <20201113235318.1919854-1-samuel.thibault@ens-lyon.org> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 X-Spam-Status: No, score=-10.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_NEUTRAL, TXREP, URIBL_BLACK 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: , Cc: commit-hurd@gnu.org Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" See https://sourceware.org/pipermail/libc-alpha/2020-November/119575.html lib{mach,hurd}user.so gets relocated before libc.so, but its references to strpcpy and memcpy would need an ifunc decision, which e.g. on x86 relies on cpu_features, but libc.so's _rtld_global_ro is not relocated yet. We can however just make lib{mach,hurd}user.so only call non-ifunc functions, which can be relocated before libc.so is relocated. --- mach/Makefile | 2 +- mach/Versions | 4 ++++ mach/mach/mig_support.h | 15 +------------- mach/mig_memcpy.c | 26 +++++++++++++++++++++++++ sysdeps/mach/include/mach/mig_support.h | 12 ++++++++++++ 5 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 mach/mig_memcpy.c diff --git a/mach/Makefile b/mach/Makefile index bd9d7c8016..b3ad3f4e26 100644 --- a/mach/Makefile +++ b/mach/Makefile @@ -25,7 +25,7 @@ headers = mach_init.h mach.h mach_error.h mach-shortcuts.h mach/mach_traps.h \ lock = spin-solid spin-lock mutex-init mutex-solid lock-headers = lock-intern.h spin-lock.h routines = $(mach-syscalls) $(mach-shortcuts) \ - mach_init mig_strncpy msg \ + mach_init mig_strncpy mig_memcpy msg \ mig-alloc mig-dealloc mig-reply \ msg-destroy msgserver \ mach_error errstring error_compat errsystems \ diff --git a/mach/Versions b/mach/Versions index eef52c805f..b525cfdcf9 100644 --- a/mach/Versions +++ b/mach/Versions @@ -68,4 +68,8 @@ libc { __spin_lock; __spin_lock_init; __spin_lock_solid; __spin_try_lock; __spin_unlock; } + GLIBC_PRIVATE { + # functions used by RPC stubs + __mig_memcpy; + } } diff --git a/mach/mach/mig_support.h b/mach/mach/mig_support.h index a5b74bfcc8..cca0716b87 100644 --- a/mach/mach/mig_support.h +++ b/mach/mach/mig_support.h @@ -54,19 +54,6 @@ extern void mig_reply_setup (const mach_msg_header_t *__request, extern vm_size_t mig_strncpy (char *__dst, const char *__src, vm_size_t __len); extern vm_size_t __mig_strncpy (char *__dst, const char *__src, vm_size_t); -#if defined __USE_EXTERN_INLINES && defined _LIBC -__extern_inline vm_size_t -__mig_strncpy (char *__dst, const char *__src, vm_size_t __len) -{ - return __stpncpy (__dst, __src, __len) - __dst; -} -__extern_inline vm_size_t -mig_strncpy (char *__dst, const char *__src, vm_size_t __len) -{ - return __mig_strncpy (__dst, __src, __len); -} -#endif - - +extern void *__mig_memcpy (void *__dst, const void *__src, vm_size_t __len); #endif /* mach/mig_support.h */ diff --git a/mach/mig_memcpy.c b/mach/mig_memcpy.c new file mode 100644 index 0000000000..df8fd5e9af --- /dev/null +++ b/mach/mig_memcpy.c @@ -0,0 +1,26 @@ +/* memcpy stub for mig stubs in libmachuser and libhurduser. + Copyright (C) 2020 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 +#include + +void * +__mig_memcpy (void *dst, const void *src, vm_size_t len) +{ + return memcpy (dst, src, len); +} diff --git a/sysdeps/mach/include/mach/mig_support.h b/sysdeps/mach/include/mach/mig_support.h index b027237692..1888d481d2 100644 --- a/sysdeps/mach/include/mach/mig_support.h +++ b/sysdeps/mach/include/mach/mig_support.h @@ -4,5 +4,17 @@ libc_hidden_proto (__mig_get_reply_port) libc_hidden_proto (__mig_dealloc_reply_port) libc_hidden_proto (__mig_init) + +#ifdef _LIBC +# include + +# if defined USE_MULTIARCH && (IS_IN (libmachuser) || IS_IN (libhurduser)) +/* Avoid directly calling ifunc-enabled memcpy or strpcpy, + because they would introduce a relocation loop between lib*user and + libc.so. */ +# define memcpy(dest, src, n) __mig_memcpy(dest, src, n) +# endif +#endif + #endif #endif