mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-08 17:42:12 +03:00
S390: Do not call memcpy, memcmp, memset within libc.so via ifunc-plt.
On s390, the memcpy, memcmp, memset functions are IFUNC symbols, which are created with s390_libc_ifunc-macro. This macro creates a __GI_ symbol which is set to the ifunced symbol. Thus calls within libc.so to e.g. memcpy result in a call to *ABS*+0x954c0@plt stub and afterwards to the resolved memcpy-ifunc-variant. This patch sets the __GI_ symbol to the default-ifunc-variant to avoid the plt call. The __GI_ symbols are now created at the default variant of ifunced function. ChangeLog: * sysdeps/s390/multiarch/ifunc-resolve.h (s390_libc_ifunc): Remove __GI_ symbol. * sysdeps/s390/s390-32/multiarch/memcmp-s390.S: Add __GI_memcmp symbol. * sysdeps/s390/s390-64/multiarch/memcmp-s390x.S: Likewise. * sysdeps/s390/s390-32/multiarch/memcpy-s390.S: Add __GI_memcpy symbol. * sysdeps/s390/s390-64/multiarch/memcpy-s390x.S: Likewise. * sysdeps/s390/s390-32/multiarch/memset-s390.S: Add __GI_memset symbol. * sysdeps/s390/s390-64/multiarch/memset-s390x.S: Likewise.
This commit is contained in:
11
ChangeLog
11
ChangeLog
@@ -1,3 +1,14 @@
|
|||||||
|
2016-05-24 Stefan Liebler <stli@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
* sysdeps/s390/multiarch/ifunc-resolve.h (s390_libc_ifunc):
|
||||||
|
Remove __GI_ symbol.
|
||||||
|
* sysdeps/s390/s390-32/multiarch/memcmp-s390.S: Add __GI_memcmp symbol.
|
||||||
|
* sysdeps/s390/s390-64/multiarch/memcmp-s390x.S: Likewise.
|
||||||
|
* sysdeps/s390/s390-32/multiarch/memcpy-s390.S: Add __GI_memcpy symbol.
|
||||||
|
* sysdeps/s390/s390-64/multiarch/memcpy-s390x.S: Likewise.
|
||||||
|
* sysdeps/s390/s390-32/multiarch/memset-s390.S: Add __GI_memset symbol.
|
||||||
|
* sysdeps/s390/s390-64/multiarch/memset-s390x.S: Likewise.
|
||||||
|
|
||||||
2016-05-24 Stefan Liebler <stli@linux.vnet.ibm.com>
|
2016-05-24 Stefan Liebler <stli@linux.vnet.ibm.com>
|
||||||
|
|
||||||
* sysdeps/s390/s390-64/memcpy.S (memcpy):
|
* sysdeps/s390/s390-64/memcpy.S (memcpy):
|
||||||
|
@@ -44,9 +44,7 @@
|
|||||||
#define s390_libc_ifunc(FUNC) \
|
#define s390_libc_ifunc(FUNC) \
|
||||||
__asm__ (".globl " #FUNC "\n\t" \
|
__asm__ (".globl " #FUNC "\n\t" \
|
||||||
".type " #FUNC ",@gnu_indirect_function\n\t" \
|
".type " #FUNC ",@gnu_indirect_function\n\t" \
|
||||||
".set " #FUNC ",__resolve_" #FUNC "\n\t" \
|
".set " #FUNC ",__resolve_" #FUNC "\n\t"); \
|
||||||
".globl __GI_" #FUNC "\n\t" \
|
|
||||||
".set __GI_" #FUNC "," #FUNC "\n"); \
|
|
||||||
\
|
\
|
||||||
/* Make the declarations of the optimized functions hidden in order
|
/* Make the declarations of the optimized functions hidden in order
|
||||||
to prevent GOT slots being generated for them. */ \
|
to prevent GOT slots being generated for them. */ \
|
||||||
|
@@ -101,4 +101,7 @@ END(__memcmp_z10)
|
|||||||
.set memcmp,__memcmp_default
|
.set memcmp,__memcmp_default
|
||||||
.weak bcmp
|
.weak bcmp
|
||||||
.set bcmp,__memcmp_default
|
.set bcmp,__memcmp_default
|
||||||
|
#elif defined SHARED && IS_IN (libc)
|
||||||
|
.globl __GI_memcmp
|
||||||
|
.set __GI_memcmp,__memcmp_default
|
||||||
#endif
|
#endif
|
||||||
|
@@ -92,7 +92,10 @@ END(__memcpy_z10)
|
|||||||
|
|
||||||
#include "../memcpy.S"
|
#include "../memcpy.S"
|
||||||
|
|
||||||
#if !defined SHARED || !IS_IN (libc)
|
#if defined SHARED && IS_IN (libc)
|
||||||
|
.globl __GI_memcpy
|
||||||
|
.set __GI_memcpy,__memcpy_default
|
||||||
|
#else
|
||||||
.globl memcpy
|
.globl memcpy
|
||||||
.set memcpy,__memcpy_default
|
.set memcpy,__memcpy_default
|
||||||
#endif
|
#endif
|
||||||
|
@@ -110,4 +110,7 @@ END(__memset_mvcle)
|
|||||||
#if !IS_IN (libc)
|
#if !IS_IN (libc)
|
||||||
.globl memset
|
.globl memset
|
||||||
.set memset,__memset_default
|
.set memset,__memset_default
|
||||||
|
#elif defined SHARED && IS_IN (libc)
|
||||||
|
.globl __GI_memset
|
||||||
|
.set __GI_memset,__memset_default
|
||||||
#endif
|
#endif
|
||||||
|
@@ -98,4 +98,7 @@ END(__memcmp_z10)
|
|||||||
.set memcmp,__memcmp_default
|
.set memcmp,__memcmp_default
|
||||||
.weak bcmp
|
.weak bcmp
|
||||||
.set bcmp,__memcmp_default
|
.set bcmp,__memcmp_default
|
||||||
|
#elif defined SHARED && IS_IN (libc)
|
||||||
|
.globl __GI_memcmp
|
||||||
|
.set __GI_memcmp,__memcmp_default
|
||||||
#endif
|
#endif
|
||||||
|
@@ -88,7 +88,10 @@ END(__memcpy_z10)
|
|||||||
|
|
||||||
#include "../memcpy.S"
|
#include "../memcpy.S"
|
||||||
|
|
||||||
#if !defined SHARED || !IS_IN (libc)
|
#if defined SHARED && IS_IN (libc)
|
||||||
|
.globl __GI_memcpy
|
||||||
|
.set __GI_memcpy,__memcpy_default
|
||||||
|
#else
|
||||||
.globl memcpy
|
.globl memcpy
|
||||||
.set memcpy,__memcpy_default
|
.set memcpy,__memcpy_default
|
||||||
#endif
|
#endif
|
||||||
|
@@ -106,4 +106,7 @@ END(__memset_mvcle)
|
|||||||
#if !IS_IN (libc)
|
#if !IS_IN (libc)
|
||||||
.globl memset
|
.globl memset
|
||||||
.set memset,__memset_default
|
.set memset,__memset_default
|
||||||
|
#elif defined SHARED && IS_IN (libc)
|
||||||
|
.globl __GI_memset
|
||||||
|
.set __GI_memset,__memset_default
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user