forth_preload.c revision d9b365efa57e560c120a68d37339e584d8bf04c0
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* This preload library must be applied to forth after libthread is
* folded into libc because forth/tokenize.exe is not ABI compliant; it
* uses all of the %g registers, including %g7, for its internal purposes.
* This preload library interposes on all of the external calls made
* from forth/tokenize.exe and, assuming that forth is single-threaded,
* sets %g7 properly for use inside libc and restores it to forth's
* use on return from the interposed-upon function.
*/
enum ix {
ix___filbuf = 0,
};
typedef long (*realfunc_t)(long, long, long, long, long, long);
struct intpose {
char fname[12];
} intpose[] = {
{ "__filbuf", 0 },
{ "__flsbuf", 0 },
{ "_dgettext", 0 },
{ "_exit", 0 },
{ "access", 0 },
{ "atexit", 0 },
{ "atoi", 0 },
{ "cfgetospeed", 0 },
{ "chdir", 0 },
{ "close", 0 },
{ "exit", 0 },
{ "exit_handler", 0 },
{ "fclose", 0 },
{ "fflush", 0 },
{ "fgetc", 0 },
{ "fileno", 0 },
{ "fopen", 0 },
{ "fprintf", 0 },
{ "fputc", 0 },
{ "fputs", 0 },
{ "fread", 0 },
{ "free", 0 },
{ "fseek", 0 },
{ "fstat", 0 },
{ "ftell", 0 },
{ "fwrite", 0 },
{ "getcwd", 0 },
{ "getenv", 0 },
{ "getopt", 0 },
{ "getwd", 0 },
{ "ioctl", 0 },
{ "isatty", 0 },
{ "kill", 0 },
{ "localtime", 0 },
{ "lseek", 0 },
{ "malloc", 0 },
{ "memcpy", 0 },
{ "memset", 0 },
{ "open", 0 },
{ "perror", 0 },
{ "printf", 0 },
{ "psignal", 0 },
{ "putchar", 0 },
{ "read", 0 },
{ "sbrk", 0 },
{ "signal", 0 },
{ "sigset", 0 },
{ "snprintf", 0 },
{ "sprintf", 0 },
{ "stat", 0 },
{ "strcat", 0 },
{ "strchr", 0 },
{ "strcmp", 0 },
{ "strcpy", 0 },
{ "strdup", 0 },
{ "strlen", 0 },
{ "strncmp", 0 },
{ "strncpy", 0 },
{ "strrchr", 0 },
{ "system", 0 },
{ "tcgetattr", 0 },
{ "tcsetattr", 0 },
{ "tgetent", 0 },
{ "tgetflag", 0 },
{ "tgetnum", 0 },
{ "tgetstr", 0 },
{ "tgoto", 0 },
{ "time", 0 },
{ "tputs", 0 },
{ "tzset", 0 },
{ "ungetc", 0 },
{ "unlink", 0 },
{ "write", 0 },
};
#define RTLD_NEXT (void *)-1
static long global_g7 = -1;
long get_g5(void);
void set_g5(long);
long get_g7(void);
void set_g7(long);
static long
{
long my_g5;
long my_g7;
long rv;
if (global_g7 == -1)
return (rv);
}
long \
{ \
}