mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
* elf/Makefile (LDFLAGS-dl.so): New variable.
(libdl.so): Depend on eval.so. (distribute): Add eval.c. * elf/eval.c: New file.
This commit is contained in:
parent
8a594e3cb7
commit
175b633d81
@ -1,5 +1,10 @@
|
|||||||
Wed Jul 3 11:26:28 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
|
Wed Jul 3 11:26:28 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
* elf/Makefile (LDFLAGS-dl.so): New variable.
|
||||||
|
(libdl.so): Depend on eval.so.
|
||||||
|
(distribute): Add eval.c.
|
||||||
|
* elf/eval.c: New file.
|
||||||
|
|
||||||
* time/strftime.c (strftime: do_number): Adjust P and I after sprintf
|
* time/strftime.c (strftime: do_number): Adjust P and I after sprintf
|
||||||
in case it wrote fewer than MAXDIGITS chars.
|
in case it wrote fewer than MAXDIGITS chars.
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ elide-routines.so = $(dl-routines) dl-support
|
|||||||
# interpreter and operating independent of libc.
|
# interpreter and operating independent of libc.
|
||||||
rtld-routines := rtld $(dl-routines) dl-sysdep dl-minimal
|
rtld-routines := rtld $(dl-routines) dl-sysdep dl-minimal
|
||||||
distribute = $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \
|
distribute = $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \
|
||||||
soinit.c sofini.c ldd.sh.in
|
soinit.c sofini.c ldd.sh.in eval.c
|
||||||
|
|
||||||
extra-libs = libdl
|
extra-libs = libdl
|
||||||
libdl-routines := dlopen dlclose dlsym dlerror dladdr
|
libdl-routines := dlopen dlclose dlsym dlerror dladdr
|
||||||
@ -108,4 +108,5 @@ $(objpfx)ldd: ldd.sh.in Makefile
|
|||||||
|
|
||||||
# muwahaha
|
# muwahaha
|
||||||
|
|
||||||
|
LDFLAGS-dl.so = -Wl,-dynamic-linker,$(slibdir)/$(rtld-installed-name)
|
||||||
$(objpfx)libdl.so: $(objpfx)eval.so
|
$(objpfx)libdl.so: $(objpfx)eval.so
|
||||||
|
110
elf/eval.c
Normal file
110
elf/eval.c
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
|
||||||
|
static void *funcall (char **stringp);
|
||||||
|
static void *eval (char **stringp);
|
||||||
|
|
||||||
|
static void *
|
||||||
|
funcall (char **stringp)
|
||||||
|
{
|
||||||
|
void *args[strlen (*stringp)], **ap = args;
|
||||||
|
void *argcookie = &args[1];
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* Evaluate the next token. */
|
||||||
|
*ap++ = eval (stringp);
|
||||||
|
|
||||||
|
/* Whitespace is irrelevant. */
|
||||||
|
while (isspace (**stringp))
|
||||||
|
++*stringp;
|
||||||
|
|
||||||
|
/* Terminate at closing paren or end of line. */
|
||||||
|
} while (**stringp != '\0' && **stringp != ')');
|
||||||
|
if (**stringp != '\0')
|
||||||
|
/* Swallow closing paren. */
|
||||||
|
++*stringp;
|
||||||
|
|
||||||
|
/* Do it to it. */
|
||||||
|
__builtin_return (__builtin_apply (args[0],
|
||||||
|
&argcookie,
|
||||||
|
(char *) ap - (char *) &args[1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *
|
||||||
|
eval (char **stringp)
|
||||||
|
{
|
||||||
|
void *value;
|
||||||
|
char *p = *stringp, c;
|
||||||
|
|
||||||
|
/* Whitespace is irrelevant. */
|
||||||
|
while (isspace (*p))
|
||||||
|
++p;
|
||||||
|
|
||||||
|
switch (*p)
|
||||||
|
{
|
||||||
|
case '"':
|
||||||
|
/* String constant. */
|
||||||
|
value = ++p;
|
||||||
|
do
|
||||||
|
if (*p == '\\')
|
||||||
|
{
|
||||||
|
switch (*strcpy (p, p + 1))
|
||||||
|
{
|
||||||
|
case 't':
|
||||||
|
*p = '\t';
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
*p = '\n';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
while (*p != '\0' && *p++ != '"');
|
||||||
|
if (p[-1] == '"')
|
||||||
|
p[-1] = '\0';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '(':
|
||||||
|
*stringp = ++p;
|
||||||
|
return funcall (stringp);
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Try to parse it as a number. */
|
||||||
|
value = (void *) strtol (p, stringp, 0);
|
||||||
|
if (*stringp != p)
|
||||||
|
return value;
|
||||||
|
|
||||||
|
/* Anything else is a symbol that produces its address. */
|
||||||
|
value = p;
|
||||||
|
do
|
||||||
|
++p;
|
||||||
|
while (*p != '\0' && !isspace (*p) && !ispunct (*p));
|
||||||
|
c = *p;
|
||||||
|
*p = '\0';
|
||||||
|
value = dlsym (NULL, value);
|
||||||
|
*p = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
*stringp = p;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
_start (void)
|
||||||
|
{
|
||||||
|
char *buf = NULL;
|
||||||
|
size_t bufsz = 0;
|
||||||
|
|
||||||
|
while (getline (&buf, &bufsz, stdin) > 0)
|
||||||
|
{
|
||||||
|
char *p = buf;
|
||||||
|
eval (&p);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit (0);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user