From 9edd4a9979f520abc6a3f5c0029966b5cc0f280e Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Sat, 2 Jun 2018 22:00:18 +0300 Subject: libc: Wrap low level glibc io calls for stdio This is much less work and actually works better. --- src/libc-stdio.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/libc-stdio.c (limited to 'src/libc-stdio.c') diff --git a/src/libc-stdio.c b/src/libc-stdio.c new file mode 100644 index 0000000..713497b --- /dev/null +++ b/src/libc-stdio.c @@ -0,0 +1,42 @@ +#include + +struct bionic___sFILE { +#if defined(__LP64__) + char __private[152]; +#else + char __private[84]; +#endif +} __attribute__((aligned(sizeof(void*)))); + +// Bionic standard stream support pre-M Android +// Post-M it's saner and they point to stdin/stdout/stderr symbols instead +const struct bionic___sFILE bionic___sF[3] = { + {{ 's', 't', 'd', 'i', 'n' }}, + {{ 's', 't', 'd', 'o', 'u', 't' }}, + {{ 's', 't', 'd', 'e', 'r', 'r' }} +}; + +static inline FILE* +bionic_file_to_glibc_file(FILE *f) +{ + if (f == (void*)&bionic___sF[0]) + return stdin; + else if (f == (void*)&bionic___sF[1]) + return stdout; + else if (f == (void*)&bionic___sF[2]) + return stderr; + return f; +} + +// Wrapping internal glibc VTABLE functions to handle bionic's pre-M crap +// We define __real_IO_file_xsputn in libc.c so linker will link our library, +// it's not used however for anything. + +extern size_t +__real_IO_file_xsputn(FILE *f, const void *buf, size_t n); + +size_t +__wrap_IO_file_xsputn(FILE *f, const void *buf, size_t n) +{ + return __real_IO_file_xsputn(bionic_file_to_glibc_file(f), buf, n); +} -- cgit v1.2.3