diff options
author | Siddhesh Poyarekar <siddhesh@redhat.com> | 2014-09-16 22:19:22 +0530 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@redhat.com> | 2014-09-16 22:19:22 +0530 |
commit | 02657da2cf4457804ed938ee08b8316249126444 (patch) | |
tree | afe1876cc19d2ff0e29c902784280791d2591b39 /dlfcn | |
parent | 653b1080fad02725ab66e504a7bfeecf4347d7aa (diff) | |
download | glibc-02657da2cf4457804ed938ee08b8316249126444.tar.gz |
Include .interp section only for libc.so
Barring libc.so and libdl.so, none of the libraries have any entry
points, so it is pointless to add a .interp section for them. The
libdl.so entry point (in dlfcn/eval.c) is also defunct, so remove that
file as well.
Build tested for x86_64, ppc64 and s390x. I have not moved
CFLAGS-interp.c to CPPFLAGS-interp.c isnce I'll be removing it
completely in a follow-up patch.
Siddhesh
* Makerules (lib%.so): Don't include $(+interp) in
prerequisites.
* elf/Makefile (CFLAGS-interp.c): Don't define NOT_IN_libc.
* dlfcn/eval.c: Remove file.
Diffstat (limited to 'dlfcn')
-rw-r--r-- | dlfcn/eval.c | 200 |
1 files changed, 0 insertions, 200 deletions
diff --git a/dlfcn/eval.c b/dlfcn/eval.c deleted file mode 100644 index 9cc307a0c6..0000000000 --- a/dlfcn/eval.c +++ /dev/null @@ -1,200 +0,0 @@ -/* You don't really want to know what this hack is for. - Copyright (C) 1996-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <ctype.h> -#include <dlfcn.h> -#include <errno.h> -#include <limits.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -static void *funcall (char **stringp) __attribute_noinline__; -static void *eval (char **stringp); - - -long int weak_function -__strtol_internal (const char *nptr, char **endptr, int base, int group) -{ - unsigned long int result = 0; - long int sign = 1; - - while (*nptr == ' ' || *nptr == '\t') - ++nptr; - - if (*nptr == '-') - { - sign = -1; - ++nptr; - } - else if (*nptr == '+') - ++nptr; - - if (*nptr < '0' || *nptr > '9') - { - if (endptr != NULL) - *endptr = (char *) nptr; - return 0L; - } - - assert (base == 0); - base = 10; - if (*nptr == '0') - { - if (nptr[1] == 'x' || nptr[1] == 'X') - { - base = 16; - nptr += 2; - } - else - base = 8; - } - - while (*nptr >= '0' && *nptr <= '9') - { - unsigned long int digval = *nptr - '0'; - if (result > LONG_MAX / 10 - || (sign > 0 ? result == LONG_MAX / 10 && digval > LONG_MAX % 10 - : (result == ((unsigned long int) LONG_MAX + 1) / 10 - && digval > ((unsigned long int) LONG_MAX + 1) % 10))) - { - errno = ERANGE; - return sign > 0 ? LONG_MAX : LONG_MIN; - } - result *= base; - result += digval; - ++nptr; - } - - return (long int) result * sign; -} - - -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; - - if (args[0] == NULL) - { - static const char unknown[] = "Unknown function\n"; - write (1, unknown, sizeof unknown - 1); - return NULL; - } - - /* 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_internal (p, stringp, 0, 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) || *p == '_')); - c = *p; - *p = '\0'; - value = dlsym (NULL, value); - *p = c; - break; - } - - *stringp = p; - return value; -} - - -extern void _start (void) __attribute__ ((noreturn)); -void -__attribute__ ((noreturn)) -_start (void) -{ - char *buf = NULL; - size_t bufsz = 0; - - while (__getdelim (&buf, &bufsz, '\n', stdin) > 0) - { - char *p = buf; - eval (&p); - } - - exit (0); -} |