diff options
author | Zack Weinberg <zackw@panix.com> | 2017-12-27 12:56:04 -0500 |
---|---|---|
committer | Zack Weinberg <zackw@panix.com> | 2017-12-27 12:56:04 -0500 |
commit | db922eaf0d7df3b917b6b693081219ca6065ec9e (patch) | |
tree | f1320cf66747a8554eeddf2503ff1f14abe578da | |
parent | 7959f855a7c739602a2227c85563650b28d8a0cf (diff) |
Fix problems found by build-many-glibcs.zack/libio-minimization
Most of these have something to do with either old stdio or ldbl-opt.
The changes surrounding PLT bypass for ldbl-affected symbols are a bit
of a bodge but at least they seem to preserve the ABI expectations.
* include/libc-symbols.h (hidden_weak_ver, libc_hidden_weak_ver):
New macros.
* sysdeps/generic/math_ldbl_opt.h (ldbl_hidden_weak): New macro.
* sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h: Also add it.
* libio/iovsprintf.c: Use ldbl_hidden_weak to define vsprintf.
* libio/iovsscanf.c: Use ldbl_hidden_weak to define __vsscanf.
* libio/vasprintf.c: Use strong_alias + ldbl_hidden_def to define
__vasprintf.
* libio/vsnprintf.c: Use ldbl_hidden_weak to define __vsnprintf.
* libio/iolibio.h: Add a multiple inclusion guard. Use FILE
instead of _IO_FILE, __fpos_t instead of _IO_fpos_t, __fpos64_t
instead of _IO_fpos64_t, size_t instead of _IO_size_t, BUFSIZ
instead of _IO_BUFSIZ, and __gnuc_va_list instead of _IO_va_list.
Move the definitions of _IO_pos_BAD, _IO_fileno, _IO_clearerr,
_IO_fseek, and _IO_rewind...
* libio/libioP.h: ...here.
* conform/data/stdio.h-data: Use __gnuc_va_list instead of _G_va_list.
* sysdeps/ieee754/ldbl-opt/nldbl-compat.c: Include libioP.h.
* sysdeps/ieee754/ldbl-opt/nldbl-compat.h: Use va_list instead
of _G_va_list. Declare __nldbl__IO_vfscanf by hand.
* sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c: Use __gnuc_va_list
instead of _IO_va_list.
-rw-r--r-- | conform/data/stdio.h-data | 2 | ||||
-rw-r--r-- | include/libc-symbols.h | 6 | ||||
-rw-r--r-- | libio/iolibio.h | 100 | ||||
-rw-r--r-- | libio/iovsprintf.c | 3 | ||||
-rw-r--r-- | libio/iovsscanf.c | 2 | ||||
-rw-r--r-- | libio/libioP.h | 12 | ||||
-rw-r--r-- | libio/vasprintf.c | 3 | ||||
-rw-r--r-- | libio/vsnprintf.c | 2 | ||||
-rw-r--r-- | sysdeps/generic/math_ldbl_opt.h | 1 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h | 2 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-opt/nldbl-compat.c | 1 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-opt/nldbl-compat.h | 19 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c | 2 |
13 files changed, 88 insertions, 67 deletions
diff --git a/conform/data/stdio.h-data b/conform/data/stdio.h-data index f69802cc70..3ef2460661 100644 --- a/conform/data/stdio.h-data +++ b/conform/data/stdio.h-data @@ -41,7 +41,7 @@ type fpos_t #if !defined ISO && !defined ISO99 && !defined ISO11 && !defined POSIX type va_list #else -#define va_list _G_va_list +#define va_list __gnuc_va_list #endif type size_t #if defined XOPEN2K8 || defined POSIX2008 diff --git a/include/libc-symbols.h b/include/libc-symbols.h index 872626274b..0cd459ba5e 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -471,6 +471,8 @@ for linking") extern __typeof (name) __EI_##name \ __attribute__((alias (__hidden_asmname (#local)))) # define hidden_ver(local, name) __hidden_ver1(local, __GI_##name, name); +# define hidden_weak_ver(local, name) \ + __hidden_ver1(local, __GI_##name, name) __attribute__((weak)); # define hidden_data_ver(local, name) hidden_ver(local, name) # define hidden_def(name) __hidden_ver1(__GI_##name, name, name); # define hidden_data_def(name) hidden_def(name) @@ -499,6 +501,7 @@ for linking") # define hidden_def(name) strong_alias (name, __GI_##name) # define hidden_weak(name) hidden_def (name) # define hidden_ver(local, name) strong_alias (local, __GI_##name) +# define hidden_weak_ver(local, name) hidden_ver (local, name) # define hidden_data_def(name) strong_data_alias (name, __GI_##name) # define hidden_data_weak(name) hidden_data_def (name) # define hidden_data_ver(local, name) strong_data_alias (local, __GI_##name) @@ -527,6 +530,7 @@ for linking") # define hidden_weak(name) # define hidden_def(name) # define hidden_ver(local, name) +# define hidden_weak_ver(local, name) # define hidden_data_weak(name) # define hidden_data_def(name) # define hidden_data_ver(local, name) @@ -545,6 +549,7 @@ for linking") # define libc_hidden_nolink_sunrpc(name, version) hidden_nolink (name, libc, version) # endif # define libc_hidden_ver(local, name) hidden_ver (local, name) +# define libc_hidden_weak_ver(local, name) hidden_weak_ver (local, name) # define libc_hidden_data_def(name) hidden_data_def (name) # define libc_hidden_data_weak(name) hidden_data_weak (name) # define libc_hidden_data_ver(local, name) hidden_data_ver (local, name) @@ -554,6 +559,7 @@ for linking") # define libc_hidden_def(name) # define libc_hidden_weak(name) # define libc_hidden_ver(local, name) +# define libc_hidden_weak_ver(local, name) # define libc_hidden_data_def(name) # define libc_hidden_data_weak(name) # define libc_hidden_data_ver(local, name) diff --git a/libio/iolibio.h b/libio/iolibio.h index 621b31cff1..81825bba02 100644 --- a/libio/iolibio.h +++ b/libio/iolibio.h @@ -1,74 +1,76 @@ +#ifndef _IOLIBIO_H +#define _IOLIBIO_H 1 + #include <stdio.h> /* These emulate stdio functionality, but with a different name - (_IO_ungetc instead of ungetc), and using _IO_FILE instead of FILE. */ + (_IO_ungetc instead of ungetc). */ #ifdef __cplusplus extern "C" { #endif -extern int _IO_fclose (_IO_FILE*); -extern int _IO_new_fclose (_IO_FILE*); -extern int _IO_old_fclose (_IO_FILE*); -extern _IO_FILE *_IO_fdopen (int, const char*) __THROW; +extern int _IO_fclose (FILE*); +extern int _IO_new_fclose (FILE*); +extern int _IO_old_fclose (FILE*); +extern FILE *_IO_fdopen (int, const char*) __THROW; libc_hidden_proto (_IO_fdopen) -extern _IO_FILE *_IO_old_fdopen (int, const char*) __THROW; -extern _IO_FILE *_IO_new_fdopen (int, const char*) __THROW; -extern int _IO_fflush (_IO_FILE*); +extern FILE *_IO_old_fdopen (int, const char*) __THROW; +extern FILE *_IO_new_fdopen (int, const char*) __THROW; +extern int _IO_fflush (FILE*); libc_hidden_proto (_IO_fflush) -extern int _IO_fgetpos (_IO_FILE*, _IO_fpos_t*); -extern int _IO_fgetpos64 (_IO_FILE*, _IO_fpos64_t*); -extern char* _IO_fgets (char*, int, _IO_FILE*); -extern _IO_FILE *_IO_fopen (const char*, const char*); -extern _IO_FILE *_IO_old_fopen (const char*, const char*); -extern _IO_FILE *_IO_new_fopen (const char*, const char*); -extern _IO_FILE *_IO_fopen64 (const char*, const char*); -extern _IO_FILE *__fopen_internal (const char*, const char*, int) +extern int _IO_fgetpos (FILE*, __fpos_t*); +extern int _IO_fgetpos64 (FILE*, __fpos64_t*); +extern char* _IO_fgets (char*, int, FILE*); +extern FILE *_IO_fopen (const char*, const char*); +extern FILE *_IO_old_fopen (const char*, const char*); +extern FILE *_IO_new_fopen (const char*, const char*); +extern FILE *_IO_fopen64 (const char*, const char*); +extern FILE *__fopen_internal (const char*, const char*, int) attribute_hidden; -extern _IO_FILE *__fopen_maybe_mmap (_IO_FILE *) __THROW attribute_hidden; -extern int _IO_fprintf (_IO_FILE*, const char*, ...); -extern int _IO_fputs (const char*, _IO_FILE*); +extern FILE *__fopen_maybe_mmap (FILE *) __THROW attribute_hidden; +extern int _IO_fprintf (FILE*, const char*, ...); +extern int _IO_fputs (const char*, FILE*); libc_hidden_proto (_IO_fputs) -extern int _IO_fsetpos (_IO_FILE*, const _IO_fpos_t *); -extern int _IO_fsetpos64 (_IO_FILE*, const _IO_fpos64_t *); -extern long int _IO_ftell (_IO_FILE*); +extern int _IO_fsetpos (FILE*, const __fpos_t *); +extern int _IO_fsetpos64 (FILE*, const __fpos64_t *); +extern long int _IO_ftell (FILE*); libc_hidden_proto (_IO_ftell) -extern _IO_size_t _IO_fread (void*, _IO_size_t, _IO_size_t, _IO_FILE*); +extern size_t _IO_fread (void*, size_t, size_t, FILE*); libc_hidden_proto (_IO_fread) -extern _IO_size_t _IO_fwrite (const void*, _IO_size_t, _IO_size_t, _IO_FILE*); +extern size_t _IO_fwrite (const void*, size_t, size_t, FILE*); libc_hidden_proto (_IO_fwrite) extern char* _IO_gets (char*); extern void _IO_perror (const char*) __THROW; extern int _IO_printf (const char*, ...); extern int _IO_puts (const char*); extern int _IO_scanf (const char*, ...); -extern void _IO_setbuffer (_IO_FILE *, char*, _IO_size_t) __THROW; +extern void _IO_setbuffer (FILE *, char*, size_t) __THROW; libc_hidden_proto (_IO_setbuffer) -extern int _IO_setvbuf (_IO_FILE*, char*, int, _IO_size_t) __THROW; +extern int _IO_setvbuf (FILE*, char*, int, size_t) __THROW; libc_hidden_proto (_IO_setvbuf) extern int _IO_sscanf (const char*, const char*, ...) __THROW; extern int _IO_sprintf (char *, const char*, ...) __THROW; -extern int _IO_ungetc (int, _IO_FILE*) __THROW; -extern int _IO_vsscanf (const char *, const char *, _IO_va_list) __THROW; -extern int _IO_vsprintf (char*, const char*, _IO_va_list) __THROW; +extern int _IO_ungetc (int, FILE*) __THROW; +extern int _IO_vsscanf (const char *, const char *, __gnuc_va_list) __THROW; +extern int _IO_vsprintf (char*, const char*, __gnuc_va_list) __THROW; libc_hidden_proto (_IO_vsprintf) -extern int _IO_vswprintf (wchar_t*, _IO_size_t, const wchar_t*, _IO_va_list) +extern int _IO_vswprintf (wchar_t*, size_t, const wchar_t*, __gnuc_va_list) __THROW; struct obstack; -extern int _IO_obstack_vprintf (struct obstack *, const char *, _IO_va_list) +extern int _IO_obstack_vprintf (struct obstack *, const char *, __gnuc_va_list) __THROW; extern int _IO_obstack_printf (struct obstack *, const char *, ...) __THROW; -#ifndef _IO_pos_BAD -#define _IO_pos_BAD ((_IO_off64_t)(-1)) -#endif -#define _IO_clearerr(FP) ((FP)->_flags &= ~(_IO_ERR_SEEN|_IO_EOF_SEEN)) -#define _IO_fseek(__fp, __offset, __whence) \ - (_IO_seekoff_unlocked (__fp, __offset, __whence, _IOS_INPUT|_IOS_OUTPUT) \ - == _IO_pos_BAD ? EOF : 0) -#define _IO_rewind(FILE) \ - (void) _IO_seekoff_unlocked (FILE, 0, 0, _IOS_INPUT|_IOS_OUTPUT) -#define _IO_vprintf(FORMAT, ARGS) \ +extern FILE* _IO_popen (const char*, const char*) __THROW; +extern FILE* _IO_new_popen (const char*, const char*) __THROW; +extern FILE* _IO_old_popen (const char*, const char*) __THROW; +extern int __new_pclose (FILE *) __THROW; +extern int __old_pclose (FILE *) __THROW; + +#define _IO_pclose _IO_fclose + +#define _IO_vprintf(FORMAT, ARGS) \ _IO_vfprintf (_IO_stdout, FORMAT, ARGS) #define _IO_freopen(FILENAME, MODE, FP) \ (_IO_file_close_it (FP), \ @@ -78,19 +80,15 @@ extern int _IO_obstack_printf (struct obstack *, const char *, ...) __THROW; #define _IO_freopen64(FILENAME, MODE, FP) \ (_IO_file_close_it (FP), \ _IO_file_fopen (FP, FILENAME, MODE, 0)) -#define _IO_fileno(FP) ((FP)->_fileno) -extern _IO_FILE* _IO_popen (const char*, const char*) __THROW; -extern _IO_FILE* _IO_new_popen (const char*, const char*) __THROW; -extern _IO_FILE* _IO_old_popen (const char*, const char*) __THROW; -extern int __new_pclose (_IO_FILE *) __THROW; -extern int __old_pclose (_IO_FILE *) __THROW; -#define _IO_pclose _IO_fclose -#define _IO_setbuf(_FP, _BUF) _IO_setbuffer (_FP, _BUF, _IO_BUFSIZ) + +#define _IO_setbuf(_FP, _BUF) _IO_setbuffer (_FP, _BUF, BUFSIZ) #define _IO_setlinebuf(_FP) _IO_setvbuf (_FP, NULL, 1, 0) -_IO_FILE *__new_freopen (const char *, const char *, _IO_FILE *) __THROW; -_IO_FILE *__old_freopen (const char *, const char *, _IO_FILE *) __THROW; +FILE *__new_freopen (const char *, const char *, FILE *) __THROW; +FILE *__old_freopen (const char *, const char *, FILE *) __THROW; #ifdef __cplusplus } #endif + +#endif diff --git a/libio/iovsprintf.c b/libio/iovsprintf.c index 63290fb365..d8a7bc7313 100644 --- a/libio/iovsprintf.c +++ b/libio/iovsprintf.c @@ -44,7 +44,6 @@ __IO_vsprintf (char *string, const char *format, _IO_va_list args) return ret; } ldbl_hidden_def (__IO_vsprintf, _IO_vsprintf) - ldbl_strong_alias (__IO_vsprintf, _IO_vsprintf) ldbl_weak_alias (__IO_vsprintf, vsprintf) -libc_hidden_weak (vsprintf) +ldbl_hidden_weak (__IO_vsprintf, vsprintf) diff --git a/libio/iovsscanf.c b/libio/iovsscanf.c index b96ad6b2fe..17570d3600 100644 --- a/libio/iovsscanf.c +++ b/libio/iovsscanf.c @@ -42,5 +42,5 @@ _IO_vsscanf (const char *string, const char *format, _IO_va_list args) return ret; } ldbl_weak_alias (_IO_vsscanf, __vsscanf) -libc_hidden_weak (__vsscanf) +ldbl_hidden_weak (_IO_vsscanf, __vsscanf) ldbl_weak_alias (_IO_vsscanf, vsscanf) diff --git a/libio/libioP.h b/libio/libioP.h index 914caac34f..8f22fc09fc 100644 --- a/libio/libioP.h +++ b/libio/libioP.h @@ -45,6 +45,18 @@ #include <bits/libio.h> #include "iolibio.h" +#ifndef _IO_pos_BAD +#define _IO_pos_BAD ((__off64_t)(-1)) +#endif + +#define _IO_fileno(FP) ((FP)->_fileno) +#define _IO_clearerr(FP) ((FP)->_flags &= ~(_IO_ERR_SEEN|_IO_EOF_SEEN)) +#define _IO_fseek(__fp, __offset, __whence) \ + (_IO_seekoff_unlocked (__fp, __offset, __whence, _IOS_INPUT|_IOS_OUTPUT) \ + == _IO_pos_BAD ? EOF : 0) +#define _IO_rewind(FILE) \ + (void) _IO_seekoff_unlocked (FILE, 0, 0, _IOS_INPUT|_IOS_OUTPUT) + #ifdef __cplusplus extern "C" { #endif diff --git a/libio/vasprintf.c b/libio/vasprintf.c index cf7ad0a972..853d12305c 100644 --- a/libio/vasprintf.c +++ b/libio/vasprintf.c @@ -85,5 +85,6 @@ _IO_vasprintf (char **result_ptr, const char *format, _IO_va_list args) (*result_ptr)[needed - 1] = '\0'; return ret; } -ldbl_strong_alias (_IO_vasprintf, __vasprintf) +strong_alias (_IO_vasprintf, __vasprintf) +ldbl_hidden_def (_IO_vasprintf, __vasprintf) ldbl_weak_alias (_IO_vasprintf, vasprintf) diff --git a/libio/vsnprintf.c b/libio/vsnprintf.c index 8a8a34ef89..cd05215e80 100644 --- a/libio/vsnprintf.c +++ b/libio/vsnprintf.c @@ -119,4 +119,4 @@ _IO_vsnprintf (char *string, _IO_size_t maxlen, const char *format, } ldbl_weak_alias (_IO_vsnprintf, __vsnprintf) ldbl_weak_alias (_IO_vsnprintf, vsnprintf) -libc_hidden_weak (__vsnprintf) +ldbl_hidden_weak (_IO_vsnprintf, __vsnprintf) diff --git a/sysdeps/generic/math_ldbl_opt.h b/sysdeps/generic/math_ldbl_opt.h index 8a5d8ba107..a4b3806a10 100644 --- a/sysdeps/generic/math_ldbl_opt.h +++ b/sysdeps/generic/math_ldbl_opt.h @@ -9,6 +9,7 @@ #define LONG_DOUBLE_COMPAT(lib, introduced) 0 #define long_double_symbol(lib, local, symbol) #define ldbl_hidden_def(local, name) libc_hidden_def (name) +#define ldbl_hidden_weak(local, name) libc_hidden_weak (name) #define ldbl_strong_alias(name, aliasname) strong_alias (name, aliasname) #define ldbl_weak_alias(name, aliasname) weak_alias (name, aliasname) #define __ldbl_is_dbl 0 diff --git a/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h b/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h index af861c11ea..5994240aab 100644 --- a/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h +++ b/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h @@ -12,6 +12,7 @@ long_double_symbol_1 (lib, local, symbol, LONG_DOUBLE_COMPAT_VERSION) #ifdef SHARED # define ldbl_hidden_def(local, name) libc_hidden_ver (local, name) +# define ldbl_hidden_weak(local, name) libc_hidden_weak_ver (local, name) # define ldbl_strong_alias(name, aliasname) \ strong_alias (name, __GL_##name##_##aliasname) \ long_double_symbol (libc, __GL_##name##_##aliasname, aliasname); @@ -22,6 +23,7 @@ versioned_symbol (lib, local, symbol, version) #else # define ldbl_hidden_def(local, name) libc_hidden_def (name) +# define ldbl_hidden_weak(local, name) libc_hidden_weak (name) # define ldbl_strong_alias(name, aliasname) strong_alias (name, aliasname) # define ldbl_weak_alias(name, aliasname) weak_alias (name, aliasname) # ifndef __ASSEMBLER__ diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c index 3e0143529a..db51822f90 100644 --- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c +++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c @@ -25,6 +25,7 @@ #include <locale/localeinfo.h> #include <sys/syslog.h> #include <libc-lock.h> +#include <libio/libioP.h> #include "nldbl-compat.h" diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h index 72ec0db390..64dfa7906b 100644 --- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h +++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h @@ -36,7 +36,6 @@ /* Declare the __nldbl_NAME function the wrappers call that's in libc.so. */ #define NLDBL_DECL(name) extern __typeof (name) __nldbl_##name -NLDBL_DECL (_IO_vfscanf); NLDBL_DECL (vfscanf); NLDBL_DECL (vfwscanf); NLDBL_DECL (obstack_vprintf); @@ -82,23 +81,25 @@ extern ssize_t __nldbl___vstrfmon (char *, size_t, const char *, va_list) /* These don't use __typeof because they were not declared by the headers, since we don't compile with _FORTIFY_SOURCE. */ extern int __nldbl___vfprintf_chk (FILE *__restrict, int, - const char *__restrict, _G_va_list); + const char *__restrict, va_list); extern int __nldbl___vfwprintf_chk (FILE *__restrict, int, - const wchar_t *__restrict, __gnuc_va_list); + const wchar_t *__restrict, va_list); extern int __nldbl___vsprintf_chk (char *__restrict, int, size_t, - const char *__restrict, _G_va_list) __THROW; + const char *__restrict, va_list) __THROW; extern int __nldbl___vsnprintf_chk (char *__restrict, size_t, int, size_t, - const char *__restrict, _G_va_list) + const char *__restrict, va_list) __THROW; extern int __nldbl___vswprintf_chk (wchar_t *__restrict, size_t, int, size_t, - const wchar_t *__restrict, __gnuc_va_list) + const wchar_t *__restrict, va_list) __THROW; -extern int __nldbl___vasprintf_chk (char **, int, const char *, _G_va_list) +extern int __nldbl___vasprintf_chk (char **, int, const char *, va_list) __THROW; -extern int __nldbl___vdprintf_chk (int, int, const char *, _G_va_list); +extern int __nldbl___vdprintf_chk (int, int, const char *, va_list); extern int __nldbl___obstack_vprintf_chk (struct obstack *, int, const char *, - _G_va_list) __THROW; + va_list) __THROW; extern void __nldbl___vsyslog_chk (int, int, const char *, va_list); +/* This function is not declared by stdio.h anymore. */ +extern int __nldbl__IO_vfscanf (FILE *, const char *, va_list, int *); #endif /* __NLDBL_COMPAT_H */ diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c b/sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c index 05581c0354..ffb7d788fe 100644 --- a/sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c +++ b/sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c @@ -2,7 +2,7 @@ int attribute_hidden -_IO_vfscanf (FILE *s, const char *fmt, _IO_va_list ap, int *errp) +_IO_vfscanf (FILE *s, const char *fmt, __gnuc_va_list ap, int *errp) { return __nldbl__IO_vfscanf (s, fmt, ap, errp); } |