diff options
Diffstat (limited to 'lib/libc/stdio')
-rw-r--r-- | lib/libc/stdio/findfp.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/libc/stdio/findfp.c b/lib/libc/stdio/findfp.c index 4911400..3754258 100644 --- a/lib/libc/stdio/findfp.c +++ b/lib/libc/stdio/findfp.c @@ -77,6 +77,26 @@ FILE __sF[3] = { std(__SWR|__SNBF, STDERR_FILENO) }; +/* + * The following kludge is done to ensure enough binary compatibility + * with future versions of libc. Or rather it allows us to work with + * libraries that have been built with a newer libc that defines these + * symbols and expects libc to provide them. We only have need to support + * i386 and alpha because they are the only "old" systems we have deployed. + */ +#if defined(__i386__) +#define FILE_SIZE 88 +#elif defined(__alpha__) +#define FILE_SIZE 152 +#endif +#ifndef FILE_SIZE +#error "You must define FILE_SIZE for this platform" +#endif +#define X(loc, sym) __strong_reference(loc, sym) +X(__sF + FILE_SIZE * 0, __stdin); +X(__sF + FILE_SIZE * 1, __stdout); +X(__sF + FILE_SIZE * 2, __stderr); + struct glue __sglue = { &uglue, 3, __sF }; static struct glue *lastglue = &uglue; @@ -213,11 +233,14 @@ _cleanup() /* * __sinit() is called whenever stdio's internal variables must be set up. */ +#define SIZEMSG "WARNING: FILE_SIZE != sizeof(FILE)\n" void __sinit() { int i; + if (FILE_SIZE != sizeof(FILE)) + write(2, SIZEMSG, sizeof(SIZEMSG) - 1); THREAD_LOCK(); if (__sdidinit == 0) { /* Set _extra for the usual suspects. */ |