Place some hooks (__stdin, __stdout, __stderr) into libc for a future
ABI change. There is some serious evilness here to work around some gcc weaknesses. We need to know the sizeof(FILE) manually until __sF goes away in the next major bump. We have the size for Alpha and i386, missing is ia64, ppc and sparc* (and i386 with 64 bit longs). At some point down the track we can change the stdin etc #defines to stop hard coding the size of FILE into application binaries. Lots of head scratching and ideas and testing by: green, imp
This commit is contained in:
parent
47585c927f
commit
3d92fc05aa
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user