From 1ef9b6e0bf1268050e74087c4f6bd056263a28c7 Mon Sep 17 00:00:00 2001 From: Tulio Magno Quites Machado Filho Date: Sun, 20 Oct 2019 16:00:30 -0500 Subject: Do not redirect calls to __GI_* symbols, when redirecting to *ieee128 On platforms where long double has IEEE binary128 format as a third option (initially, only powerpc64le), many exported functions are redirected to their __*ieee128 equivalents. This redirection is provided by installed headers such as stdio-ldbl.h, and is supposed to work correctly with user code. However, during the build of glibc, similar redirections are employed, in internal headers, such as include/stdio.h, in order to avoid extra PLT entries. These redirections conflict with the redirections to __*ieee128, and must be avoided during the build. This patch protects the second redirections with a test for __LONG_DOUBLE_USES_FLOAT128, a new macro that is defined to 1 when functions that deal with long double typed values reuses the _Float128 implementation (this is currently only true for powerpc64le). Tested for powerpc64le, x86_64, and with build-many-glibcs.py. Co-authored-by: Gabriel F. T. Gomes Reviewed-by: Florian Weimer --- include/stdio.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'include/stdio.h') diff --git a/include/stdio.h b/include/stdio.h index bea2066..dffa776 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -13,7 +13,9 @@ extern int __fcloseall (void) attribute_hidden; extern int __snprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, ...) __attribute__ ((__format__ (__printf__, 3, 4))); +# if __LONG_DOUBLE_USES_FLOAT128 == 0 libc_hidden_proto (__snprintf) +# endif extern int __vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) @@ -72,7 +74,8 @@ libc_hidden_proto (__isoc99_vfscanf) Unfortunately, symbol redirection is not transitive, so the __REDIRECT in the public header does not link up with the above libc_hidden_proto. Bridge the gap with a macro. */ -# if !__GLIBC_USE (DEPRECATED_SCANF) +# if !__GLIBC_USE (DEPRECATED_SCANF) \ + && __LONG_DOUBLE_USES_FLOAT128 == 0 # undef sscanf # define sscanf __isoc99_sscanf # endif @@ -150,7 +153,9 @@ libc_hidden_proto (__libc_readline_unlocked); extern const char *const _sys_errlist_internal[] attribute_hidden; extern int _sys_nerr_internal attribute_hidden; +#if __LONG_DOUBLE_USES_FLOAT128 == 0 libc_hidden_proto (__asprintf) +#endif # if IS_IN (libc) extern FILE *_IO_new_fopen (const char*, const char*); # define fopen(fname, mode) _IO_new_fopen (fname, mode) @@ -171,13 +176,15 @@ extern int _IO_new_fgetpos (FILE *, __fpos_t *); # define fgetpos(fp, posp) _IO_new_fgetpos (fp, posp) # endif -libc_hidden_proto (dprintf) extern __typeof (dprintf) __dprintf __attribute__ ((__format__ (__printf__, 2, 3))); libc_hidden_proto (__dprintf) +#if __LONG_DOUBLE_USES_FLOAT128 == 0 +libc_hidden_proto (dprintf) libc_hidden_proto (fprintf) libc_hidden_proto (vfprintf) libc_hidden_proto (sprintf) +#endif libc_hidden_proto (fwrite) libc_hidden_proto (perror) libc_hidden_proto (remove) -- cgit v1.1