about summary refs log tree commit diff
path: root/stdio-common
diff options
context:
space:
mode:
authorAdhemerval Zanella Netto <adhemerval.zanella@linaro.org>2022-12-27 18:11:43 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2023-03-27 13:57:55 -0300
commit3020f72618e4f1d7338cd42b8bc7b2813e961b5a (patch)
treed61cc39cb5aa140de5331cd1a2ba6ab796db0c81 /stdio-common
parentf65ca70deaf38db4ca12458e74cefd8ad9063956 (diff)
downloadglibc-3020f72618e4f1d7338cd42b8bc7b2813e961b5a.tar.gz
glibc-3020f72618e4f1d7338cd42b8bc7b2813e961b5a.tar.xz
glibc-3020f72618e4f1d7338cd42b8bc7b2813e961b5a.zip
libio: Remove the usage of __libc_IO_vtables
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 all 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 including all vtable
referenced objects, all required function pointers are set to weak alias.

Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'stdio-common')
-rw-r--r--stdio-common/printf_buffer_as_file.c28
-rw-r--r--stdio-common/wprintf_buffer_as_file.c28
2 files changed, 4 insertions, 52 deletions
diff --git a/stdio-common/printf_buffer_as_file.c b/stdio-common/printf_buffer_as_file.c
index 12b0e13f41..fe23797da2 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 b2e5b5ada9..dbdb8cc535 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)