From 8c28bbc6d989575388ac42e00ee852fc3666bb5f Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Fri, 6 Feb 2015 10:53:38 -0800 Subject: Clean up NPTL system to be compat-only. --- nptl/pt-system.c | 48 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) (limited to 'nptl') diff --git a/nptl/pt-system.c b/nptl/pt-system.c index 795c5a0..389581f 100644 --- 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 -- cgit v1.1