From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout-p-103.mailbox.org (mout-p-103.mailbox.org [80.241.56.161]) by sourceware.org (Postfix) with ESMTPS id 9A1393858D39 for ; Mon, 6 Mar 2023 15:05:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9A1393858D39 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=aarsen.me Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=aarsen.me Received: from smtp2.mailbox.org (smtp2.mailbox.org [10.196.197.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-103.mailbox.org (Postfix) with ESMTPS id 4PVhh93DBRz9sjZ; Mon, 6 Mar 2023 16:04:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aarsen.me; s=MBO0001; t=1678115097; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=/sZCdRrZkrkJoGml2TT4qTBnT1qWXgUJZG9wjgxTtdg=; b=Nh+f3zoImzt9lbIvVJ2suKoNjS4j/leLbPGOmIElW2EFgIJy8CwBbzuNNNGK2NEu+LdBOV YlkOH+ePxbLBIcD8DSnDO84EszMP0SmbPXwP3qnlP7n70S4aIwlkQ3DvYtTpTXXWNrLNOR IfrWt5BbmzrQ5hwCiuNZhvWlo5jaQr3xvWuo6dtynI1dC9gGkX+6oV7EbhCHVSUpPCZuFP VIla4J5LFqmycZ4WsQdrnfRMyyg6vy2v5Y7zAwVpEV+HrmWlLjtzVZnPy+/cimWspvJ7dh ctH4QqHa6aaG2nAPNehIk+O2OthO7X4LhaiPkT3qQWdRcKndNP400jYR+J3KPA== References: <20221227211145.3765256-1-adhemerval.zanella@linaro.org> <20221227211145.3765256-3-adhemerval.zanella@linaro.org> From: Arsen =?utf-8?Q?Arsenovi=C4=87?= To: Adhemerval Zanella Cc: Florian Weimer , 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 In-reply-to: <20221227211145.3765256-3-adhemerval.zanella@linaro.org> Message-ID: <87bkl5ncob.fsf@aarsen.me> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Status: No, score=-9.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_INFOUSMEBIZ,KAM_STOCKGEN,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_PASS,TXREP,URIBL_BLACK autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Adhemerval, Adhemerval Zanella via Libc-alpha 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-L= DFLAGS) \ > -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=3D$(rpath-link) > endef >=20=20 > -ifeq (yes,$(use-default-link)) > # If the linker is good enough, we can let it use its default linker scr= ipt. > # In the long term the custom linker script will be removed. > shlib-lds =3D > shlib-lds-flags =3D > -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=3Dbfd. > -$(common-objpfx)shlib.lds: $(common-objpfx)config.make $(..)Makerules > - $(LINK.o) -shared -Wl,-O1 \ > - -nostdlib -nostartfiles -fuse-ld=3Dbfd \ > - $(sysdep-LDFLAGS) $(rtld-LDFLAGS) $(LDFLAGS.so) \ > - -Wl,--verbose 2>/dev/null | \ > - sed > $@T \ > - -e '/^=3D=3D=3D=3D=3D=3D=3D=3D=3D/,/^=3D=3D=3D=3D=3D=3D=3D=3D=3D/= !d;/^=3D=3D=3D=3D=3D=3D=3D=3D=3D/d' \ > - -e 's@^.*\*(\.jcr).*$$@& \ > - PROVIDE(__start___libc_IO_vtables =3D .);\ > - __libc_IO_vtables : { *(__libc_IO_vtables) }\ > - PROVIDE(__stop___libc_IO_vtables =3D .);\ > - /DISCARD/ : { *(.gnu.glibc-stub.*) }@' > - test -s $@T > - mv -f $@T $@ > -common-generated +=3D shlib.lds > - > -shlib-lds =3D $(common-objpfx)shlib.lds > -shlib-lds-flags =3D -T $(shlib-lds) > -endif >=20=20 > 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=3D_IO_cookie_jumps \ > --required=3D_IO_file_jumps \ > - --required=3D_IO_file_jumps_maybe_mmap \ > - --required=3D_IO_file_jumps_mmap \ > - --required=3D_IO_mem_jumps \ > - --required=3D_IO_printf_buffer_as_file_jumps \ > - --required=3D_IO_proc_jumps \ > - --required=3D_IO_str_jumps \ > --required=3D_IO_wfile_jumps \ > - --required=3D_IO_wfile_jumps_maybe_mmap \ > - --required=3D_IO_wfile_jumps_mmap \ > - --required=3D_IO_wmem_jumps \ > - --required=3D_IO_wprintf_buffer_as_file_jumps \ > - --required=3D_IO_wstr_jumps \ > - --optional=3D_IO_old_cookie_jumps \ > - --optional=3D_IO_old_file_jumps \ > - --optional=3D_IO_old_proc_jumps \ > + --required=3D__io_vtables \ > > $@ 2>&1; $(evaluate-test) >=20=20 > 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 compil= er > 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 " =3D " __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 " =3D " __SYMBOL_PREFIX original "\n" \ > + ".size " __SYMBOL_PREFIX #symbol ", " #size "\n"); > # endif /* HAVE_ASM_SET_DIRECTIVE */ > #endif /* __ASSEMBLER__ */ >=20=20 > diff --git a/libio/Makefile b/libio/Makefile > index 64398ab1ee..fc67aea9e2 100644 > --- a/libio/Makefile > +++ b/libio/Makefile > @@ -51,6 +51,8 @@ routines :=3D \ > \ > libc_fatal fmemopen oldfmemopen vtables >=20=20 > +gen-as-const-headers +=3D libio-macros.sym > + > tests =3D 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) >=20=20 > -static int > +int > _IO_file_sync_mmap (FILE *fp) > { > if (fp->_IO_read_ptr !=3D fp->_IO_read_end) > @@ -1109,7 +1109,7 @@ _IO_file_seekoff_mmap (FILE *fp, off64_t offset, in= t dir, int mode) > return offset; > } >=20=20 > -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) >=20=20 > -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; > } >=20=20 > -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, GLIB= C_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 =3D > -{ > - 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 =3D > -{ > - 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 =3D > -{ > - 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 > #include >=20=20 > -static ssize_t > +ssize_t > _IO_cookie_read (FILE *fp, void *buf, ssize_t size) > { > struct _IO_cookie_file *cfile =3D (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); > } >=20=20 > -static ssize_t > +ssize_t > _IO_cookie_write (FILE *fp, const void *buf, ssize_t size) > { > struct _IO_cookie_file *cfile =3D (struct _IO_cookie_file *) fp; > @@ -63,7 +63,7 @@ _IO_cookie_write (FILE *fp, const void *buf, ssize_t si= ze) > return n; > } >=20=20 > -static off64_t > +off64_t > _IO_cookie_seek (FILE *fp, off64_t offset, int dir) > { > struct _IO_cookie_file *cfile =3D (struct _IO_cookie_file *) fp; > @@ -77,7 +77,7 @@ _IO_cookie_seek (FILE *fp, off64_t offset, int dir) > ? _IO_pos_BAD : offset); > } >=20=20 > -static int > +int > _IO_cookie_close (FILE *fp) > { > struct _IO_cookie_file *cfile =3D (struct _IO_cookie_file *) fp; > @@ -91,7 +91,7 @@ _IO_cookie_close (FILE *fp) > } >=20=20 >=20=20 > -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 di= r, int mode) > return _IO_file_seekoff (fp, offset, dir, mode); > } >=20=20 > - > -static const struct _IO_jump_t _IO_cookie_jumps libio_vtable =3D { > - 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); >=20=20 > #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2) >=20=20 > -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 d= ir) > return (ret =3D=3D -1) ? _IO_pos_BAD : ret; > } >=20=20 > -static const struct _IO_jump_t _IO_old_cookie_jumps libio_vtable =3D { > - 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; >=20=20 > -static const struct _IO_jump_t _IO_proc_jumps; > - > static struct _IO_proc_file *proc_file_chain; >=20=20 > #ifdef _IO_MTSAFE_IO > @@ -291,29 +289,6 @@ _IO_new_proc_close (FILE *fp) > return wstatus; > } >=20=20 > -static const struct _IO_jump_t _IO_proc_jumps libio_vtable =3D { > - 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 > + > +-- > + > +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; >=20=20 > -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_hidde= n; > -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_hidd= en; > -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 =3D 0, > + IO_WSTR_JUMPS =3D 1, > + IO_FILE_JUMPS =3D 2, > + IO_FILE_JUMPS_MMAP =3D 3, > + IO_FILE_JUMPS_MAYBE_MMAP =3D 4, > + IO_WFILE_JUMPS =3D 5, > + IO_WFILE_JUMPS_MMAP =3D 6, > + IO_WFILE_JUMPS_MAYBE_MMAP =3D 7, > + IO_COOKIE_JUMPS =3D 8, > + IO_PROC_JUMPS =3D 9, > + IO_MEM_JUMPS =3D 10, > + IO_WMEM_JUMPS =3D 11, > + IO_PRINTF_BUFFER_AS_FILE_JUMPS =3D 12, > + IO_WPRINTF_BUFFER_AS_FILE_JUMPS =3D 13, > +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) > + IO_OLD_FILE_JUMPS =3D 14, > + IO_OLD_PROC_JUMPS =3D 15, > + IO_OLD_COOKIED_JUMPS =3D 16, > + IO_VTABLES_NUM =3D IO_OLD_COOKIED_JUMPS + 1, > +#elif SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2) > + IO_OLD_COOKIED_JUMPS =3D 14, > + IO_VTABLES_NUM =3D IO_OLD_COOKIED_JUMPS + 1, > +#else > + IO_VTABLES_NUM =3D 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_MMA= P]) > +#define _IO_file_jumps_maybe_mmap (__io_vtables[IO_FILE_JUMPS_MAY= BE_MMAP]) > +#define _IO_wfile_jumps (__io_vtables[IO_WFILE_JUMPS]) > +#define _IO_wfile_jumps_mmap (__io_vtables[IO_WFILE_JUMPS_MM= AP]) > +#define _IO_wfile_jumps_maybe_mmap (__io_vtables[IO_WFILE_JUMPS_MA= YBE_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_JU= MPS]) > + > +#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_F= ILE_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, in= t 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; >=20=20 > /* 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, in= t 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; >=20=20 > /* 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; >=20=20 > /* 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, in= t, int) > extern wint_t _IO_wstr_pbackfail (FILE *, wint_t) __THROW; > extern void _IO_wstr_finish (FILE *, int) __THROW; >=20=20 > +/* 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 >=20=20 > -/* 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 =3D __stop___libc_IO_vtables - __start___libc= _IO_vtables; > uintptr_t ptr =3D (uintptr_t) vtable; > - uintptr_t offset =3D ptr - (uintptr_t) __start___libc_IO_vtables; > - if (__glibc_unlikely (offset >=3D section_length)) > + uintptr_t offset =3D ptr - (uintptr_t) &__io_vtables; > + if (__glibc_unlikely (offset >=3D 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 > }; >=20=20 >=20=20 > -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 =3D > -{ > - 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 locati= on > 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) >=20=20 >=20=20 > -static int > +int > _IO_mem_sync (FILE *fp) > { > struct _IO_FILE_memstream *mp =3D (struct _IO_FILE_memstream *) fp; > @@ -123,7 +95,7 @@ _IO_mem_sync (FILE *fp) > } >=20=20 >=20=20 > -static void > +void > _IO_mem_finish (FILE *fp, int dummy) > { > struct _IO_FILE_memstream *mp =3D (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; > } >=20=20 > - > -const struct _IO_jump_t _IO_old_file_jumps libio_vtable =3D > -{ > - 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; > } >=20=20 > -const struct _IO_jump_t _IO_old_proc_jumps libio_vtable =3D { > - 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 =3D (FILE *) &_IO_2_1_stdin_; > FILE *stdout =3D (FILE *) &_IO_2_1_stdout_; > FILE *stderr =3D (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; >=20=20 > -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) >=20=20 > _IO_default_finish (fp, 0); > } > - > -const struct _IO_jump_t _IO_str_jumps libio_vtable =3D > -{ > - 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-interpose= d.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" >=20=20 > 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 > #include > #include > +#include > + > +/* 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 =3D > +{ > + /* _IO_str_jumps */ > + [IO_STR_JUMPS] =3D > + { > + 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] =3D { > + 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] =3D { > + 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] =3D { > + 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] =3D { > + 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] =3D { > + 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] =3D { > + 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] =3D { > + 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_mm= ap), > + 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] =3D { > + 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] =3D { > + 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] =3D { > + 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] =3D { > + 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] =3D { > + 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] =3D { > + JUMP_INIT_DUMMY, > + JUMP_INIT (finish, NULL), > + JUMP_INIT (overflow, (_IO_overflow_t) __wprintf_buffer_as_file_overf= low), > + 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] =3D { > + 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] =3D { > + 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] =3D { > + 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 > +}; >=20=20 > #ifdef SHARED >=20=20 > @@ -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_OFFS= ET) > +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) >=20=20 >=20=20 > -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; > } >=20=20 > -static wint_t > +wint_t > _IO_wfile_underflow_maybe_mmap (FILE *fp) > { > /* This is the first read attempt. Doing the underflow will choose mm= ap > @@ -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 =3D > -{ > - 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 =3D > -{ > - 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 =3D > -{ > - 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 > }; >=20=20 >=20=20 > -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 =3D > -{ > - 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 locati= on > and the number of characters written on fflush or fclose. */ > @@ -105,7 +77,7 @@ open_wmemstream (wchar_t **bufloc, size_t *sizeloc) > } >=20=20 >=20=20 > -static int > +int > _IO_wmem_sync (FILE *fp) > { > struct _IO_FILE_wmemstream *mp =3D (struct _IO_FILE_wmemstream *) fp; > @@ -124,7 +96,7 @@ _IO_wmem_sync (FILE *fp) > } >=20=20 >=20=20 > -static void > +void > _IO_wmem_finish (FILE *fp, int dummy) > { > struct _IO_FILE_wmemstream *mp =3D (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) >=20=20 > _IO_wdefault_finish (fp, 0); > } > - > -const struct _IO_jump_t _IO_wstr_jumps libio_vtable =3D > -{ > - 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_b= uffer_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 __prin= tf_buffer_as_file *file) > /* Only a small subset of the vtable functions is implemented here, > following _IO_obstack_jumps. */ >=20=20 > -static int > +int > __printf_buffer_as_file_overflow (FILE *fp, int ch) > { > struct __printf_buffer_as_file *file =3D (struct __printf_buffer_as_fi= le *) fp; > @@ -72,7 +72,7 @@ __printf_buffer_as_file_overflow (FILE *fp, int ch) > return EOF; > } >=20=20 > -static size_t > +size_t > __printf_buffer_as_file_xsputn (FILE *fp, const void *buf, size_t len) > { > struct __printf_buffer_as_file *file =3D (struct __printf_buffer_as_fi= le *) fp; > @@ -93,30 +93,6 @@ __printf_buffer_as_file_xsputn (FILE *fp, const void *= buf, size_t len) > return 0; > } >=20=20 > -static const struct _IO_jump_t _IO_printf_buffer_as_file_jumps libio_vta= ble =3D > -{ > - 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 __wpr= intf_buffer_as_file *file > /* Only a small subset of the vtable functions is implemented here, > following _IO_obstack_jumps. */ >=20=20 > -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; > } >=20=20 > -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; > } >=20=20 > -static const struct _IO_jump_t _IO_wprintf_buffer_as_file_jumps libio_vt= able =3D > -{ > - 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=3Dlibio -C libio ..=3D../ 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. =2D-=20 Arsen Arsenovi=C4=87 --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iIYEARYKAC4WIQT+4rPRE/wAoxYtYGFSwpQwHqLEkwUCZAYBFBAcYXJzZW5AYWFy c2VuLm1lAAoJEFLClDAeosSTUl4BAIZ4iSGryL8HNypOgBqtE1xqt+N6ouTlAw0Z 2p/EOkC0AP4sRcBeUv+l2lI5MDSvRrlWoDyNZBUJS74cUHhqZ4gRAA== =1Oia -----END PGP SIGNATURE----- --=-=-=--