]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
S390: Do not call memcpy, memcmp, memset within libc.so via ifunc-plt.
authorStefan Liebler <stli@linux.vnet.ibm.com>
Tue, 24 May 2016 08:39:13 +0000 (10:39 +0200)
committerStefan Liebler <stli@linux.vnet.ibm.com>
Tue, 24 May 2016 08:39:13 +0000 (10:39 +0200)
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.

ChangeLog
sysdeps/s390/multiarch/ifunc-resolve.h
sysdeps/s390/s390-32/multiarch/memcmp-s390.S
sysdeps/s390/s390-32/multiarch/memcpy-s390.S
sysdeps/s390/s390-32/multiarch/memset-s390.S
sysdeps/s390/s390-64/multiarch/memcmp-s390x.S
sysdeps/s390/s390-64/multiarch/memcpy-s390x.S
sysdeps/s390/s390-64/multiarch/memset-s390x.S

index 1bacd7172e9c87a1666476ec39369fa966e959d5..1054ca771fbc8136be60a28e98ac3f3c005e49b5 100644 (file)
--- a/ChangeLog
+++ b/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>
 
        * sysdeps/s390/s390-64/memcpy.S (memcpy):
index 744a0d8d6dc9e536f67cd3a66ef833431fd7bccf..26e097ad6e00525b42d3b0330d80c0357def37fc 100644 (file)
@@ -44,9 +44,7 @@
 #define s390_libc_ifunc(FUNC)                                          \
   __asm__ (".globl " #FUNC "\n\t"                                      \
           ".type  " #FUNC ",@gnu_indirect_function\n\t"                \
-          ".set   " #FUNC ",__resolve_" #FUNC "\n\t"                   \
-          ".globl __GI_" #FUNC "\n\t"                                  \
-          ".set   __GI_" #FUNC "," #FUNC "\n");                        \
+          ".set   " #FUNC ",__resolve_" #FUNC "\n\t");                 \
                                                                        \
   /* Make the declarations of the optimized functions hidden in order
      to prevent GOT slots being generated for them. */                 \
index e9ee6d22702efbe14b8812c142e4fbd8bd1b585b..a01f3b748d50ec5486e9df36a5c79baa11cfae75 100644 (file)
@@ -101,4 +101,7 @@ END(__memcmp_z10)
 .set     memcmp,__memcmp_default
 .weak    bcmp
 .set    bcmp,__memcmp_default
+#elif defined SHARED && IS_IN (libc)
+.globl   __GI_memcmp
+.set     __GI_memcmp,__memcmp_default
 #endif
index 4e30cdf6c63c7eeb40661fc38b94583e035dcb42..92ffaea5edcc8c9438b8a93b3496a9bb6dc069b3 100644 (file)
@@ -92,7 +92,10 @@ END(__memcpy_z10)
 
 #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
 .set     memcpy,__memcpy_default
 #endif
index 47277c13a6a21dcfe3f6d2d6498d53f32e2438b2..a2ddd98afea8baf1e67b767d57b3819226b5de1e 100644 (file)
@@ -110,4 +110,7 @@ END(__memset_mvcle)
 #if !IS_IN (libc)
 .globl   memset
 .set     memset,__memset_default
+#elif defined SHARED && IS_IN (libc)
+.globl   __GI_memset
+.set     __GI_memset,__memset_default
 #endif
index 2a4c0ae9a61ffc714e89df9a3a91139d2ac52a56..b28ccaf3b1dd305d4b96927ea79b30d2f9d41bd2 100644 (file)
@@ -98,4 +98,7 @@ END(__memcmp_z10)
 .set     memcmp,__memcmp_default
 .weak    bcmp
 .set    bcmp,__memcmp_default
+#elif defined SHARED && IS_IN (libc)
+.globl   __GI_memcmp
+.set     __GI_memcmp,__memcmp_default
 #endif
index 69fa562060b472ff8813a95e7c713550c92de019..8f54526b76f458d1cde8822c7c0f16df8f06d65e 100644 (file)
@@ -88,7 +88,10 @@ END(__memcpy_z10)
 
 #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
 .set     memcpy,__memcpy_default
 #endif
index 05e068279dd0d1d55a36910f652b743e25ab608b..a77e798a04866deb86e01b0922f2786f1d806b81 100644 (file)
@@ -106,4 +106,7 @@ END(__memset_mvcle)
 #if !IS_IN (libc)
 .globl   memset
 .set     memset,__memset_default
+#elif defined SHARED && IS_IN (libc)
+.globl   __GI_memset
+.set     __GI_memset,__memset_default
 #endif