From patchwork Fri Feb 6 20:19:59 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roland McGrath X-Patchwork-Id: 4947 Received: (qmail 12678 invoked by alias); 6 Feb 2015 20:20:02 -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 12660 invoked by uid 89); 6 Feb 2015 20:20:02 -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 autolearn=ham version=3.3.2 X-HELO: topped-with-meat.com MIME-Version: 1.0 From: Roland McGrath To: "GNU C. Library" Subject: [COMMITTED PATCH 3/3] Clean up NPTL system to be compat-only. In-Reply-To: Roland McGrath's message of Friday, 6 February 2015 12:18:43 -0800 <20150206201843.AD5922C3A9B@topped-with-meat.com> References: <20150206201843.AD5922C3A9B@topped-with-meat.com> Message-Id: <20150206201959.11F222C3A94@topped-with-meat.com> Date: Fri, 6 Feb 2015 12:19:59 -0800 (PST) X-CMAE-Score: 0 X-CMAE-Analysis: v=2.1 cv=SvUDtp+0 c=1 sm=1 tr=0 a=WkljmVdYkabdwxfqvArNOQ==:117 a=14OXPxybAAAA:8 a=kj9zAlcOel0A:10 a=hOe2yjtxAAAA:8 a=20KFwNOVAAAA:8 a=mDV3o1hIAAAA:8 a=fjTP2tYMUy7oNPwVvZEA:9 a=CjuIK1q_8ugA:10 I don't know if there was a historical reason for libpthread to have a system wrapper, but there is certainly none in the current code. This change makes it compat-only. Tested x86_64-linux-gnu. Thanks, Roland * nptl/pt-system.c: Rewritten. Put everything under [SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_22)]. Use IFUNC to redirect when possible. --- a/nptl/pt-system.c +++ b/nptl/pt-system.c @@ -1,4 +1,5 @@ -/* Copyright (C) 2002-2015 Free Software Foundation, Inc. +/* ABI compatibility for 'system' symbol in libpthread ABI. + Copyright (C) 2002-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -16,17 +17,48 @@ License along with the GNU C Library; if not, see . */ -#include #include -#include -#include "pthreadP.h" +#include +/* libpthread once had its own 'system', though there was no apparent + reason for it. There is no use in having a separate symbol in + libpthread, but the historical ABI requires it. For static linking, + there is no need to provide anything here--the libc version will be + linked in. For shared library ABI compatibility, there must be a + 'system' symbol in libpthread.so; so we define it using IFUNC to + redirect to the libc function. */ -int -system (const char *line) +#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_22) + +# if HAVE_IFUNC + +static __typeof (system) * +__attribute__ ((used)) +system_resolve (void) +{ + return &__libc_system; +} + +asm (".globl system_ifunc\n" + ".type system_ifunc, %gnu_indirect_function"); + +# ifdef HAVE_ASM_SET_DIRECTIVE +asm (".set system_ifunc, system_resolve"); +# else +asm ("system_ifunc = system_resolve"); +# endif + +# else /* !HAVE_IFUNC */ + +static int __attribute__ ((used)) +system_compat (const char *line) { return __libc_system (line); } +strong_alias (system_compat, system_ifunc) + +# endif /* HAVE_IFUNC */ + +compat_symbol (libpthread, system_ifunc, system, GLIBC_2_0); -/* __libc_system in libc.so handles cancellation. */ -LIBC_CANCEL_HANDLED (); +#endif