aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2017-12-27 12:56:04 -0500
committerZack Weinberg <zackw@panix.com>2017-12-27 12:56:04 -0500
commitdb922eaf0d7df3b917b6b693081219ca6065ec9e (patch)
treef1320cf66747a8554eeddf2503ff1f14abe578da
parent7959f855a7c739602a2227c85563650b28d8a0cf (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-data2
-rw-r--r--include/libc-symbols.h6
-rw-r--r--libio/iolibio.h100
-rw-r--r--libio/iovsprintf.c3
-rw-r--r--libio/iovsscanf.c2
-rw-r--r--libio/libioP.h12
-rw-r--r--libio/vasprintf.c3
-rw-r--r--libio/vsnprintf.c2
-rw-r--r--sysdeps/generic/math_ldbl_opt.h1
-rw-r--r--sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h2
-rw-r--r--sysdeps/ieee754/ldbl-opt/nldbl-compat.c1
-rw-r--r--sysdeps/ieee754/ldbl-opt/nldbl-compat.h19
-rw-r--r--sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c2
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);
}