]> sourceware.org Git - glibc.git/commitdiff
Use libc_hidden_proto / libc_hidden_def with __strnlen.
authorJoseph Myers <joseph@codesourcery.com>
Tue, 2 Jun 2015 20:24:25 +0000 (20:24 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Tue, 2 Jun 2015 20:24:25 +0000 (20:24 +0000)
Various code in glibc uses __strnlen instead of strnlen for namespace
reasons.  However, __strnlen does not use libc_hidden_proto /
libc_hidden_def (as is normally done for any function defined and
called within the same library, whether or not exported from the
library and whatever namespace it is in), so the compiler does not
know that those calls are to a function within libc.

This patch uses libc_hidden_proto / libc_hidden_def with __strnlen.
On x86_64, it makes no difference to the installed stripped shared
libraries.  On 32-bit x86, it causes __strnlen calls to go to the same
place as strnlen calls (the fallback strnlen implementation), rather
than through a PLT entry for the strnlen IFUNC; I'm not sure of the
logic behind when calls from within libc should use IFUNCs versus when
they should go direct to a particular function implementation, but
clearly it doesn't make sense for strnlen and __strnlen to be handled
differently in this regard.

Tested for x86_64 and x86 (testsuite, and comparison of installed
shared libraries as described above).

* string/strnlen.c [!STRNLEN] (__strnlen): Use libc_hidden_def.
* include/string.h (__strnlen): Use libc_hidden_proto.
* sysdeps/aarch64/strnlen.S (__strnlen): Use libc_hidden_def.
* sysdeps/i386/i686/multiarch/strnlen-c.c [SHARED]
(libc_hidden_def): Define __GI___strnlen as well as __GI_strnlen.
* sysdeps/powerpc/powerpc32/power4/multiarch/strnlen-power7.S
(libc_hidden_def): Undefine and redefine.
* sysdeps/powerpc/powerpc32/power4/multiarch/strnlen-ppc32.c
[SHARED] (libc_hidden_def): Define __GI___strnlen as well as
__GI_strnlen.
* sysdeps/powerpc/powerpc32/power7/strnlen.S (__strnlen): Use
libc_hidden_def.
* sysdeps/tile/tilegx/strnlen.c (__strnlen): Likewise.

ChangeLog
include/string.h
string/strnlen.c
sysdeps/aarch64/strnlen.S
sysdeps/i386/i686/multiarch/strnlen-c.c
sysdeps/powerpc/powerpc32/power4/multiarch/strnlen-power7.S
sysdeps/powerpc/powerpc32/power4/multiarch/strnlen-ppc32.c
sysdeps/powerpc/powerpc32/power7/strnlen.S
sysdeps/tile/tilegx/strnlen.c

index 9182ed9adae5a0f8667e051848bb1d9d891e9c08..1c67d9977eb06427654ca33846d9a0c2506642ae 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
 2015-06-02  Joseph Myers  <joseph@codesourcery.com>
 
+       * string/strnlen.c [!STRNLEN] (__strnlen): Use libc_hidden_def.
+       * include/string.h (__strnlen): Use libc_hidden_proto.
+       * sysdeps/aarch64/strnlen.S (__strnlen): Use libc_hidden_def.
+       * sysdeps/i386/i686/multiarch/strnlen-c.c [SHARED]
+       (libc_hidden_def): Define __GI___strnlen as well as __GI_strnlen.
+       * sysdeps/powerpc/powerpc32/power4/multiarch/strnlen-power7.S
+       (libc_hidden_def): Undefine and redefine.
+       * sysdeps/powerpc/powerpc32/power4/multiarch/strnlen-ppc32.c
+       [SHARED] (libc_hidden_def): Define __GI___strnlen as well as
+       __GI_strnlen.
+       * sysdeps/powerpc/powerpc32/power7/strnlen.S (__strnlen): Use
+       libc_hidden_def.
+       * sysdeps/tile/tilegx/strnlen.c (__strnlen): Likewise.
+
        [BZ #18469]
        * wctype/wcfuncs.c (towlower): Rename to __towlower and define as
        weak alias of __towlower.  Use libc_hidden_weak.
index 89f00fda4ed4d5e3731b02c9d92cec60a1b4e9a4..c57671ea6311163d788b31a0f1dcb333250757eb 100644 (file)
@@ -91,6 +91,7 @@ libc_hidden_proto (__strtok_r)
 extern char *__strsep_g (char **__stringp, const char *__delim);
 libc_hidden_proto (__strsep_g)
 libc_hidden_proto (strnlen)
+libc_hidden_proto (__strnlen)
 libc_hidden_proto (memmem)
 extern __typeof (memmem) __memmem;
 libc_hidden_proto (__memmem)
index 803d78b7d565126437f69deef4ff9899a706f3be..d2bb843fddbf93eebb857cd0896cb3441bafa431 100644 (file)
@@ -160,6 +160,7 @@ __strnlen (const char *str, size_t maxlen)
   return char_ptr - str;
 }
 #ifndef STRNLEN
+libc_hidden_def (__strnlen)
 weak_alias (__strnlen, strnlen)
 #endif
 libc_hidden_def (strnlen)
index 743172cb4759a37be32e03eea711ab5c434a5418..9d6b19f68574d81510db8b5cc4b7cdadde36d3b1 100644 (file)
@@ -157,5 +157,6 @@ L(hit_limit):
        mov     len, limit
        RET
 END (__strnlen)
+libc_hidden_def (__strnlen)
 weak_alias (__strnlen, strnlen)
 libc_hidden_def (strnlen)
index f02465d6a47ec04275562b3f85e2dbfa64aadbea..351e939a934e2e2ade3d2a622e48cd2c1f508976 100644 (file)
@@ -2,7 +2,9 @@
 #ifdef SHARED
 # undef libc_hidden_def
 # define libc_hidden_def(name)  \
-    __hidden_ver1 (__strnlen_ia32, __GI_strnlen, __strnlen_ia32);
+    __hidden_ver1 (__strnlen_ia32, __GI_strnlen, __strnlen_ia32); \
+    strong_alias (__strnlen_ia32, __strnlen_ia32_1); \
+    __hidden_ver1 (__strnlen_ia32_1, __GI___strnlen, __strnlen_ia32_1);
 #endif
 
 #include "string/strnlen.c"
index 32fba1b5f3951a5c3251815e01df7979f100f874..e8577545deb9516106e1060354c9a84a2b590ac9 100644 (file)
@@ -31,6 +31,9 @@
  cfi_endproc;                                                  \
  ASM_SIZE_DIRECTIVE(__strnlen_power7)
 
+#undef libc_hidden_def
+#define libc_hidden_def(name)
+
 #undef libc_hidden_builtin_def
 #define libc_hidden_builtin_def(name)
 
index 6eaed608db9f04dbcf03d50dab430179cb35cd1e..a5f75160c23070b714a174f04bdeb13fed9c8067 100644 (file)
@@ -20,7 +20,9 @@
 #ifdef SHARED
 # undef libc_hidden_def
 # define libc_hidden_def(name)  \
-    __hidden_ver1 (__strnlen_ppc, __GI_strnlen, __strnlen_ppc);
+    __hidden_ver1 (__strnlen_ppc, __GI_strnlen, __strnlen_ppc); \
+    strong_alias (__strnlen_ppc, __strnlen_ppc_1); \
+    __hidden_ver1 (__strnlen_ppc_1, __GI___strnlen, __strnlen_ppc_1);
 #endif
 
 #include <string/strnlen.c>
index be169c6ab53e603cf80267166a43d66f6eeeb7dd..de1001cfa3896bb7f1187fdfe4c599ac6c323ea9 100644 (file)
@@ -171,5 +171,6 @@ L(loop_small):
        blr
 
 END (__strnlen)
+libc_hidden_def (__strnlen)
 weak_alias (__strnlen, strnlen)
 libc_hidden_builtin_def (strnlen)
index 575f8f55c7127c06a6068134cccc133a1961b805..d1f212b72f7c6c2b568b40b7ed3732b6097a6d64 100644 (file)
@@ -52,5 +52,6 @@ __strnlen (const char *s, size_t maxlen)
   size_t len = ((const char *) p) + (CFZ (bits) >> 3) - s;
   return (len < maxlen ? len : maxlen);
 }
+libc_hidden_def (__strnlen)
 weak_alias (__strnlen, strnlen)
 libc_hidden_def (strnlen)
This page took 0.138155 seconds and 5 git commands to generate.