PowerPC: Fix memchr ifunc hidden symbol for PPC32

This patch fixes a similar issue to
736c304a1a, where for PPC32 if the symbol
is defined as hidden (memchr) then compiler will create a local branc
(symbol@local) and the linker will not create a required PLT call to
make the ifunc work.  It changes the default hidden symbol (__GI_memchr)
to default memchr symbol for powerpc32 (__memchr_ppc32).
This commit is contained in:
Adhemerval Zanella 2014-05-22 07:53:44 -05:00
parent df54acbb7b
commit 3d2badacf1
3 changed files with 21 additions and 10 deletions

View File

@ -1,3 +1,10 @@
2014-05-22 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
* sysdeps/powerpc/powerpc32/power4/multiarch/memchr.c (memchr): Remove
libc_hidden_builtin_def to ifunc.
* sysdeps/powerpc/powerpc32/power4/multiarch/memchr-ppc32.c
[libc_hidden_builtin_def]: Define hidden definition to __memchr_ppc32.
2014-05-16 Roland McGrath <roland@hack.frob.com>
* sysdeps/unix/sysv/linux/aarch64/arch-fork.h: New file.

View File

@ -25,7 +25,8 @@
#ifdef SHARED
# undef libc_hidden_builtin_def
# define libc_hidden_builtin_def(name)
# define libc_hidden_builtin_def(name) \
__hidden_ver1(__memchr_ppc, __GI_memchr, __memchr_ppc);
#endif
extern __typeof (memchr) __memchr_ppc attribute_hidden;

View File

@ -17,22 +17,25 @@
<http://www.gnu.org/licenses/>. */
#ifndef NOT_IN_libc
# undef memcpy
/* Redefine memchr so that the compiler won't make the weak_alias point
to internal hidden definition (__GI_memchr), since PPC32 does not
support local IFUNC calls. */
# define memchr __redirect_memchr
# include <string.h>
# include <shlib-compat.h>
# include "init-arch.h"
extern __typeof (__memchr) __memchr_ppc attribute_hidden;
extern __typeof (__memchr) __memchr_power7 attribute_hidden;
extern __typeof (__redirect_memchr) __memchr_ppc attribute_hidden;
extern __typeof (__redirect_memchr) __memchr_power7 attribute_hidden;
/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
ifunc symbol properly. */
libc_ifunc (__memchr,
extern __typeof (__redirect_memchr) __libc_memchr;
libc_ifunc (__libc_memchr,
(hwcap & PPC_FEATURE_HAS_VSX)
? __memchr_power7
: __memchr_ppc);
weak_alias (__memchr, memchr)
libc_hidden_builtin_def (memchr)
#undef memchr
weak_alias (__libc_memchr, memchr)
#else
#include <string/memchr.c>
#endif