From: "Arsen Arsenović" <arsen@aarsen.me>
To: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Cc: Florian Weimer <fweimer@redhat.com>, libc-alpha@sourceware.org
Subject: Re: [PATCH v3 2/4] libio: Remove the usage of __libc_IO_vtables
Date: Mon, 06 Mar 2023 15:58:16 +0100 [thread overview]
Message-ID: <87bkl5ncob.fsf@aarsen.me> (raw)
In-Reply-To: <20221227211145.3765256-3-adhemerval.zanella@linaro.org>
[-- Attachment #1: Type: text/plain, Size: 67356 bytes --]
Hi Adhemerval,
Adhemerval Zanella via Libc-alpha <libc-alpha@sourceware.org> writes:
> Instead of using a special ELF section along with a linker script
> directive to put the IO vtables within the RELRO section, the libio
> vtables are iall moved to an array marked as data.relro (so linker
> will place in the RELRO segment without the need of extra directives).
>
> To avoid static linking namespace issues and to pulling all vtables
> referenced objects, all required function pointers are set to weak alias.
>
> Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
> ---
> Makerules | 24 --
> elf/Makefile | 16 +-
> include/libc-symbols.h | 18 +-
> libio/Makefile | 2 +
> libio/fileops.c | 81 +----
> libio/iofopncook.c | 60 +---
> libio/iopopen.c | 25 --
> libio/libio-macros.sym | 7 +
> libio/libioP.h | 136 +++++--
> libio/memstream.c | 32 +-
> libio/oldfileops.c | 23 --
> libio/oldiopopen.c | 23 --
> libio/stdio.c | 3 +
> libio/strfile.h | 2 -
> libio/strops.c | 24 --
> libio/tst-vtables-interposed.c | 5 +
> libio/vtables.c | 497 ++++++++++++++++++++++++++
> libio/wfileops.c | 79 +---
> libio/wmemstream.c | 32 +-
> libio/wstrops.c | 24 --
> stdio-common/printf_buffer_as_file.c | 28 +-
> stdio-common/wprintf_buffer_as_file.c | 28 +-
> 22 files changed, 656 insertions(+), 513 deletions(-)
> create mode 100644 libio/libio-macros.sym
>
> diff --git a/Makerules b/Makerules
> index 962b2cd90c..41fc8db4ba 100644
> --- a/Makerules
> +++ b/Makerules
> @@ -544,34 +544,10 @@ $(LINK.o) -shared -static-libgcc -Wl,-O1 $(sysdep-LDFLAGS) \
> -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link)
> endef
>
> -ifeq (yes,$(use-default-link))
> # If the linker is good enough, we can let it use its default linker script.
> # In the long term the custom linker script will be removed.
> shlib-lds =
> shlib-lds-flags =
> -else
> -# binutils only position loadable notes into the first page for binaries,
> -# not for shared objects
> -# lld --verbose does not dump a linker script. Use -fuse-ld=bfd.
> -$(common-objpfx)shlib.lds: $(common-objpfx)config.make $(..)Makerules
> - $(LINK.o) -shared -Wl,-O1 \
> - -nostdlib -nostartfiles -fuse-ld=bfd \
> - $(sysdep-LDFLAGS) $(rtld-LDFLAGS) $(LDFLAGS.so) \
> - -Wl,--verbose 2>/dev/null | \
> - sed > $@T \
> - -e '/^=========/,/^=========/!d;/^=========/d' \
> - -e 's@^.*\*(\.jcr).*$$@& \
> - PROVIDE(__start___libc_IO_vtables = .);\
> - __libc_IO_vtables : { *(__libc_IO_vtables) }\
> - PROVIDE(__stop___libc_IO_vtables = .);\
> - /DISCARD/ : { *(.gnu.glibc-stub.*) }@'
> - test -s $@T
> - mv -f $@T $@
> -common-generated += shlib.lds
> -
> -shlib-lds = $(common-objpfx)shlib.lds
> -shlib-lds-flags = -T $(shlib-lds)
> -endif
>
> define build-shlib
> $(build-shlib-helper) -o $@ $(shlib-lds-flags) \
> diff --git a/elf/Makefile b/elf/Makefile
> index 0ecbcde962..f5157030c4 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -595,23 +595,9 @@ $(objpfx)tst-relro-ldso.out: tst-relro-symbols.py $(..)/scripts/glibcelf.py \
> $(objpfx)tst-relro-libc.out: tst-relro-symbols.py $(..)/scripts/glibcelf.py \
> $(common-objpfx)libc.so
> $(PYTHON) tst-relro-symbols.py $(common-objpfx)libc.so \
> - --required=_IO_cookie_jumps \
> --required=_IO_file_jumps \
> - --required=_IO_file_jumps_maybe_mmap \
> - --required=_IO_file_jumps_mmap \
> - --required=_IO_mem_jumps \
> - --required=_IO_printf_buffer_as_file_jumps \
> - --required=_IO_proc_jumps \
> - --required=_IO_str_jumps \
> --required=_IO_wfile_jumps \
> - --required=_IO_wfile_jumps_maybe_mmap \
> - --required=_IO_wfile_jumps_mmap \
> - --required=_IO_wmem_jumps \
> - --required=_IO_wprintf_buffer_as_file_jumps \
> - --required=_IO_wstr_jumps \
> - --optional=_IO_old_cookie_jumps \
> - --optional=_IO_old_file_jumps \
> - --optional=_IO_old_proc_jumps \
> + --required=__io_vtables \
> > $@ 2>&1; $(evaluate-test)
>
> ifeq ($(run-built-tests),yes)
> diff --git a/include/libc-symbols.h b/include/libc-symbols.h
> index a1d422131f..02fbfe91f0 100644
> --- a/include/libc-symbols.h
> +++ b/include/libc-symbols.h
> @@ -243,20 +243,26 @@ for linking")
> This is only necessary when defining something in assembly, or playing
> funny alias games where the size should be other than what the compiler
> thinks it is. */
> -#ifdef __ASSEMBLER__
> -# define declare_object_symbol_alias(symbol, original, size) \
> +#define declare_object_symbol_alias(symbol, original, size) \
> declare_object_symbol_alias_1 (symbol, original, size)
> +#ifdef __ASSEMBLER__
> # define declare_object_symbol_alias_1(symbol, original, s_size) \
> strong_alias (original, symbol) ASM_LINE_SEP \
> .type C_SYMBOL_NAME (symbol), %object ASM_LINE_SEP \
> .size C_SYMBOL_NAME (symbol), s_size ASM_LINE_SEP
> #else /* Not __ASSEMBLER__. */
> # ifdef HAVE_ASM_SET_DIRECTIVE
> -# define declare_symbol_alias_1_alias(symbol, original) \
> - ".set " __SYMBOL_PREFIX #symbol ", " __SYMBOL_PREFIX #original
> +# define declare_object_symbol_alias_1(symbol, original, size) \
> + asm (".global " __SYMBOL_PREFIX # symbol "\n" \
> + ".type " __SYMBOL_PREFIX # symbol ", %object\n" \
> + ".set " __SYMBOL_PREFIX #symbol ", " __SYMBOL_PREFIX original "\n" \
> + ".size " __SYMBOL_PREFIX #symbol ", " #size "\n");
> # else
> -# define declare_symbol_alias_1_alias(symbol, original) \
> - __SYMBOL_PREFIX #symbol " = " __SYMBOL_PREFIX #original
> +# define declare_object_symbol_alias_1(symbol, original, size) \
> + asm (".global " __SYMBOL_PREFIX # symbol "\n" \
> + ".type " __SYMBOL_PREFIX # symbol ", %object\n" \
> + __SYMBOL_PREFIX #symbol " = " __SYMBOL_PREFIX original "\n" \
> + ".size " __SYMBOL_PREFIX #symbol ", " #size "\n");
> # endif /* HAVE_ASM_SET_DIRECTIVE */
> #endif /* __ASSEMBLER__ */
>
> diff --git a/libio/Makefile b/libio/Makefile
> index 64398ab1ee..fc67aea9e2 100644
> --- a/libio/Makefile
> +++ b/libio/Makefile
> @@ -51,6 +51,8 @@ routines := \
> \
> libc_fatal fmemopen oldfmemopen vtables
>
> +gen-as-const-headers += libio-macros.sym
> +
> tests = tst_swprintf tst_wprintf tst_swscanf tst_wscanf tst_getwc tst_putwc \
> tst_wprintf2 tst-widetext test-fmemopen tst-ext tst-ext2 \
> tst-fgetws tst-ungetwc1 tst-ungetwc2 tst-swscanf tst-sscanf \
> diff --git a/libio/fileops.c b/libio/fileops.c
> index 41c18be789..87027d5adb 100644
> --- a/libio/fileops.c
> +++ b/libio/fileops.c
> @@ -815,7 +815,7 @@ _IO_new_file_sync (FILE *fp)
> }
> libc_hidden_ver (_IO_new_file_sync, _IO_file_sync)
>
> -static int
> +int
> _IO_file_sync_mmap (FILE *fp)
> {
> if (fp->_IO_read_ptr != fp->_IO_read_end)
> @@ -1109,7 +1109,7 @@ _IO_file_seekoff_mmap (FILE *fp, off64_t offset, int dir, int mode)
> return offset;
> }
>
> -static off64_t
> +off64_t
> _IO_file_seekoff_maybe_mmap (FILE *fp, off64_t offset, int dir,
> int mode)
> {
> @@ -1360,7 +1360,7 @@ _IO_file_xsgetn (FILE *fp, void *data, size_t n)
> }
> libc_hidden_def (_IO_file_xsgetn)
>
> -static size_t
> +size_t
> _IO_file_xsgetn_mmap (FILE *fp, void *data, size_t n)
> {
> size_t have;
> @@ -1405,7 +1405,7 @@ _IO_file_xsgetn_mmap (FILE *fp, void *data, size_t n)
> return s - (char *) data;
> }
>
> -static size_t
> +size_t
> _IO_file_xsgetn_maybe_mmap (FILE *fp, void *data, size_t n)
> {
> /* We only get here if this is the first attempt to read something.
> @@ -1428,76 +1428,3 @@ versioned_symbol (libc, _IO_new_file_seekoff, _IO_file_seekoff, GLIBC_2_1);
> versioned_symbol (libc, _IO_new_file_underflow, _IO_file_underflow, GLIBC_2_1);
> versioned_symbol (libc, _IO_new_file_write, _IO_file_write, GLIBC_2_1);
> versioned_symbol (libc, _IO_new_file_xsputn, _IO_file_xsputn, GLIBC_2_1);
> -
> -const struct _IO_jump_t _IO_file_jumps libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_file_finish),
> - JUMP_INIT(overflow, _IO_file_overflow),
> - JUMP_INIT(underflow, _IO_file_underflow),
> - JUMP_INIT(uflow, _IO_default_uflow),
> - JUMP_INIT(pbackfail, _IO_default_pbackfail),
> - JUMP_INIT(xsputn, _IO_file_xsputn),
> - JUMP_INIT(xsgetn, _IO_file_xsgetn),
> - JUMP_INIT(seekoff, _IO_new_file_seekoff),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, _IO_new_file_setbuf),
> - JUMP_INIT(sync, _IO_new_file_sync),
> - JUMP_INIT(doallocate, _IO_file_doallocate),
> - JUMP_INIT(read, _IO_file_read),
> - JUMP_INIT(write, _IO_new_file_write),
> - JUMP_INIT(seek, _IO_file_seek),
> - JUMP_INIT(close, _IO_file_close),
> - JUMP_INIT(stat, _IO_file_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue)
> -};
> -libc_hidden_data_def (_IO_file_jumps)
> -
> -const struct _IO_jump_t _IO_file_jumps_mmap libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_file_finish),
> - JUMP_INIT(overflow, _IO_file_overflow),
> - JUMP_INIT(underflow, _IO_file_underflow_mmap),
> - JUMP_INIT(uflow, _IO_default_uflow),
> - JUMP_INIT(pbackfail, _IO_default_pbackfail),
> - JUMP_INIT(xsputn, _IO_new_file_xsputn),
> - JUMP_INIT(xsgetn, _IO_file_xsgetn_mmap),
> - JUMP_INIT(seekoff, _IO_file_seekoff_mmap),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, (_IO_setbuf_t) _IO_file_setbuf_mmap),
> - JUMP_INIT(sync, _IO_file_sync_mmap),
> - JUMP_INIT(doallocate, _IO_file_doallocate),
> - JUMP_INIT(read, _IO_file_read),
> - JUMP_INIT(write, _IO_new_file_write),
> - JUMP_INIT(seek, _IO_file_seek),
> - JUMP_INIT(close, _IO_file_close_mmap),
> - JUMP_INIT(stat, _IO_file_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue)
> -};
> -
> -const struct _IO_jump_t _IO_file_jumps_maybe_mmap libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_file_finish),
> - JUMP_INIT(overflow, _IO_file_overflow),
> - JUMP_INIT(underflow, _IO_file_underflow_maybe_mmap),
> - JUMP_INIT(uflow, _IO_default_uflow),
> - JUMP_INIT(pbackfail, _IO_default_pbackfail),
> - JUMP_INIT(xsputn, _IO_new_file_xsputn),
> - JUMP_INIT(xsgetn, _IO_file_xsgetn_maybe_mmap),
> - JUMP_INIT(seekoff, _IO_file_seekoff_maybe_mmap),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, (_IO_setbuf_t) _IO_file_setbuf_mmap),
> - JUMP_INIT(sync, _IO_new_file_sync),
> - JUMP_INIT(doallocate, _IO_file_doallocate),
> - JUMP_INIT(read, _IO_file_read),
> - JUMP_INIT(write, _IO_new_file_write),
> - JUMP_INIT(seek, _IO_file_seek),
> - JUMP_INIT(close, _IO_file_close),
> - JUMP_INIT(stat, _IO_file_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue)
> -};
> diff --git a/libio/iofopncook.c b/libio/iofopncook.c
> index 6c27610319..338cb31c79 100644
> --- a/libio/iofopncook.c
> +++ b/libio/iofopncook.c
> @@ -30,7 +30,7 @@
> #include <shlib-compat.h>
> #include <pointer_guard.h>
>
> -static ssize_t
> +ssize_t
> _IO_cookie_read (FILE *fp, void *buf, ssize_t size)
> {
> struct _IO_cookie_file *cfile = (struct _IO_cookie_file *) fp;
> @@ -43,7 +43,7 @@ _IO_cookie_read (FILE *fp, void *buf, ssize_t size)
> return read_cb (cfile->__cookie, buf, size);
> }
>
> -static ssize_t
> +ssize_t
> _IO_cookie_write (FILE *fp, const void *buf, ssize_t size)
> {
> struct _IO_cookie_file *cfile = (struct _IO_cookie_file *) fp;
> @@ -63,7 +63,7 @@ _IO_cookie_write (FILE *fp, const void *buf, ssize_t size)
> return n;
> }
>
> -static off64_t
> +off64_t
> _IO_cookie_seek (FILE *fp, off64_t offset, int dir)
> {
> struct _IO_cookie_file *cfile = (struct _IO_cookie_file *) fp;
> @@ -77,7 +77,7 @@ _IO_cookie_seek (FILE *fp, off64_t offset, int dir)
> ? _IO_pos_BAD : offset);
> }
>
> -static int
> +int
> _IO_cookie_close (FILE *fp)
> {
> struct _IO_cookie_file *cfile = (struct _IO_cookie_file *) fp;
> @@ -91,7 +91,7 @@ _IO_cookie_close (FILE *fp)
> }
>
>
> -static off64_t
> +off64_t
> _IO_cookie_seekoff (FILE *fp, off64_t offset, int dir, int mode)
> {
> /* We must force the fileops code to always use seek to determine
> @@ -100,31 +100,6 @@ _IO_cookie_seekoff (FILE *fp, off64_t offset, int dir, int mode)
> return _IO_file_seekoff (fp, offset, dir, mode);
> }
>
> -
> -static const struct _IO_jump_t _IO_cookie_jumps libio_vtable = {
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_file_finish),
> - JUMP_INIT(overflow, _IO_file_overflow),
> - JUMP_INIT(underflow, _IO_file_underflow),
> - JUMP_INIT(uflow, _IO_default_uflow),
> - JUMP_INIT(pbackfail, _IO_default_pbackfail),
> - JUMP_INIT(xsputn, _IO_file_xsputn),
> - JUMP_INIT(xsgetn, _IO_default_xsgetn),
> - JUMP_INIT(seekoff, _IO_cookie_seekoff),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, _IO_file_setbuf),
> - JUMP_INIT(sync, _IO_file_sync),
> - JUMP_INIT(doallocate, _IO_file_doallocate),
> - JUMP_INIT(read, _IO_cookie_read),
> - JUMP_INIT(write, _IO_cookie_write),
> - JUMP_INIT(seek, _IO_cookie_seek),
> - JUMP_INIT(close, _IO_cookie_close),
> - JUMP_INIT(stat, _IO_default_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue),
> -};
> -
> -
> /* Copy the callbacks from SOURCE to *TARGET, with pointer
> mangling. */
> static void
> @@ -209,7 +184,7 @@ versioned_symbol (libc, _IO_fopencookie, fopencookie, GLIBC_2_2);
>
> #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
>
> -static off64_t
> +off64_t
> attribute_compat_text_section
> _IO_old_cookie_seek (FILE *fp, off64_t offset, int dir)
> {
> @@ -226,29 +201,6 @@ _IO_old_cookie_seek (FILE *fp, off64_t offset, int dir)
> return (ret == -1) ? _IO_pos_BAD : ret;
> }
>
> -static const struct _IO_jump_t _IO_old_cookie_jumps libio_vtable = {
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_file_finish),
> - JUMP_INIT(overflow, _IO_file_overflow),
> - JUMP_INIT(underflow, _IO_file_underflow),
> - JUMP_INIT(uflow, _IO_default_uflow),
> - JUMP_INIT(pbackfail, _IO_default_pbackfail),
> - JUMP_INIT(xsputn, _IO_file_xsputn),
> - JUMP_INIT(xsgetn, _IO_default_xsgetn),
> - JUMP_INIT(seekoff, _IO_cookie_seekoff),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, _IO_file_setbuf),
> - JUMP_INIT(sync, _IO_file_sync),
> - JUMP_INIT(doallocate, _IO_file_doallocate),
> - JUMP_INIT(read, _IO_cookie_read),
> - JUMP_INIT(write, _IO_cookie_write),
> - JUMP_INIT(seek, _IO_old_cookie_seek),
> - JUMP_INIT(close, _IO_cookie_close),
> - JUMP_INIT(stat, _IO_default_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue),
> -};
> -
> FILE *
> attribute_compat_text_section
> _IO_old_fopencookie (void *cookie, const char *mode,
> diff --git a/libio/iopopen.c b/libio/iopopen.c
> index 06778cf110..5ed30a817b 100644
> --- a/libio/iopopen.c
> +++ b/libio/iopopen.c
> @@ -45,8 +45,6 @@ struct _IO_proc_file
> };
> typedef struct _IO_proc_file _IO_proc_file;
>
> -static const struct _IO_jump_t _IO_proc_jumps;
> -
> static struct _IO_proc_file *proc_file_chain;
>
> #ifdef _IO_MTSAFE_IO
> @@ -291,29 +289,6 @@ _IO_new_proc_close (FILE *fp)
> return wstatus;
> }
>
> -static const struct _IO_jump_t _IO_proc_jumps libio_vtable = {
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_new_file_finish),
> - JUMP_INIT(overflow, _IO_new_file_overflow),
> - JUMP_INIT(underflow, _IO_new_file_underflow),
> - JUMP_INIT(uflow, _IO_default_uflow),
> - JUMP_INIT(pbackfail, _IO_default_pbackfail),
> - JUMP_INIT(xsputn, _IO_new_file_xsputn),
> - JUMP_INIT(xsgetn, _IO_default_xsgetn),
> - JUMP_INIT(seekoff, _IO_new_file_seekoff),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, _IO_new_file_setbuf),
> - JUMP_INIT(sync, _IO_new_file_sync),
> - JUMP_INIT(doallocate, _IO_file_doallocate),
> - JUMP_INIT(read, _IO_file_read),
> - JUMP_INIT(write, _IO_new_file_write),
> - JUMP_INIT(seek, _IO_file_seek),
> - JUMP_INIT(close, _IO_new_proc_close),
> - JUMP_INIT(stat, _IO_file_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue)
> -};
> -
> strong_alias (_IO_new_popen, __new_popen)
> versioned_symbol (libc, _IO_new_popen, _IO_popen, GLIBC_2_1);
> versioned_symbol (libc, __new_popen, popen, GLIBC_2_1);
> diff --git a/libio/libio-macros.sym b/libio/libio-macros.sym
> new file mode 100644
> index 0000000000..cfb5cf2841
> --- /dev/null
> +++ b/libio/libio-macros.sym
> @@ -0,0 +1,7 @@
> +#include <libioP.h>
> +
> +--
> +
> +IO_JUMP_T_SIZE sizeof (struct _IO_jump_t)
> +IO_FILE_JUMPS_OFFSET sizeof (struct _IO_jump_t) * IO_FILE_JUMPS
> +IO_WFILE_JUMPS_OFFSET sizeof (struct _IO_jump_t) * IO_WFILE_JUMPS
> diff --git a/libio/libioP.h b/libio/libioP.h
> index 8500c75fa0..523bd577ae 100644
> --- a/libio/libioP.h
> +++ b/libio/libioP.h
> @@ -469,19 +469,68 @@ extern int _IO_default_sync (FILE *) __THROW;
> extern int _IO_default_showmanyc (FILE *) __THROW;
> extern void _IO_default_imbue (FILE *, void *) __THROW;
>
> -extern const struct _IO_jump_t _IO_file_jumps;
> -libc_hidden_proto (_IO_file_jumps)
> -extern const struct _IO_jump_t _IO_file_jumps_mmap attribute_hidden;
> -extern const struct _IO_jump_t _IO_file_jumps_maybe_mmap attribute_hidden;
> -extern const struct _IO_jump_t _IO_wfile_jumps;
> -libc_hidden_proto (_IO_wfile_jumps)
> -extern const struct _IO_jump_t _IO_wfile_jumps_mmap attribute_hidden;
> -extern const struct _IO_jump_t _IO_wfile_jumps_maybe_mmap attribute_hidden;
> -extern const struct _IO_jump_t _IO_old_file_jumps attribute_hidden;
> -extern const struct _IO_jump_t _IO_streambuf_jumps;
> -extern const struct _IO_jump_t _IO_old_proc_jumps attribute_hidden;
> -extern const struct _IO_jump_t _IO_str_jumps attribute_hidden;
> -extern const struct _IO_jump_t _IO_wstr_jumps attribute_hidden;
> +extern int __printf_buffer_as_file_overflow (FILE *fp, int ch);
> +extern size_t __printf_buffer_as_file_xsputn (FILE *fp, const void *buf,
> + size_t len);
> +extern wint_t __wprintf_buffer_as_file_overflow (FILE *fp, int ch);
> +extern size_t __wprintf_buffer_as_file_xsputn (FILE *fp, const void *buf,
> + size_t len);
> +
> +enum
> +{
> + IO_STR_JUMPS = 0,
> + IO_WSTR_JUMPS = 1,
> + IO_FILE_JUMPS = 2,
> + IO_FILE_JUMPS_MMAP = 3,
> + IO_FILE_JUMPS_MAYBE_MMAP = 4,
> + IO_WFILE_JUMPS = 5,
> + IO_WFILE_JUMPS_MMAP = 6,
> + IO_WFILE_JUMPS_MAYBE_MMAP = 7,
> + IO_COOKIE_JUMPS = 8,
> + IO_PROC_JUMPS = 9,
> + IO_MEM_JUMPS = 10,
> + IO_WMEM_JUMPS = 11,
> + IO_PRINTF_BUFFER_AS_FILE_JUMPS = 12,
> + IO_WPRINTF_BUFFER_AS_FILE_JUMPS = 13,
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> + IO_OLD_FILE_JUMPS = 14,
> + IO_OLD_PROC_JUMPS = 15,
> + IO_OLD_COOKIED_JUMPS = 16,
> + IO_VTABLES_NUM = IO_OLD_COOKIED_JUMPS + 1,
> +#elif SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
> + IO_OLD_COOKIED_JUMPS = 14,
> + IO_VTABLES_NUM = IO_OLD_COOKIED_JUMPS + 1,
> +#else
> + IO_VTABLES_NUM = IO_WPRINTF_BUFFER_AS_FILE_JUMPS + 1
> +#endif
> +};
> +#define IO_VTABLES_LEN (IO_VTABLES_NUM * sizeof (struct _IO_jump_t))
> +
> +extern const struct _IO_jump_t __io_vtables[] attribute_hidden;
> +#define _IO_str_jumps (__io_vtables[IO_STR_JUMPS])
> +#define _IO_wstr_jumps (__io_vtables[IO_WSTR_JUMPS])
> +#define _IO_file_jumps (__io_vtables[IO_FILE_JUMPS])
> +#define _IO_file_jumps_mmap (__io_vtables[IO_FILE_JUMPS_MMAP])
> +#define _IO_file_jumps_maybe_mmap (__io_vtables[IO_FILE_JUMPS_MAYBE_MMAP])
> +#define _IO_wfile_jumps (__io_vtables[IO_WFILE_JUMPS])
> +#define _IO_wfile_jumps_mmap (__io_vtables[IO_WFILE_JUMPS_MMAP])
> +#define _IO_wfile_jumps_maybe_mmap (__io_vtables[IO_WFILE_JUMPS_MAYBE_MMAP])
> +#define _IO_cookie_jumps (__io_vtables[IO_COOKIE_JUMPS])
> +#define _IO_proc_jumps (__io_vtables[IO_PROC_JUMPS])
> +#define _IO_mem_jumps (__io_vtables[IO_MEM_JUMPS])
> +#define _IO_wmem_jumps (__io_vtables[IO_WMEM_JUMPS])
> +#define _IO_printf_buffer_as_file_jumps (__io_vtables[IO_PRINTF_BUFFER_AS_FILE_JUMPS])
> +#define _IO_wprintf_buffer_as_file_jumps (__io_vtables[IO_WPRINTF_BUFFER_AS_FILE_JUMPS])
> +#define _IO_old_file_jumps (__io_vtables[IO_OLD_FILE_JUMPS])
> +#define _IO_old_proc_jumps (__io_vtables[IO_OLD_PROC_JUMPS])
> +#define _IO_old_cookie_jumps (__io_vtables[IO_OLD_COOKIED_JUMPS])
> +
> +#ifdef SHARED
> +# define libio_static_fn_required(name)
> +#else
> +# define libio_static_fn_required(name) __asm (".globl " #name);
> +#endif
> +
> extern int _IO_do_write (FILE *, const char *, size_t);
> libc_hidden_proto (_IO_do_write)
> extern int _IO_new_do_write (FILE *, const char *, size_t);
> @@ -593,6 +642,14 @@ extern void _IO_new_file_init_internal (struct _IO_FILE_plus *)
> extern FILE* _IO_new_file_setbuf (FILE *, char *, ssize_t);
> extern FILE* _IO_file_setbuf_mmap (FILE *, char *, ssize_t);
> extern int _IO_new_file_sync (FILE *);
> +extern int _IO_file_sync_mmap (FILE *) attribute_hidden;
> +extern size_t _IO_file_xsgetn_maybe_mmap (FILE *fp, void *data, size_t n)
> + attribute_hidden;
> +extern size_t _IO_file_xsgetn_mmap (FILE *fp, void *data, size_t n)
> + attribute_hidden;
> +extern off64_t _IO_file_seekoff_maybe_mmap (FILE *fp, off64_t offset, int dir,
> + int mode)
> + attribute_hidden;
> extern int _IO_new_file_underflow (FILE *);
> extern int _IO_new_file_overflow (FILE *, int);
> extern off64_t _IO_new_file_seekoff (FILE *, off64_t, int, int);
> @@ -625,6 +682,10 @@ extern wint_t _IO_wfile_overflow (FILE *, wint_t);
> libc_hidden_proto (_IO_wfile_overflow)
> extern off64_t _IO_wfile_seekoff (FILE *, off64_t, int, int);
> libc_hidden_proto (_IO_wfile_seekoff)
> +extern wint_t _IO_wfile_underflow_maybe_mmap (FILE *fp)
> + attribute_hidden;
> +extern wint_t _IO_wfile_underflow_mmap (FILE *fp)
> + attribute_hidden;
>
> /* Jumptable functions for proc_files. */
> extern FILE* _IO_proc_open (FILE *, const char *, const char *)
> @@ -643,13 +704,41 @@ extern int _IO_str_overflow (FILE *, int) __THROW;
> libc_hidden_proto (_IO_str_overflow)
> extern int _IO_str_pbackfail (FILE *, int) __THROW;
> libc_hidden_proto (_IO_str_pbackfail)
> -extern off64_t _IO_str_seekoff (FILE *, off64_t, int, int) __THROW;
> +extern off64_t _IO_str_seekoff (FILE *, off64_t, int, int) __THROW
> + ;
> libc_hidden_proto (_IO_str_seekoff)
> extern void _IO_str_finish (FILE *, int) __THROW;
> +extern int _IO_str_chk_overflow (FILE *fp, int c) __THROW
> + attribute_hidden;
> +
> +/* Jumptable functions for fopencookie. */
> +extern ssize_t _IO_cookie_read (FILE *fp, void *buf, ssize_t size)
> + attribute_hidden;
> +extern ssize_t _IO_cookie_write (FILE *fp, const void *buf, ssize_t size)
> + attribute_hidden;
> +extern off64_t _IO_cookie_seek (FILE *fp, off64_t offset, int dir)
> + attribute_hidden;
> +extern int _IO_cookie_close (FILE *fp) attribute_hidden;
> +extern off64_t _IO_cookie_seekoff (FILE *fp, off64_t offset, int dir, int mode)
> + attribute_hidden;
> +extern off64_t _IO_old_cookie_seek (FILE *fp, off64_t offset, int dir)
> + attribute_hidden;
> +
> +/* Jumptable functions for obstack. */
> +extern int __IO_obstack_overflow (FILE *fp, int c) attribute_hidden;
> +extern size_t __IO_obstack_xsputn (FILE *fp, const void *data, size_t n)
> + attribute_hidden;
> +
> +/* Jumptable functions for open_{w}memstream. */
> +extern int _IO_mem_sync (FILE* fp) __THROW attribute_hidden;
> +extern void _IO_mem_finish (FILE* fp, int) __THROW attribute_hidden;
> +extern int _IO_wmem_sync (FILE* fp) __THROW attribute_hidden;
> +extern void _IO_wmem_finish (FILE* fp, int) __THROW attribute_hidden;
>
> /* Other strfile functions */
> struct _IO_strfile_;
> extern ssize_t _IO_str_count (FILE *) __THROW;
> +extern int _IO_strn_overflow (FILE *fp, int c) __THROW attribute_hidden;
>
> /* And the wide character versions. */
> extern void _IO_wstr_init_static (FILE *, wchar_t *, size_t, wchar_t *)
> @@ -662,6 +751,10 @@ extern off64_t _IO_wstr_seekoff (FILE *, off64_t, int, int)
> extern wint_t _IO_wstr_pbackfail (FILE *, wint_t) __THROW;
> extern void _IO_wstr_finish (FILE *, int) __THROW;
>
> +/* Helper functions. */
> +int _IO_helper_overflow (FILE *s, int c);
> +int _IO_whelper_overflow (FILE *s, int c);
> +
> /* Internal versions of v*printf that take an additional flags
> parameter. */
> extern int __vfprintf_internal (FILE *fp, const char *format, va_list ap,
> @@ -891,14 +984,6 @@ _IO_acquire_lock_fct (FILE **p)
> } while (0)
> #endif
>
> -/* Collect all vtables in a special section for vtable verification.
> - These symbols cover the extent of this section. */
> -symbol_set_declare (__libc_IO_vtables)
> -
> -/* libio vtables need to carry this attribute so that they pass
> - validation. */
> -#define libio_vtable __attribute__ ((section ("__libc_IO_vtables")))
> -
> #ifdef SHARED
> /* If equal to &_IO_vtable_check (with pointer guard protection),
> unknown vtable pointers are valid. This function pointer is solely
> @@ -933,12 +1018,9 @@ void _IO_vtable_check (void) attribute_hidden;
> static inline const struct _IO_jump_t *
> IO_validate_vtable (const struct _IO_jump_t *vtable)
> {
> - /* Fast path: The vtable pointer is within the __libc_IO_vtables
> - section. */
> - uintptr_t section_length = __stop___libc_IO_vtables - __start___libc_IO_vtables;
> uintptr_t ptr = (uintptr_t) vtable;
> - uintptr_t offset = ptr - (uintptr_t) __start___libc_IO_vtables;
> - if (__glibc_unlikely (offset >= section_length))
> + uintptr_t offset = ptr - (uintptr_t) &__io_vtables;
> + if (__glibc_unlikely (offset >= IO_VTABLES_LEN))
> /* The vtable pointer is not in the expected section. Use the
> slow path, which will terminate the process if necessary. */
> _IO_vtable_check ();
> diff --git a/libio/memstream.c b/libio/memstream.c
> index 1ae8cd9544..b5b5254a34 100644
> --- a/libio/memstream.c
> +++ b/libio/memstream.c
> @@ -29,34 +29,6 @@ struct _IO_FILE_memstream
> };
>
>
> -static int _IO_mem_sync (FILE* fp) __THROW;
> -static void _IO_mem_finish (FILE* fp, int) __THROW;
> -
> -
> -static const struct _IO_jump_t _IO_mem_jumps libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT (finish, _IO_mem_finish),
> - JUMP_INIT (overflow, _IO_str_overflow),
> - JUMP_INIT (underflow, _IO_str_underflow),
> - JUMP_INIT (uflow, _IO_default_uflow),
> - JUMP_INIT (pbackfail, _IO_str_pbackfail),
> - JUMP_INIT (xsputn, _IO_default_xsputn),
> - JUMP_INIT (xsgetn, _IO_default_xsgetn),
> - JUMP_INIT (seekoff, _IO_str_seekoff),
> - JUMP_INIT (seekpos, _IO_default_seekpos),
> - JUMP_INIT (setbuf, _IO_default_setbuf),
> - JUMP_INIT (sync, _IO_mem_sync),
> - JUMP_INIT (doallocate, _IO_default_doallocate),
> - JUMP_INIT (read, _IO_default_read),
> - JUMP_INIT (write, _IO_default_write),
> - JUMP_INIT (seek, _IO_default_seek),
> - JUMP_INIT (close, _IO_default_close),
> - JUMP_INIT (stat, _IO_default_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue)
> -};
> -
> /* Open a stream that writes into a malloc'd buffer that is expanded as
> necessary. *BUFLOC and *SIZELOC are updated with the buffer's location
> and the number of characters written on fflush or fclose. */
> @@ -105,7 +77,7 @@ libc_hidden_def (__open_memstream)
> weak_alias (__open_memstream, open_memstream)
>
>
> -static int
> +int
> _IO_mem_sync (FILE *fp)
> {
> struct _IO_FILE_memstream *mp = (struct _IO_FILE_memstream *) fp;
> @@ -123,7 +95,7 @@ _IO_mem_sync (FILE *fp)
> }
>
>
> -static void
> +void
> _IO_mem_finish (FILE *fp, int dummy)
> {
> struct _IO_FILE_memstream *mp = (struct _IO_FILE_memstream *) fp;
> diff --git a/libio/oldfileops.c b/libio/oldfileops.c
> index ea3b864447..371c7479c6 100644
> --- a/libio/oldfileops.c
> +++ b/libio/oldfileops.c
> @@ -716,29 +716,6 @@ _IO_old_file_xsputn (FILE *f, const void *data, size_t n)
> return n - to_do;
> }
>
> -
> -const struct _IO_jump_t _IO_old_file_jumps libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_old_file_finish),
> - JUMP_INIT(overflow, _IO_old_file_overflow),
> - JUMP_INIT(underflow, _IO_old_file_underflow),
> - JUMP_INIT(uflow, _IO_default_uflow),
> - JUMP_INIT(pbackfail, _IO_default_pbackfail),
> - JUMP_INIT(xsputn, _IO_old_file_xsputn),
> - JUMP_INIT(xsgetn, _IO_default_xsgetn),
> - JUMP_INIT(seekoff, _IO_old_file_seekoff),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, _IO_old_file_setbuf),
> - JUMP_INIT(sync, _IO_old_file_sync),
> - JUMP_INIT(doallocate, _IO_file_doallocate),
> - JUMP_INIT(read, _IO_file_read),
> - JUMP_INIT(write, _IO_old_file_write),
> - JUMP_INIT(seek, _IO_file_seek),
> - JUMP_INIT(close, _IO_file_close),
> - JUMP_INIT(stat, _IO_file_stat)
> -};
> -
> compat_symbol (libc, _IO_old_do_write, _IO_do_write, GLIBC_2_0);
> compat_symbol (libc, _IO_old_file_attach, _IO_file_attach, GLIBC_2_0);
> compat_symbol (libc, _IO_old_file_close_it, _IO_file_close_it, GLIBC_2_0);
> diff --git a/libio/oldiopopen.c b/libio/oldiopopen.c
> index f9149413e8..206a0f3858 100644
> --- a/libio/oldiopopen.c
> +++ b/libio/oldiopopen.c
> @@ -208,29 +208,6 @@ _IO_old_proc_close (FILE *fp)
> return wstatus;
> }
>
> -const struct _IO_jump_t _IO_old_proc_jumps libio_vtable = {
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_old_file_finish),
> - JUMP_INIT(overflow, _IO_old_file_overflow),
> - JUMP_INIT(underflow, _IO_old_file_underflow),
> - JUMP_INIT(uflow, _IO_default_uflow),
> - JUMP_INIT(pbackfail, _IO_default_pbackfail),
> - JUMP_INIT(xsputn, _IO_old_file_xsputn),
> - JUMP_INIT(xsgetn, _IO_default_xsgetn),
> - JUMP_INIT(seekoff, _IO_old_file_seekoff),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, _IO_old_file_setbuf),
> - JUMP_INIT(sync, _IO_old_file_sync),
> - JUMP_INIT(doallocate, _IO_file_doallocate),
> - JUMP_INIT(read, _IO_file_read),
> - JUMP_INIT(write, _IO_old_file_write),
> - JUMP_INIT(seek, _IO_file_seek),
> - JUMP_INIT(close, _IO_old_proc_close),
> - JUMP_INIT(stat, _IO_file_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue)
> -};
> -
> strong_alias (_IO_old_popen, __old_popen)
> compat_symbol (libc, _IO_old_popen, _IO_popen, GLIBC_2_0);
> compat_symbol (libc, __old_popen, popen, GLIBC_2_0);
> diff --git a/libio/stdio.c b/libio/stdio.c
> index e65ee86b24..356d41d277 100644
> --- a/libio/stdio.c
> +++ b/libio/stdio.c
> @@ -33,3 +33,6 @@
> FILE *stdin = (FILE *) &_IO_2_1_stdin_;
> FILE *stdout = (FILE *) &_IO_2_1_stdout_;
> FILE *stderr = (FILE *) &_IO_2_1_stderr_;
> +
> +libio_static_fn_required (_IO_file_open);
> +libio_static_fn_required (_IO_file_doallocate);
> diff --git a/libio/strfile.h b/libio/strfile.h
> index b7a57317d0..f2ce1ff6f3 100644
> --- a/libio/strfile.h
> +++ b/libio/strfile.h
> @@ -78,8 +78,6 @@ typedef struct
> wchar_t overflow_buf[64];
> } _IO_wstrnfile;
>
> -extern const struct _IO_jump_t _IO_wstrn_jumps attribute_hidden;
> -
> /* Initialize an _IO_strfile SF to read from narrow string STRING, and
> return the corresponding FILE object. It is not necessary to fclose
> the FILE when it is no longer needed. */
> diff --git a/libio/strops.c b/libio/strops.c
> index 1cd0bf6c3d..4e2243b8d9 100644
> --- a/libio/strops.c
> +++ b/libio/strops.c
> @@ -352,27 +352,3 @@ _IO_str_finish (FILE *fp, int dummy)
>
> _IO_default_finish (fp, 0);
> }
> -
> -const struct _IO_jump_t _IO_str_jumps libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_str_finish),
> - JUMP_INIT(overflow, _IO_str_overflow),
> - JUMP_INIT(underflow, _IO_str_underflow),
> - JUMP_INIT(uflow, _IO_default_uflow),
> - JUMP_INIT(pbackfail, _IO_str_pbackfail),
> - JUMP_INIT(xsputn, _IO_default_xsputn),
> - JUMP_INIT(xsgetn, _IO_default_xsgetn),
> - JUMP_INIT(seekoff, _IO_str_seekoff),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, _IO_default_setbuf),
> - JUMP_INIT(sync, _IO_default_sync),
> - JUMP_INIT(doallocate, _IO_default_doallocate),
> - JUMP_INIT(read, _IO_default_read),
> - JUMP_INIT(write, _IO_default_write),
> - JUMP_INIT(seek, _IO_default_seek),
> - JUMP_INIT(close, _IO_default_close),
> - JUMP_INIT(stat, _IO_default_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue)
> -};
> diff --git a/libio/tst-vtables-interposed.c b/libio/tst-vtables-interposed.c
> index 9d03fa0ec2..66f79dddb5 100644
> --- a/libio/tst-vtables-interposed.c
> +++ b/libio/tst-vtables-interposed.c
> @@ -21,7 +21,12 @@
> /* Provide an interposed definition of the standard file handles with
> our own vtable. stdout/stdin/stderr will not work as a result, but
> a succesful test does not print anything, so this is fine. */
> +#include "libioP.h"
> +#undef _IO_file_jumps
> #define _IO_file_jumps jumps
> +#undef _IO_wfile_jumps
> +extern const struct _IO_jump_t _IO_wfile_jumps;
> +#define _IO_wfile_jumps _IO_wfile_jumps
> #include "stdfiles.c"
>
> static int
> diff --git a/libio/vtables.c b/libio/vtables.c
> index e3809c28ce..2a652e0ba9 100644
> --- a/libio/vtables.c
> +++ b/libio/vtables.c
> @@ -21,6 +21,491 @@
> #include <stdio.h>
> #include <ldsodefs.h>
> #include <pointer_guard.h>
> +#include <libio-macros.h>
> +
> +/* Bot _IO_str_* and _IO_new_file functiosn are pulled into every link (from
> + stdio initialization). */
> +#ifndef SHARED
> +# pragma weak _IO_default_close
> +# pragma weak _IO_default_doallocate
> +# pragma weak _IO_default_imbue
> +# pragma weak _IO_default_pbackfail
> +# pragma weak _IO_default_read
> +# pragma weak _IO_default_seek
> +# pragma weak _IO_default_seekpos
> +# pragma weak _IO_default_setbuf
> +# pragma weak _IO_default_showmanyc
> +# pragma weak _IO_default_stat
> +# pragma weak _IO_default_sync
> +# pragma weak _IO_default_uflow
> +# pragma weak _IO_default_write
> +# pragma weak _IO_default_xsgetn
> +# pragma weak _IO_default_xsputn
> +
> +# pragma weak _IO_wdefault_pbackfail
> +# pragma weak _IO_wdefault_uflow
> +# pragma weak _IO_wdefault_doallocate
> +# pragma weak _IO_wdefault_xsgetn
> +# pragma weak _IO_wdefault_xsputn
> +
> +# pragma weak _IO_wstr_finish
> +# pragma weak _IO_wstr_overflow
> +# pragma weak _IO_wstr_pbackfail
> +# pragma weak _IO_wstr_seekoff
> +# pragma weak _IO_wstr_underflow
> +
> +# pragma weak _IO_file_close
> +# pragma weak _IO_file_close_mmap
> +# pragma weak _IO_file_doallocate
> +# pragma weak _IO_file_finish
> +# pragma weak _IO_file_jumps_alia
> +# pragma weak _IO_file_overflow
> +# pragma weak _IO_file_read
> +# pragma weak _IO_file_seek
> +# pragma weak _IO_file_seekoff_maybe_mmap
> +# pragma weak _IO_file_seekoff_mmap
> +# pragma weak _IO_file_setbuf
> +# pragma weak _IO_file_setbuf_mmap
> +# pragma weak _IO_file_setbuf_mmap
> +# pragma weak _IO_file_stat
> +# pragma weak _IO_file_sync
> +# pragma weak _IO_file_sync_mmap
> +# pragma weak _IO_file_underflow
> +# pragma weak _IO_file_underflow_maybe_mmap
> +# pragma weak _IO_file_underflow_mmap
> +# pragma weak _IO_file_xsgetn
> +# pragma weak _IO_file_xsgetn_maybe_mmap
> +# pragma weak _IO_file_xsgetn_mmap
> +# pragma weak _IO_file_xsputn
> +
> +# pragma weak _IO_wfile_overflow
> +# pragma weak _IO_wfile_sync
> +# pragma weak _IO_wfile_underflow
> +# pragma weak _IO_wfile_underflow_maybe_mmap
> +# pragma weak _IO_wfile_underflow_mmap
> +# pragma weak _IO_wfile_doallocate
> +# pragma weak _IO_wfile_jumps_alia
> +# pragma weak _IO_wfile_seekoff
> +# pragma weak _IO_wfile_xsputn
> +
> +# pragma weak _IO_new_proc_close
> +
> +# pragma weak _IO_cookie_close
> +# pragma weak _IO_cookie_read
> +# pragma weak _IO_cookie_seek
> +# pragma weak _IO_cookie_seekoff
> +# pragma weak _IO_cookie_write
> +
> +# pragma weak _IO_mem_finish
> +# pragma weak _IO_mem_sync
> +
> +# pragma weak _IO_wmem_finish
> +# pragma weak _IO_wmem_sync
> +
> +# pragma weak __printf_buffer_as_file_overflow
> +# pragma weak __printf_buffer_as_file_xsputn
> +
> +# pragma weak __wprintf_buffer_as_file_overflow
> +# pragma weak __wprintf_buffer_as_file_xsputn
> +#endif
> +
> +const struct _IO_jump_t __io_vtables[IO_VTABLES_LEN] attribute_relro =
> +{
> + /* _IO_str_jumps */
> + [IO_STR_JUMPS] =
> + {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_str_finish),
> + JUMP_INIT (overflow, _IO_str_overflow),
> + JUMP_INIT (underflow, _IO_str_underflow),
> + JUMP_INIT (uflow, _IO_default_uflow),
> + JUMP_INIT (pbackfail, _IO_str_pbackfail),
> + JUMP_INIT (xsputn, _IO_default_xsputn),
> + JUMP_INIT (xsgetn, _IO_default_xsgetn),
> + JUMP_INIT (seekoff, _IO_str_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_default_setbuf),
> + JUMP_INIT (sync, _IO_default_sync),
> + JUMP_INIT (doallocate, _IO_default_doallocate),
> + JUMP_INIT (read, _IO_default_read),
> + JUMP_INIT (write, _IO_default_write),
> + JUMP_INIT (seek, _IO_default_seek),
> + JUMP_INIT (close, _IO_default_close),
> + JUMP_INIT (stat, _IO_default_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue)
> + },
> + /* _IO_wstr_jumps */
> + [IO_WSTR_JUMPS] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_wstr_finish),
> + JUMP_INIT (overflow, (_IO_overflow_t) _IO_wstr_overflow),
> + JUMP_INIT (underflow, (_IO_underflow_t) _IO_wstr_underflow),
> + JUMP_INIT (uflow, (_IO_underflow_t) _IO_wdefault_uflow),
> + JUMP_INIT (pbackfail, (_IO_pbackfail_t) _IO_wstr_pbackfail),
> + JUMP_INIT (xsputn, _IO_wdefault_xsputn),
> + JUMP_INIT (xsgetn, _IO_wdefault_xsgetn),
> + JUMP_INIT (seekoff, _IO_wstr_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_default_setbuf),
> + JUMP_INIT (sync, _IO_default_sync),
> + JUMP_INIT (doallocate, _IO_wdefault_doallocate),
> + JUMP_INIT (read, _IO_default_read),
> + JUMP_INIT (write, _IO_default_write),
> + JUMP_INIT (seek, _IO_default_seek),
> + JUMP_INIT (close, _IO_default_close),
> + JUMP_INIT (stat, _IO_default_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue)
> + },
> + /* _IO_file_jumps */
> + [IO_FILE_JUMPS] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_file_finish),
> + JUMP_INIT (overflow, _IO_file_overflow),
> + JUMP_INIT (underflow, _IO_file_underflow),
> + JUMP_INIT (uflow, _IO_default_uflow),
> + JUMP_INIT (pbackfail, _IO_default_pbackfail),
> + JUMP_INIT (xsputn, _IO_file_xsputn),
> + JUMP_INIT (xsgetn, _IO_file_xsgetn),
> + JUMP_INIT (seekoff, _IO_new_file_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_new_file_setbuf),
> + JUMP_INIT (sync, _IO_new_file_sync),
> + JUMP_INIT (doallocate, _IO_file_doallocate),
> + JUMP_INIT (read, _IO_file_read),
> + JUMP_INIT (write, _IO_new_file_write),
> + JUMP_INIT (seek, _IO_file_seek),
> + JUMP_INIT (close, _IO_file_close),
> + JUMP_INIT (stat, _IO_file_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue)
> + },
> + /* _IO_file_jumps_mmap */
> + [IO_FILE_JUMPS_MMAP] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_file_finish),
> + JUMP_INIT (overflow, _IO_file_overflow),
> + JUMP_INIT (underflow, _IO_file_underflow_mmap),
> + JUMP_INIT (uflow, _IO_default_uflow),
> + JUMP_INIT (pbackfail, _IO_default_pbackfail),
> + JUMP_INIT (xsputn, _IO_new_file_xsputn),
> + JUMP_INIT (xsgetn, _IO_file_xsgetn_mmap),
> + JUMP_INIT (seekoff, _IO_file_seekoff_mmap),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, (_IO_setbuf_t) _IO_file_setbuf_mmap),
> + JUMP_INIT (sync, _IO_file_sync_mmap),
> + JUMP_INIT (doallocate, _IO_file_doallocate),
> + JUMP_INIT (read, _IO_file_read),
> + JUMP_INIT (write, _IO_new_file_write),
> + JUMP_INIT (seek, _IO_file_seek),
> + JUMP_INIT (close, _IO_file_close_mmap),
> + JUMP_INIT (stat, _IO_file_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue)
> + },
> + /* _IO_file_jumps_maybe_mmap */
> + [IO_FILE_JUMPS_MAYBE_MMAP] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_file_finish),
> + JUMP_INIT (overflow, _IO_file_overflow),
> + JUMP_INIT (underflow, _IO_file_underflow_maybe_mmap),
> + JUMP_INIT (uflow, _IO_default_uflow),
> + JUMP_INIT (pbackfail, _IO_default_pbackfail),
> + JUMP_INIT (xsputn, _IO_new_file_xsputn),
> + JUMP_INIT (xsgetn, _IO_file_xsgetn_maybe_mmap),
> + JUMP_INIT (seekoff, _IO_file_seekoff_maybe_mmap),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, (_IO_setbuf_t) _IO_file_setbuf_mmap),
> + JUMP_INIT (sync, _IO_new_file_sync),
> + JUMP_INIT (doallocate, _IO_file_doallocate),
> + JUMP_INIT (read, _IO_file_read),
> + JUMP_INIT (write, _IO_new_file_write),
> + JUMP_INIT (seek, _IO_file_seek),
> + JUMP_INIT (close, _IO_file_close),
> + JUMP_INIT (stat, _IO_file_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue)
> + },
> + /* _IO_wfile_jumps */
> + [IO_WFILE_JUMPS] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_new_file_finish),
> + JUMP_INIT (overflow, (_IO_overflow_t) _IO_wfile_overflow),
> + JUMP_INIT (underflow, (_IO_underflow_t) _IO_wfile_underflow),
> + JUMP_INIT (uflow, (_IO_underflow_t) _IO_wdefault_uflow),
> + JUMP_INIT (pbackfail, (_IO_pbackfail_t) _IO_wdefault_pbackfail),
> + JUMP_INIT (xsputn, _IO_wfile_xsputn),
> + JUMP_INIT (xsgetn, _IO_file_xsgetn),
> + JUMP_INIT (seekoff, _IO_wfile_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_new_file_setbuf),
> + JUMP_INIT (sync, (_IO_sync_t) _IO_wfile_sync),
> + JUMP_INIT (doallocate, _IO_wfile_doallocate),
> + JUMP_INIT (read, _IO_file_read),
> + JUMP_INIT (write, _IO_new_file_write),
> + JUMP_INIT (seek, _IO_file_seek),
> + JUMP_INIT (close, _IO_file_close),
> + JUMP_INIT (stat, _IO_file_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue)
> + },
> + /* _IO_wfile_jumps_mmap */
> + [IO_WFILE_JUMPS_MMAP] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_new_file_finish),
> + JUMP_INIT (overflow, (_IO_overflow_t) _IO_wfile_overflow),
> + JUMP_INIT (underflow, (_IO_underflow_t) _IO_wfile_underflow_mmap),
> + JUMP_INIT (uflow, (_IO_underflow_t) _IO_wdefault_uflow),
> + JUMP_INIT (pbackfail, (_IO_pbackfail_t) _IO_wdefault_pbackfail),
> + JUMP_INIT (xsputn, _IO_wfile_xsputn),
> + JUMP_INIT (xsgetn, _IO_file_xsgetn),
> + JUMP_INIT (seekoff, _IO_wfile_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_file_setbuf_mmap),
> + JUMP_INIT (sync, (_IO_sync_t) _IO_wfile_sync),
> + JUMP_INIT (doallocate, _IO_wfile_doallocate),
> + JUMP_INIT (read, _IO_file_read),
> + JUMP_INIT (write, _IO_new_file_write),
> + JUMP_INIT (seek, _IO_file_seek),
> + JUMP_INIT (close, _IO_file_close_mmap),
> + JUMP_INIT (stat, _IO_file_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue)
> + },
> + /* _IO_wfile_jumps_maybe_mmap */
> + [IO_WFILE_JUMPS_MAYBE_MMAP] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_new_file_finish),
> + JUMP_INIT (overflow, (_IO_overflow_t) _IO_wfile_overflow),
> + JUMP_INIT (underflow, (_IO_underflow_t) _IO_wfile_underflow_maybe_mmap),
> + JUMP_INIT (uflow, (_IO_underflow_t) _IO_wdefault_uflow),
> + JUMP_INIT (pbackfail, (_IO_pbackfail_t) _IO_wdefault_pbackfail),
> + JUMP_INIT (xsputn, _IO_wfile_xsputn),
> + JUMP_INIT (xsgetn, _IO_file_xsgetn),
> + JUMP_INIT (seekoff, _IO_wfile_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_file_setbuf_mmap),
> + JUMP_INIT (sync, (_IO_sync_t) _IO_wfile_sync),
> + JUMP_INIT (doallocate, _IO_wfile_doallocate),
> + JUMP_INIT (read, _IO_file_read),
> + JUMP_INIT (write, _IO_new_file_write),
> + JUMP_INIT (seek, _IO_file_seek),
> + JUMP_INIT (close, _IO_file_close),
> + JUMP_INIT (stat, _IO_file_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue)
> + },
> + /* _IO_cookie_jumps */
> + [IO_COOKIE_JUMPS] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_file_finish),
> + JUMP_INIT (overflow, _IO_file_overflow),
> + JUMP_INIT (underflow, _IO_file_underflow),
> + JUMP_INIT (uflow, _IO_default_uflow),
> + JUMP_INIT (pbackfail, _IO_default_pbackfail),
> + JUMP_INIT (xsputn, _IO_file_xsputn),
> + JUMP_INIT (xsgetn, _IO_default_xsgetn),
> + JUMP_INIT (seekoff, _IO_cookie_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_file_setbuf),
> + JUMP_INIT (sync, _IO_file_sync),
> + JUMP_INIT (doallocate, _IO_file_doallocate),
> + JUMP_INIT (read, _IO_cookie_read),
> + JUMP_INIT (write, _IO_cookie_write),
> + JUMP_INIT (seek, _IO_cookie_seek),
> + JUMP_INIT (close, _IO_cookie_close),
> + JUMP_INIT (stat, _IO_default_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue),
> + },
> + /* _IO_proc_jumps */
> + [IO_PROC_JUMPS] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_new_file_finish),
> + JUMP_INIT (overflow, _IO_new_file_overflow),
> + JUMP_INIT (underflow, _IO_new_file_underflow),
> + JUMP_INIT (uflow, _IO_default_uflow),
> + JUMP_INIT (pbackfail, _IO_default_pbackfail),
> + JUMP_INIT (xsputn, _IO_new_file_xsputn),
> + JUMP_INIT (xsgetn, _IO_default_xsgetn),
> + JUMP_INIT (seekoff, _IO_new_file_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_new_file_setbuf),
> + JUMP_INIT (sync, _IO_new_file_sync),
> + JUMP_INIT (doallocate, _IO_file_doallocate),
> + JUMP_INIT (read, _IO_file_read),
> + JUMP_INIT (write, _IO_new_file_write),
> + JUMP_INIT (seek, _IO_file_seek),
> + JUMP_INIT (close, _IO_new_proc_close),
> + JUMP_INIT (stat, _IO_file_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue)
> + },
> + /* _IO_mem_jumps */
> + [IO_MEM_JUMPS] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_mem_finish),
> + JUMP_INIT (overflow, _IO_str_overflow),
> + JUMP_INIT (underflow, _IO_str_underflow),
> + JUMP_INIT (uflow, _IO_default_uflow),
> + JUMP_INIT (pbackfail, _IO_str_pbackfail),
> + JUMP_INIT (xsputn, _IO_default_xsputn),
> + JUMP_INIT (xsgetn, _IO_default_xsgetn),
> + JUMP_INIT (seekoff, _IO_str_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_default_setbuf),
> + JUMP_INIT (sync, _IO_mem_sync),
> + JUMP_INIT (doallocate, _IO_default_doallocate),
> + JUMP_INIT (read, _IO_default_read),
> + JUMP_INIT (write, _IO_default_write),
> + JUMP_INIT (seek, _IO_default_seek),
> + JUMP_INIT (close, _IO_default_close),
> + JUMP_INIT (stat, _IO_default_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue)
> + },
> + /* _IO_wmem_jumps */
> + [IO_WMEM_JUMPS] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_wmem_finish),
> + JUMP_INIT (overflow, (_IO_overflow_t) _IO_wstr_overflow),
> + JUMP_INIT (underflow, (_IO_underflow_t) _IO_wstr_underflow),
> + JUMP_INIT (uflow, (_IO_underflow_t) _IO_wdefault_uflow),
> + JUMP_INIT (pbackfail, (_IO_pbackfail_t) _IO_wstr_pbackfail),
> + JUMP_INIT (xsputn, _IO_wdefault_xsputn),
> + JUMP_INIT (xsgetn, _IO_wdefault_xsgetn),
> + JUMP_INIT (seekoff, _IO_wstr_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_default_setbuf),
> + JUMP_INIT (sync, _IO_wmem_sync),
> + JUMP_INIT (doallocate, _IO_wdefault_doallocate),
> + JUMP_INIT (read, _IO_default_read),
> + JUMP_INIT (write, _IO_default_write),
> + JUMP_INIT (seek, _IO_default_seek),
> + JUMP_INIT (close, _IO_default_close),
> + JUMP_INIT (stat, _IO_default_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue)
> + },
> + [IO_PRINTF_BUFFER_AS_FILE_JUMPS] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, NULL),
> + JUMP_INIT (overflow, __printf_buffer_as_file_overflow),
> + JUMP_INIT (underflow, NULL),
> + JUMP_INIT (uflow, NULL),
> + JUMP_INIT (pbackfail, NULL),
> + JUMP_INIT (xsputn, __printf_buffer_as_file_xsputn),
> + JUMP_INIT (xsgetn, NULL),
> + JUMP_INIT (seekoff, NULL),
> + JUMP_INIT (seekpos, NULL),
> + JUMP_INIT (setbuf, NULL),
> + JUMP_INIT (sync, NULL),
> + JUMP_INIT (doallocate, NULL),
> + JUMP_INIT (read, NULL),
> + JUMP_INIT (write, NULL),
> + JUMP_INIT (seek, NULL),
> + JUMP_INIT (close, NULL),
> + JUMP_INIT (stat, NULL),
> + JUMP_INIT (showmanyc, NULL),
> + JUMP_INIT (imbue, NULL)
> + },
> + [IO_WPRINTF_BUFFER_AS_FILE_JUMPS] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, NULL),
> + JUMP_INIT (overflow, (_IO_overflow_t) __wprintf_buffer_as_file_overflow),
> + JUMP_INIT (underflow, NULL),
> + JUMP_INIT (uflow, NULL),
> + JUMP_INIT (pbackfail, NULL),
> + JUMP_INIT (xsputn, __wprintf_buffer_as_file_xsputn),
> + JUMP_INIT (xsgetn, NULL),
> + JUMP_INIT (seekoff, NULL),
> + JUMP_INIT (seekpos, NULL),
> + JUMP_INIT (setbuf, NULL),
> + JUMP_INIT (sync, NULL),
> + JUMP_INIT (doallocate, NULL),
> + JUMP_INIT (read, NULL),
> + JUMP_INIT (write, NULL),
> + JUMP_INIT (seek, NULL),
> + JUMP_INIT (close, NULL),
> + JUMP_INIT (stat, NULL),
> + JUMP_INIT (showmanyc, NULL),
> + JUMP_INIT (imbue, NULL)
> + },
> +
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> + /* _IO_old_file_jumps */
> + [IO_OLD_FILE_JUMPS] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_old_file_finish),
> + JUMP_INIT (overflow, _IO_old_file_overflow),
> + JUMP_INIT (underflow, _IO_old_file_underflow),
> + JUMP_INIT (uflow, _IO_default_uflow),
> + JUMP_INIT (pbackfail, _IO_default_pbackfail),
> + JUMP_INIT (xsputn, _IO_old_file_xsputn),
> + JUMP_INIT (xsgetn, _IO_default_xsgetn),
> + JUMP_INIT (seekoff, _IO_old_file_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_old_file_setbuf),
> + JUMP_INIT (sync, _IO_old_file_sync),
> + JUMP_INIT (doallocate, _IO_file_doallocate),
> + JUMP_INIT (read, _IO_file_read),
> + JUMP_INIT (write, _IO_old_file_write),
> + JUMP_INIT (seek, _IO_file_seek),
> + JUMP_INIT (close, _IO_file_close),
> + JUMP_INIT (stat, _IO_file_stat)
> + },
> + /* _IO_old_proc_jumps */
> + [IO_OLD_PROC_JUMPS] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_old_file_finish),
> + JUMP_INIT (overflow, _IO_old_file_overflow),
> + JUMP_INIT (underflow, _IO_old_file_underflow),
> + JUMP_INIT (uflow, _IO_default_uflow),
> + JUMP_INIT (pbackfail, _IO_default_pbackfail),
> + JUMP_INIT (xsputn, _IO_old_file_xsputn),
> + JUMP_INIT (xsgetn, _IO_default_xsgetn),
> + JUMP_INIT (seekoff, _IO_old_file_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_old_file_setbuf),
> + JUMP_INIT (sync, _IO_old_file_sync),
> + JUMP_INIT (doallocate, _IO_file_doallocate),
> + JUMP_INIT (read, _IO_file_read),
> + JUMP_INIT (write, _IO_old_file_write),
> + JUMP_INIT (seek, _IO_file_seek),
> + JUMP_INIT (close, _IO_old_proc_close),
> + JUMP_INIT (stat, _IO_file_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue)
> + },
> +#endif
> +
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
> + /* _IO_old_cookie_jumps */
> + [IO_OLD_COOKIED_JUMPS] = {
> + JUMP_INIT_DUMMY,
> + JUMP_INIT (finish, _IO_file_finish),
> + JUMP_INIT (overflow, _IO_file_overflow),
> + JUMP_INIT (underflow, _IO_file_underflow),
> + JUMP_INIT (uflow, _IO_default_uflow),
> + JUMP_INIT (pbackfail, _IO_default_pbackfail),
> + JUMP_INIT (xsputn, _IO_file_xsputn),
> + JUMP_INIT (xsgetn, _IO_default_xsgetn),
> + JUMP_INIT (seekoff, _IO_cookie_seekoff),
> + JUMP_INIT (seekpos, _IO_default_seekpos),
> + JUMP_INIT (setbuf, _IO_file_setbuf),
> + JUMP_INIT (sync, _IO_file_sync),
> + JUMP_INIT (doallocate, _IO_file_doallocate),
> + JUMP_INIT (read, _IO_cookie_read),
> + JUMP_INIT (write, _IO_cookie_write),
> + JUMP_INIT (seek, _IO_old_cookie_seek),
> + JUMP_INIT (close, _IO_cookie_close),
> + JUMP_INIT (stat, _IO_default_stat),
> + JUMP_INIT (showmanyc, _IO_default_showmanyc),
> + JUMP_INIT (imbue, _IO_default_imbue),
> + },
> +#endif
> +};
>
> #ifdef SHARED
>
> @@ -82,3 +567,15 @@ check_stdfiles_vtables (void)
> IO_set_accept_foreign_vtables (&_IO_vtable_check);
> }
> #endif
> +
> +#define STR(s) XSTR(s)
> +#define XSTR(s) #s
> +
> +#undef _IO_file_jumps
> +#define _IO_file_jumps_alias "__io_vtables + " STR(IO_FILE_JUMPS_OFFSET)
> +declare_object_symbol_alias (_IO_file_jumps, _IO_file_jumps_alias,
> + IO_JUMP_T_SIZE)
> +#undef _IO_wfile_jumps
> +#define _IO_wfile_jumps_alias "__io_vtables + " STR(IO_WFILE_JUMPS_OFFSET)
> +declare_object_symbol_alias (_IO_wfile_jumps, _IO_wfile_jumps_alias,
> + IO_JUMP_T_SIZE)
> diff --git a/libio/wfileops.c b/libio/wfileops.c
> index b59a98881f..f92d9b42eb 100644
> --- a/libio/wfileops.c
> +++ b/libio/wfileops.c
> @@ -328,7 +328,7 @@ _IO_wfile_underflow (FILE *fp)
> libc_hidden_def (_IO_wfile_underflow)
>
>
> -static wint_t
> +wint_t
> _IO_wfile_underflow_mmap (FILE *fp)
> {
> struct _IO_codecvt *cd;
> @@ -389,7 +389,7 @@ _IO_wfile_underflow_mmap (FILE *fp)
> return WEOF;
> }
>
> -static wint_t
> +wint_t
> _IO_wfile_underflow_maybe_mmap (FILE *fp)
> {
> /* This is the first read attempt. Doing the underflow will choose mmap
> @@ -1017,78 +1017,3 @@ _IO_wfile_xsputn (FILE *f, const void *data, size_t n)
> return n - to_do;
> }
> libc_hidden_def (_IO_wfile_xsputn)
> -
> -
> -const struct _IO_jump_t _IO_wfile_jumps libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_new_file_finish),
> - JUMP_INIT(overflow, (_IO_overflow_t) _IO_wfile_overflow),
> - JUMP_INIT(underflow, (_IO_underflow_t) _IO_wfile_underflow),
> - JUMP_INIT(uflow, (_IO_underflow_t) _IO_wdefault_uflow),
> - JUMP_INIT(pbackfail, (_IO_pbackfail_t) _IO_wdefault_pbackfail),
> - JUMP_INIT(xsputn, _IO_wfile_xsputn),
> - JUMP_INIT(xsgetn, _IO_file_xsgetn),
> - JUMP_INIT(seekoff, _IO_wfile_seekoff),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, _IO_new_file_setbuf),
> - JUMP_INIT(sync, (_IO_sync_t) _IO_wfile_sync),
> - JUMP_INIT(doallocate, _IO_wfile_doallocate),
> - JUMP_INIT(read, _IO_file_read),
> - JUMP_INIT(write, _IO_new_file_write),
> - JUMP_INIT(seek, _IO_file_seek),
> - JUMP_INIT(close, _IO_file_close),
> - JUMP_INIT(stat, _IO_file_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue)
> -};
> -libc_hidden_data_def (_IO_wfile_jumps)
> -
> -
> -const struct _IO_jump_t _IO_wfile_jumps_mmap libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_new_file_finish),
> - JUMP_INIT(overflow, (_IO_overflow_t) _IO_wfile_overflow),
> - JUMP_INIT(underflow, (_IO_underflow_t) _IO_wfile_underflow_mmap),
> - JUMP_INIT(uflow, (_IO_underflow_t) _IO_wdefault_uflow),
> - JUMP_INIT(pbackfail, (_IO_pbackfail_t) _IO_wdefault_pbackfail),
> - JUMP_INIT(xsputn, _IO_wfile_xsputn),
> - JUMP_INIT(xsgetn, _IO_file_xsgetn),
> - JUMP_INIT(seekoff, _IO_wfile_seekoff),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, _IO_file_setbuf_mmap),
> - JUMP_INIT(sync, (_IO_sync_t) _IO_wfile_sync),
> - JUMP_INIT(doallocate, _IO_wfile_doallocate),
> - JUMP_INIT(read, _IO_file_read),
> - JUMP_INIT(write, _IO_new_file_write),
> - JUMP_INIT(seek, _IO_file_seek),
> - JUMP_INIT(close, _IO_file_close_mmap),
> - JUMP_INIT(stat, _IO_file_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue)
> -};
> -
> -const struct _IO_jump_t _IO_wfile_jumps_maybe_mmap libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_new_file_finish),
> - JUMP_INIT(overflow, (_IO_overflow_t) _IO_wfile_overflow),
> - JUMP_INIT(underflow, (_IO_underflow_t) _IO_wfile_underflow_maybe_mmap),
> - JUMP_INIT(uflow, (_IO_underflow_t) _IO_wdefault_uflow),
> - JUMP_INIT(pbackfail, (_IO_pbackfail_t) _IO_wdefault_pbackfail),
> - JUMP_INIT(xsputn, _IO_wfile_xsputn),
> - JUMP_INIT(xsgetn, _IO_file_xsgetn),
> - JUMP_INIT(seekoff, _IO_wfile_seekoff),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, _IO_file_setbuf_mmap),
> - JUMP_INIT(sync, (_IO_sync_t) _IO_wfile_sync),
> - JUMP_INIT(doallocate, _IO_wfile_doallocate),
> - JUMP_INIT(read, _IO_file_read),
> - JUMP_INIT(write, _IO_new_file_write),
> - JUMP_INIT(seek, _IO_file_seek),
> - JUMP_INIT(close, _IO_file_close),
> - JUMP_INIT(stat, _IO_file_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue)
> -};
> diff --git a/libio/wmemstream.c b/libio/wmemstream.c
> index e7f898c7fb..50ad1bdc86 100644
> --- a/libio/wmemstream.c
> +++ b/libio/wmemstream.c
> @@ -30,34 +30,6 @@ struct _IO_FILE_wmemstream
> };
>
>
> -static int _IO_wmem_sync (FILE* fp) __THROW;
> -static void _IO_wmem_finish (FILE* fp, int) __THROW;
> -
> -
> -static const struct _IO_jump_t _IO_wmem_jumps libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT (finish, _IO_wmem_finish),
> - JUMP_INIT (overflow, (_IO_overflow_t) _IO_wstr_overflow),
> - JUMP_INIT (underflow, (_IO_underflow_t) _IO_wstr_underflow),
> - JUMP_INIT (uflow, (_IO_underflow_t) _IO_wdefault_uflow),
> - JUMP_INIT (pbackfail, (_IO_pbackfail_t) _IO_wstr_pbackfail),
> - JUMP_INIT (xsputn, _IO_wdefault_xsputn),
> - JUMP_INIT (xsgetn, _IO_wdefault_xsgetn),
> - JUMP_INIT (seekoff, _IO_wstr_seekoff),
> - JUMP_INIT (seekpos, _IO_default_seekpos),
> - JUMP_INIT (setbuf, _IO_default_setbuf),
> - JUMP_INIT (sync, _IO_wmem_sync),
> - JUMP_INIT (doallocate, _IO_wdefault_doallocate),
> - JUMP_INIT (read, _IO_default_read),
> - JUMP_INIT (write, _IO_default_write),
> - JUMP_INIT (seek, _IO_default_seek),
> - JUMP_INIT (close, _IO_default_close),
> - JUMP_INIT (stat, _IO_default_stat),
> - JUMP_INIT (showmanyc, _IO_default_showmanyc),
> - JUMP_INIT (imbue, _IO_default_imbue)
> -};
> -
> /* Open a stream that writes into a malloc'd buffer that is expanded as
> necessary. *BUFLOC and *SIZELOC are updated with the buffer's location
> and the number of characters written on fflush or fclose. */
> @@ -105,7 +77,7 @@ open_wmemstream (wchar_t **bufloc, size_t *sizeloc)
> }
>
>
> -static int
> +int
> _IO_wmem_sync (FILE *fp)
> {
> struct _IO_FILE_wmemstream *mp = (struct _IO_FILE_wmemstream *) fp;
> @@ -124,7 +96,7 @@ _IO_wmem_sync (FILE *fp)
> }
>
>
> -static void
> +void
> _IO_wmem_finish (FILE *fp, int dummy)
> {
> struct _IO_FILE_wmemstream *mp = (struct _IO_FILE_wmemstream *) fp;
> diff --git a/libio/wstrops.c b/libio/wstrops.c
> index 2aec314937..ac7efe9f65 100644
> --- a/libio/wstrops.c
> +++ b/libio/wstrops.c
> @@ -361,27 +361,3 @@ _IO_wstr_finish (FILE *fp, int dummy)
>
> _IO_wdefault_finish (fp, 0);
> }
> -
> -const struct _IO_jump_t _IO_wstr_jumps libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, _IO_wstr_finish),
> - JUMP_INIT(overflow, (_IO_overflow_t) _IO_wstr_overflow),
> - JUMP_INIT(underflow, (_IO_underflow_t) _IO_wstr_underflow),
> - JUMP_INIT(uflow, (_IO_underflow_t) _IO_wdefault_uflow),
> - JUMP_INIT(pbackfail, (_IO_pbackfail_t) _IO_wstr_pbackfail),
> - JUMP_INIT(xsputn, _IO_wdefault_xsputn),
> - JUMP_INIT(xsgetn, _IO_wdefault_xsgetn),
> - JUMP_INIT(seekoff, _IO_wstr_seekoff),
> - JUMP_INIT(seekpos, _IO_default_seekpos),
> - JUMP_INIT(setbuf, _IO_default_setbuf),
> - JUMP_INIT(sync, _IO_default_sync),
> - JUMP_INIT(doallocate, _IO_wdefault_doallocate),
> - JUMP_INIT(read, _IO_default_read),
> - JUMP_INIT(write, _IO_default_write),
> - JUMP_INIT(seek, _IO_default_seek),
> - JUMP_INIT(close, _IO_default_close),
> - JUMP_INIT(stat, _IO_default_stat),
> - JUMP_INIT(showmanyc, _IO_default_showmanyc),
> - JUMP_INIT(imbue, _IO_default_imbue)
> -};
> diff --git a/stdio-common/printf_buffer_as_file.c b/stdio-common/printf_buffer_as_file.c
> index f27b000d78..cd36fa77e4 100644
> --- a/stdio-common/printf_buffer_as_file.c
> +++ b/stdio-common/printf_buffer_as_file.c
> @@ -48,7 +48,7 @@ __printf_buffer_as_file_switch_to_buffer (struct __printf_buffer_as_file *file)
> /* Only a small subset of the vtable functions is implemented here,
> following _IO_obstack_jumps. */
>
> -static int
> +int
> __printf_buffer_as_file_overflow (FILE *fp, int ch)
> {
> struct __printf_buffer_as_file *file = (struct __printf_buffer_as_file *) fp;
> @@ -72,7 +72,7 @@ __printf_buffer_as_file_overflow (FILE *fp, int ch)
> return EOF;
> }
>
> -static size_t
> +size_t
> __printf_buffer_as_file_xsputn (FILE *fp, const void *buf, size_t len)
> {
> struct __printf_buffer_as_file *file = (struct __printf_buffer_as_file *) fp;
> @@ -93,30 +93,6 @@ __printf_buffer_as_file_xsputn (FILE *fp, const void *buf, size_t len)
> return 0;
> }
>
> -static const struct _IO_jump_t _IO_printf_buffer_as_file_jumps libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, NULL),
> - JUMP_INIT(overflow, __printf_buffer_as_file_overflow),
> - JUMP_INIT(underflow, NULL),
> - JUMP_INIT(uflow, NULL),
> - JUMP_INIT(pbackfail, NULL),
> - JUMP_INIT(xsputn, __printf_buffer_as_file_xsputn),
> - JUMP_INIT(xsgetn, NULL),
> - JUMP_INIT(seekoff, NULL),
> - JUMP_INIT(seekpos, NULL),
> - JUMP_INIT(setbuf, NULL),
> - JUMP_INIT(sync, NULL),
> - JUMP_INIT(doallocate, NULL),
> - JUMP_INIT(read, NULL),
> - JUMP_INIT(write, NULL),
> - JUMP_INIT(seek, NULL),
> - JUMP_INIT(close, NULL),
> - JUMP_INIT(stat, NULL),
> - JUMP_INIT(showmanyc, NULL),
> - JUMP_INIT(imbue, NULL)
> -};
> -
> void
> __printf_buffer_as_file_init (struct __printf_buffer_as_file *file,
> struct __printf_buffer *next)
> diff --git a/stdio-common/wprintf_buffer_as_file.c b/stdio-common/wprintf_buffer_as_file.c
> index cd48a7d42a..f0d05f8b4a 100644
> --- a/stdio-common/wprintf_buffer_as_file.c
> +++ b/stdio-common/wprintf_buffer_as_file.c
> @@ -48,7 +48,7 @@ __wprintf_buffer_as_file_switch_to_buffer (struct __wprintf_buffer_as_file *file
> /* Only a small subset of the vtable functions is implemented here,
> following _IO_obstack_jumps. */
>
> -static wint_t
> +wint_t
> __wprintf_buffer_as_file_overflow (FILE *fp, int ch)
> {
> struct __wprintf_buffer_as_file *file
> @@ -75,7 +75,7 @@ __wprintf_buffer_as_file_overflow (FILE *fp, int ch)
> return WEOF;
> }
>
> -static size_t
> +size_t
> __wprintf_buffer_as_file_xsputn (FILE *fp, const void *buf, size_t len)
> {
> struct __wprintf_buffer_as_file *file
> @@ -97,30 +97,6 @@ __wprintf_buffer_as_file_xsputn (FILE *fp, const void *buf, size_t len)
> return 0;
> }
>
> -static const struct _IO_jump_t _IO_wprintf_buffer_as_file_jumps libio_vtable =
> -{
> - JUMP_INIT_DUMMY,
> - JUMP_INIT(finish, NULL),
> - JUMP_INIT(overflow, (_IO_overflow_t) __wprintf_buffer_as_file_overflow),
> - JUMP_INIT(underflow, NULL),
> - JUMP_INIT(uflow, NULL),
> - JUMP_INIT(pbackfail, NULL),
> - JUMP_INIT(xsputn, __wprintf_buffer_as_file_xsputn),
> - JUMP_INIT(xsgetn, NULL),
> - JUMP_INIT(seekoff, NULL),
> - JUMP_INIT(seekpos, NULL),
> - JUMP_INIT(setbuf, NULL),
> - JUMP_INIT(sync, NULL),
> - JUMP_INIT(doallocate, NULL),
> - JUMP_INIT(read, NULL),
> - JUMP_INIT(write, NULL),
> - JUMP_INIT(seek, NULL),
> - JUMP_INIT(close, NULL),
> - JUMP_INIT(stat, NULL),
> - JUMP_INIT(showmanyc, NULL),
> - JUMP_INIT(imbue, NULL)
> -};
> -
> void
> __wprintf_buffer_as_file_init (struct __wprintf_buffer_as_file *file,
> struct __wprintf_buffer *next)
This patch seems to confuse GNU make 4.4+ in the libio subdirectory (for
me, it just spins forever). 4.3 seems unaffected.
make subdir=libio -C libio ..=../ subdir_lib
make[3]: Entering directory '/home/arsen/gnu/glibc/glibc/libio'
^Cmake[2]: *** [Makefile:484: libio/subdir_lib] Interrupt
I'll investigate later today, but I'm letting you know so that it's not
forgotten.
I'm decently sure this is a bug in GNU make from how it behaves.
Have a lovely day.
--
Arsen Arsenović
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 251 bytes --]
next prev parent reply other threads:[~2023-03-06 15:05 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-27 21:11 [PATCH v3 0/4] Remove --with-default-link option Adhemerval Zanella
2022-12-27 21:11 ` [PATCH v3 1/4] Move libc_freeres_ptrs and libc_subfreeres to hidden/weak functions Adhemerval Zanella
2023-03-04 17:37 ` Carlos O'Donell
2022-12-27 21:11 ` [PATCH v3 2/4] libio: Remove the usage of __libc_IO_vtables Adhemerval Zanella
2023-03-04 17:37 ` Carlos O'Donell
2023-03-06 13:43 ` Adhemerval Zanella Netto
2023-03-27 12:53 ` Carlos O'Donell
2023-03-06 14:58 ` Arsen Arsenović [this message]
2023-03-06 16:01 ` Adhemerval Zanella Netto
2023-03-06 16:31 ` Andreas Schwab
2023-03-06 16:39 ` Adhemerval Zanella Netto
2023-03-06 16:53 ` Andreas Schwab
2023-03-06 17:24 ` Adhemerval Zanella Netto
2023-03-06 18:17 ` Adhemerval Zanella Netto
2023-03-06 18:47 ` Arsen Arsenović
2023-03-06 18:53 ` Adhemerval Zanella Netto
2023-03-06 19:10 ` Arsen Arsenović
2023-03-06 19:20 ` Adhemerval Zanella Netto
2023-03-06 19:26 ` Arsen Arsenović
2023-03-06 16:23 ` Andreas Schwab
2022-12-27 21:11 ` [PATCH v3 3/4] Remove --with-default-link configure option Adhemerval Zanella
2023-03-04 17:39 ` Carlos O'Donell
2022-12-27 21:11 ` [PATCH v3 4/4] Remove set-hooks.h from generic includes Adhemerval Zanella
2023-03-04 17:42 ` Carlos O'Donell
2023-03-04 17:37 ` [PATCH v3 0/4] Remove --with-default-link option Carlos O'Donell
2023-03-06 13:43 ` Adhemerval Zanella Netto
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87bkl5ncob.fsf@aarsen.me \
--to=arsen@aarsen.me \
--cc=adhemerval.zanella@linaro.org \
--cc=fweimer@redhat.com \
--cc=libc-alpha@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).