[09/58] Mark internal wchar functions with attribute_hidden [BZ #18822]

Message ID 20170901180029.9527-10-hjl.tools@gmail.com
State Committed
Commit 44af8a32c341672b5160fdc2839767e9a837ad26
Headers

Commit Message

H.J. Lu Sept. 1, 2017, 5:59 p.m. UTC
  Mark internal wchar functions with attribute_hidden to allow direct
access within libc.so and libc.a without using GOT nor PLT.

	[BZ #18822]
	* include/wchar.h (__wcsnlen): Add attribute_hidden.
	(__wcscat): Likewise.
	(__btowc): Likewise.
	(__wcrtomb): Likewise.
	(__mbsrtowcs): Likewise.
	(__wcsrtombs): Likewise.
	(__mbsnrtowcs): Likewise.
	(__wcsnrtombs): Likewise.
	(__wcsncpy): Likewise.
	(__wcpncpy): Likewise.
	(__wmemcpy): Likewise.
	(__wmempcpy): Likewise.
	(__wmemmove): Likewise.
	(__wcschrnul): Likewise.
	(__vfwscanf): Likewise.
	(__vswprintf): Likewise.
	(__fwprintf): Likewise.
	(__vfwprintf): Likewise.
---
 include/wchar.h | 38 ++++++++++++++++++++++++--------------
 1 file changed, 24 insertions(+), 14 deletions(-)
  

Comments

H.J. Lu Oct. 1, 2017, 9:45 p.m. UTC | #1
On 9/1/17, H.J. Lu <hjl.tools@gmail.com> wrote:
> Mark internal wchar functions with attribute_hidden to allow direct
> access within libc.so and libc.a without using GOT nor PLT.
>
> 	[BZ #18822]
> 	* include/wchar.h (__wcsnlen): Add attribute_hidden.
> 	(__wcscat): Likewise.
> 	(__btowc): Likewise.
> 	(__wcrtomb): Likewise.
> 	(__mbsrtowcs): Likewise.
> 	(__wcsrtombs): Likewise.
> 	(__mbsnrtowcs): Likewise.
> 	(__wcsnrtombs): Likewise.
> 	(__wcsncpy): Likewise.
> 	(__wcpncpy): Likewise.
> 	(__wmemcpy): Likewise.
> 	(__wmempcpy): Likewise.
> 	(__wmemmove): Likewise.
> 	(__wcschrnul): Likewise.
> 	(__vfwscanf): Likewise.
> 	(__vswprintf): Likewise.
> 	(__fwprintf): Likewise.
> 	(__vfwprintf): Likewise.

Tested with build-many-glibcs.py.  I am checking it in.
  
Stefan Liebler Nov. 13, 2017, 10:16 a.m. UTC | #2
On 09/01/2017 07:59 PM, H.J. Lu wrote:
> Mark internal wchar functions with attribute_hidden to allow direct
> access within libc.so and libc.a without using GOT nor PLT.

On s390 (31bit) various debug/tst-*chk* testcases are failing as the 
tests are ending with a segmentation fault.
As some of the wchar functions are IFUNC, those are called via PLT,
but r12 is not loaded with the GOT-pointer. Then it e.g. branches to 
address zero which leads to the segmentation fault.

Please have a look at the patch "Use libc_hidden_proto / _def for hidden 
wchar ifunc symbols." 
(https://www.sourceware.org/ml/libc-alpha/2017-11/msg00391.html).

Bye.
Stefan
  

Patch

diff --git a/include/wchar.h b/include/wchar.h
index eb472daefb..24b2eaa5f9 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -152,9 +152,10 @@  extern int __wcsncasecmp (const wchar_t *__s1, const wchar_t *__s2,
      __attribute_pure__;
 extern size_t __wcslen (const wchar_t *__s) __attribute_pure__;
 extern size_t __wcsnlen (const wchar_t *__s, size_t __maxlen)
-     __attribute_pure__;
-extern wchar_t *__wcscat (wchar_t *dest, const wchar_t *src);
-extern wint_t __btowc (int __c);
+     attribute_hidden __attribute_pure__;
+extern wchar_t *__wcscat (wchar_t *dest, const wchar_t *src)
+     attribute_hidden;
+extern wint_t __btowc (int __c) attribute_hidden;
 extern int __mbsinit (const __mbstate_t *__ps);
 extern size_t __mbrtowc (wchar_t *__restrict __pwc,
 			 const char *__restrict __s, size_t __n,
@@ -162,34 +163,39 @@  extern size_t __mbrtowc (wchar_t *__restrict __pwc,
 libc_hidden_proto (__mbrtowc)
 libc_hidden_proto (__mbrlen)
 extern size_t __wcrtomb (char *__restrict __s, wchar_t __wc,
-			 __mbstate_t *__restrict __ps);
+			 __mbstate_t *__restrict __ps) attribute_hidden;
 extern size_t __mbsrtowcs (wchar_t *__restrict __dst,
 			   const char **__restrict __src,
-			   size_t __len, __mbstate_t *__restrict __ps);
+			   size_t __len, __mbstate_t *__restrict __ps)
+     attribute_hidden;
 extern size_t __wcsrtombs (char *__restrict __dst,
 			   const wchar_t **__restrict __src,
-			   size_t __len, __mbstate_t *__restrict __ps);
+			   size_t __len, __mbstate_t *__restrict __ps)
+     attribute_hidden;
 extern size_t __mbsnrtowcs (wchar_t *__restrict __dst,
 			    const char **__restrict __src, size_t __nmc,
-			    size_t __len, __mbstate_t *__restrict __ps);
+			    size_t __len, __mbstate_t *__restrict __ps)
+     attribute_hidden;
 extern size_t __wcsnrtombs (char *__restrict __dst,
 			    const wchar_t **__restrict __src,
 			    size_t __nwc, size_t __len,
-			    __mbstate_t *__restrict __ps);
+			    __mbstate_t *__restrict __ps)
+     attribute_hidden;
 extern wchar_t *__wcsncpy (wchar_t *__restrict __dest,
-			   const wchar_t *__restrict __src, size_t __n);
+			   const wchar_t *__restrict __src, size_t __n)
+     attribute_hidden;
 extern wchar_t *__wcpcpy (wchar_t *__dest, const wchar_t *__src);
 extern wchar_t *__wcpncpy (wchar_t *__dest, const wchar_t *__src,
-			   size_t __n);
+			   size_t __n) attribute_hidden;
 extern wchar_t *__wmemcpy (wchar_t *__s1, const wchar_t *s2,
-			   size_t __n);
+			   size_t __n) attribute_hidden;
 extern wchar_t *__wmempcpy (wchar_t *__restrict __s1,
 			    const wchar_t *__restrict __s2,
-			    size_t __n);
+			    size_t __n) attribute_hidden;
 extern wchar_t *__wmemmove (wchar_t *__s1, const wchar_t *__s2,
-			    size_t __n);
+			    size_t __n) attribute_hidden;
 extern wchar_t *__wcschrnul (const wchar_t *__s, wchar_t __wc)
-     __attribute_pure__;
+     attribute_hidden __attribute_pure__;
 
 extern wchar_t *__wmemset_chk (wchar_t *__s, wchar_t __c, size_t __n,
 			       size_t __ns) __THROW;
@@ -197,17 +203,21 @@  extern wchar_t *__wmemset_chk (wchar_t *__s, wchar_t __c, size_t __n,
 extern int __vfwscanf (__FILE *__restrict __s,
 		       const wchar_t *__restrict __format,
 		       __gnuc_va_list __arg)
+     attribute_hidden
      /* __attribute__ ((__format__ (__wscanf__, 2, 0)) */;
 extern int __vswprintf (wchar_t *__restrict __s, size_t __n,
 			const wchar_t *__restrict __format,
 			__gnuc_va_list __arg)
+     attribute_hidden
      /* __attribute__ ((__format__ (__wprintf__, 3, 0))) */;
 extern int __fwprintf (__FILE *__restrict __s,
 		       const wchar_t *__restrict __format, ...)
+     attribute_hidden
      /* __attribute__ ((__format__ (__wprintf__, 2, 3))) */;
 extern int __vfwprintf (__FILE *__restrict __s,
 			const wchar_t *__restrict __format,
 			__gnuc_va_list __arg)
+     attribute_hidden
      /* __attribute__ ((__format__ (__wprintf__, 2, 0))) */;
 extern int __vfwprintf_chk (FILE *__restrict __s, int __flag,
 			    const wchar_t *__restrict __format,