1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
2001-08-23  Jakub Jelinek  <jakub@redhat.com>

	* elf/ldconfig.c (search_dir): Remove stale symlinks.

2001-08-23  Jakub Jelinek  <jakub@redhat.com>

	* elf/dl-lookup.c (lookup_cache, lookup_cache_versioned): New.
	(_dl_lookup_symbol): Lookup relocations in cache and store successfull
	lookups in cache.
	(_dl_lookup_versioned_symbol): Likewise.
	* elf/dl-reloc.c (_dl_relocate_object): Initialize cache for
	relocation lookup.
	* elf/rtld.c (print_statistics): Output _dl_num_cache_relocations.
	* sysdeps/generic/ldsodefs.h (struct lookup_cache): New definition.
	(lookup_cache, lookup_cache_versioned): Add declarations.

2001-08-23  Ulrich Drepper  <drepper@redhat.com>

	* stdlib/tst-random.c (main): Swap parameters in fail call.
	Patch by Pete Bevin <pete@petebevin.com>.

2001-08-23  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/generic/inttypes.h: Use __gwchar_t instead of __wchar_t.

	* malloc/obstack.c: Indent preprocessor directives.
	Patch by Jim Meyering <meyering@ascend.com>.
This commit is contained in:
Ulrich Drepper
2001-08-23 23:36:47 +00:00
parent e515fbc5fd
commit 647eb037f3
9 changed files with 202 additions and 91 deletions

View File

@ -1,5 +1,33 @@
2001-08-23 Jakub Jelinek <jakub@redhat.com>
* elf/ldconfig.c (search_dir): Remove stale symlinks.
2001-08-23 Jakub Jelinek <jakub@redhat.com>
* elf/dl-lookup.c (lookup_cache, lookup_cache_versioned): New.
(_dl_lookup_symbol): Lookup relocations in cache and store successfull
lookups in cache.
(_dl_lookup_versioned_symbol): Likewise.
* elf/dl-reloc.c (_dl_relocate_object): Initialize cache for
relocation lookup.
* elf/rtld.c (print_statistics): Output _dl_num_cache_relocations.
* sysdeps/generic/ldsodefs.h (struct lookup_cache): New definition.
(lookup_cache, lookup_cache_versioned): Add declarations.
2001-08-23 Ulrich Drepper <drepper@redhat.com> 2001-08-23 Ulrich Drepper <drepper@redhat.com>
* stdlib/tst-random.c (main): Swap parameters in fail call.
Patch by Pete Bevin <pete@petebevin.com>.
2001-08-23 Jakub Jelinek <jakub@redhat.com>
* sysdeps/generic/inttypes.h: Use __gwchar_t instead of __wchar_t.
2001-08-23 Ulrich Drepper <drepper@redhat.com>
* malloc/obstack.c: Indent preprocessor directives.
Patch by Jim Meyering <meyering@ascend.com>.
* po/ja.po: Update from translation team. * po/ja.po: Update from translation team.
2001-08-23 Roland McGrath <roland@frob.com> 2001-08-23 Roland McGrath <roland@frob.com>

View File

@ -60,6 +60,7 @@ struct sym_val
/* Statistics function. */ /* Statistics function. */
unsigned long int _dl_num_relocations; unsigned long int _dl_num_relocations;
unsigned long int _dl_num_cache_relocations;
/* We have two different situations when looking up a simple: with or /* We have two different situations when looking up a simple: with or
@ -184,6 +185,9 @@ _dl_do_lookup_versioned (const char *undef_name, unsigned long int hash,
const struct r_found_version *const version, const struct r_found_version *const version,
struct link_map *skip, int noexec, int noplt); struct link_map *skip, int noexec, int noplt);
struct lookup_cache _dl_lookup_cache;
struct lookup_cache _dl_lookup_cache_versioned;
/* Search loaded objects' symbol tables for a definition of the symbol /* Search loaded objects' symbol tables for a definition of the symbol
UNDEF_NAME. */ UNDEF_NAME. */
@ -201,6 +205,17 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,
int noexec = elf_machine_lookup_noexec_p (reloc_type); int noexec = elf_machine_lookup_noexec_p (reloc_type);
int noplt = elf_machine_lookup_noplt_p (reloc_type); int noplt = elf_machine_lookup_noplt_p (reloc_type);
/* First check if we can find it in the cache. */
if (__builtin_expect (*ref == _dl_lookup_cache.sym, 0)
&& _dl_lookup_cache.map == undef_map
&& _dl_lookup_cache.noexec == noexec
&& _dl_lookup_cache.noplt == noplt)
{
++_dl_num_cache_relocations;
*ref = _dl_lookup_cache.ret;
return _dl_lookup_cache.value;
}
++_dl_num_relocations; ++_dl_num_relocations;
/* Search the relevant loaded objects for a definition. */ /* Search the relevant loaded objects for a definition. */
@ -229,6 +244,11 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,
break; break;
} }
/* Update common information in the cache. */
_dl_lookup_cache.sym = *ref;
_dl_lookup_cache.noexec = noexec;
_dl_lookup_cache.noplt = noplt;
if (__builtin_expect (current_value.s == NULL, 0)) if (__builtin_expect (current_value.s == NULL, 0))
{ {
if (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK) if (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK)
@ -238,6 +258,8 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,
? reference_name ? reference_name
: (_dl_argv[0] ?: "<main program>")), : (_dl_argv[0] ?: "<main program>")),
make_string (undefined_msg, undef_name)); make_string (undefined_msg, undef_name));
_dl_lookup_cache.ret = NULL;
_dl_lookup_cache.value = 0;
*ref = NULL; *ref = NULL;
return 0; return 0;
} }
@ -254,6 +276,8 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,
if (__builtin_expect (protected == 0, 1)) if (__builtin_expect (protected == 0, 1))
{ {
_dl_lookup_cache.ret = current_value.s;
_dl_lookup_cache.value = LOOKUP_VALUE (current_value.m);
*ref = current_value.s; *ref = current_value.s;
return LOOKUP_VALUE (current_value.m); return LOOKUP_VALUE (current_value.m);
} }
@ -270,9 +294,13 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,
if (protected_value.s == NULL || protected_value.m == undef_map) if (protected_value.s == NULL || protected_value.m == undef_map)
{ {
_dl_lookup_cache.ret = current_value.s;
_dl_lookup_cache.value = LOOKUP_VALUE (current_value.m);
*ref = current_value.s; *ref = current_value.s;
return LOOKUP_VALUE (current_value.m); return LOOKUP_VALUE (current_value.m);
} }
_dl_lookup_cache.ret = *ref;
_dl_lookup_cache.value = LOOKUP_VALUE (undef_map);
return LOOKUP_VALUE (undef_map); return LOOKUP_VALUE (undef_map);
} }
@ -379,6 +407,18 @@ _dl_lookup_versioned_symbol (const char *undef_name,
int noexec = elf_machine_lookup_noexec_p (reloc_type); int noexec = elf_machine_lookup_noexec_p (reloc_type);
int noplt = elf_machine_lookup_noplt_p (reloc_type); int noplt = elf_machine_lookup_noplt_p (reloc_type);
/* First check if we can find it in the cache. */
if (__builtin_expect (*ref == _dl_lookup_cache_versioned.sym, 0)
&& _dl_lookup_cache_versioned.map == undef_map
&& _dl_lookup_cache_versioned.noexec == noexec
&& _dl_lookup_cache_versioned.noplt == noplt
&& _dl_lookup_cache_versioned.version == version)
{
++_dl_num_cache_relocations;
*ref = _dl_lookup_cache_versioned.ret;
return _dl_lookup_cache_versioned.value;
}
++_dl_num_relocations; ++_dl_num_relocations;
/* Search the relevant loaded objects for a definition. */ /* Search the relevant loaded objects for a definition. */
@ -430,6 +470,12 @@ _dl_lookup_versioned_symbol (const char *undef_name,
} }
} }
/* Update common information in the cache. */
_dl_lookup_cache_versioned.sym = *ref;
_dl_lookup_cache_versioned.noexec = noexec;
_dl_lookup_cache_versioned.noplt = noplt;
_dl_lookup_cache_versioned.version = version;
if (__builtin_expect (current_value.s == NULL, 0)) if (__builtin_expect (current_value.s == NULL, 0))
{ {
if (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK) if (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK)
@ -440,6 +486,8 @@ _dl_lookup_versioned_symbol (const char *undef_name,
: (_dl_argv[0] ?: "<main program>")), : (_dl_argv[0] ?: "<main program>")),
make_string (undefined_msg, undef_name, make_string (undefined_msg, undef_name,
", version ", version->name ?: NULL)); ", version ", version->name ?: NULL));
_dl_lookup_cache_versioned.ret = NULL;
_dl_lookup_cache_versioned.value = 0;
*ref = NULL; *ref = NULL;
return 0; return 0;
} }
@ -457,6 +505,8 @@ _dl_lookup_versioned_symbol (const char *undef_name,
if (__builtin_expect (protected == 0, 1)) if (__builtin_expect (protected == 0, 1))
{ {
_dl_lookup_cache_versioned.ret = current_value.s;
_dl_lookup_cache_versioned.value = LOOKUP_VALUE (current_value.m);
*ref = current_value.s; *ref = current_value.s;
return LOOKUP_VALUE (current_value.m); return LOOKUP_VALUE (current_value.m);
} }
@ -473,10 +523,14 @@ _dl_lookup_versioned_symbol (const char *undef_name,
if (protected_value.s == NULL || protected_value.m == undef_map) if (protected_value.s == NULL || protected_value.m == undef_map)
{ {
_dl_lookup_cache_versioned.ret = current_value.s;
_dl_lookup_cache_versioned.value = LOOKUP_VALUE (current_value.m);
*ref = current_value.s; *ref = current_value.s;
return LOOKUP_VALUE (current_value.m); return LOOKUP_VALUE (current_value.m);
} }
_dl_lookup_cache_versioned.ret = *ref;
_dl_lookup_cache_versioned.value = LOOKUP_VALUE (undef_map);
return LOOKUP_VALUE (undef_map); return LOOKUP_VALUE (undef_map);
} }
} }
@ -605,7 +659,7 @@ _dl_do_lookup (const char *undef_name, unsigned long int hash,
struct link_map *skip, int noexec, int noplt) struct link_map *skip, int noexec, int noplt)
{ {
return do_lookup (undef_name, hash, ref, result, scope, i, skip, noexec, return do_lookup (undef_name, hash, ref, result, scope, i, skip, noexec,
noplt); noplt);
} }
static int static int

View File

@ -89,8 +89,15 @@ cannot make segment writable for relocation"));
: l->l_addr) : l->l_addr)
#include "dynamic-link.h" #include "dynamic-link.h"
/* Start symbol lookup caching for this object. */
_dl_lookup_cache.map = l;
_dl_lookup_cache_versioned.map = l;
ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling); ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling);
_dl_lookup_cache.map = NULL;
_dl_lookup_cache_versioned.map = NULL;
if (__builtin_expect (consider_profiling, 0)) if (__builtin_expect (consider_profiling, 0))
{ {
/* Allocate the array which will contain the already found /* Allocate the array which will contain the already found

View File

@ -699,6 +699,10 @@ search_dir (const struct dir_entry *entry)
{ {
if (opt_verbose) if (opt_verbose)
error (0, errno, _("Cannot stat %s"), file_name); error (0, errno, _("Cannot stat %s"), file_name);
/* Remove stale symlinks. */
if (strstr (direntry->d_name, ".so."))
unlink (real_file_name);
continue; continue;
} }
is_dir = S_ISDIR (stat_buf.st_mode); is_dir = S_ISDIR (stat_buf.st_mode);

View File

@ -127,6 +127,7 @@ static hp_timing_t relocate_time;
static hp_timing_t load_time; static hp_timing_t load_time;
#endif #endif
extern unsigned long int _dl_num_relocations; /* in dl-lookup.c */ extern unsigned long int _dl_num_relocations; /* in dl-lookup.c */
extern unsigned long int _dl_num_cache_relocations; /* in dl-lookup.c */
static ElfW(Addr) _dl_start_final (void *arg, struct link_map *bootstrap_map_p, static ElfW(Addr) _dl_start_final (void *arg, struct link_map *bootstrap_map_p,
hp_timing_t start_time); hp_timing_t start_time);
@ -1524,6 +1525,8 @@ print_statistics (void)
#endif #endif
_dl_debug_printf (" number of relocations: %lu\n", _dl_debug_printf (" number of relocations: %lu\n",
_dl_num_relocations); _dl_num_relocations);
_dl_debug_printf (" number of relocations from cache: %lu\n",
_dl_num_cache_relocations);
#ifndef HP_TIMING_NONAVAIL #ifndef HP_TIMING_NONAVAIL
/* Time spend while loading the object and the dependencies. */ /* Time spend while loading the object and the dependencies. */

View File

@ -19,7 +19,7 @@
02111-1307 USA. */ 02111-1307 USA. */
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include <config.h> # include <config.h>
#endif #endif
#include "obstack.h" #include "obstack.h"
@ -39,11 +39,11 @@
files, it is simpler to just do this in the source for each such file. */ files, it is simpler to just do this in the source for each such file. */
#include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */ #include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */
#if !defined (_LIBC) && defined (__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1 #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
#include <gnu-versions.h> # include <gnu-versions.h>
#if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION # if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
#define ELIDE_CODE # define ELIDE_CODE
#endif # endif
#endif #endif
#if defined _LIBC && defined USE_IN_LIBIO #if defined _LIBC && defined USE_IN_LIBIO
@ -53,29 +53,29 @@
#ifndef ELIDE_CODE #ifndef ELIDE_CODE
#if defined (__STDC__) && __STDC__ # if defined __STDC__ && __STDC__
#define POINTER void * # define POINTER void *
#else # else
#define POINTER char * # define POINTER char *
#endif # endif
/* Determine default alignment. */ /* Determine default alignment. */
struct fooalign {char x; double d;}; struct fooalign {char x; double d;};
#define DEFAULT_ALIGNMENT \ # define DEFAULT_ALIGNMENT \
((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0)) ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT. /* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
But in fact it might be less smart and round addresses to as much as But in fact it might be less smart and round addresses to as much as
DEFAULT_ROUNDING. So we prepare for it to do that. */ DEFAULT_ROUNDING. So we prepare for it to do that. */
union fooround {long x; double d;}; union fooround {long x; double d;};
#define DEFAULT_ROUNDING (sizeof (union fooround)) # define DEFAULT_ROUNDING (sizeof (union fooround))
/* When we copy a long block of data, this is the unit to do it with. /* When we copy a long block of data, this is the unit to do it with.
On some machines, copying successive ints does not work; On some machines, copying successive ints does not work;
in such a case, redefine COPYING_UNIT to `long' (if that works) in such a case, redefine COPYING_UNIT to `long' (if that works)
or `char' as a last resort. */ or `char' as a last resort. */
#ifndef COPYING_UNIT # ifndef COPYING_UNIT
#define COPYING_UNIT int # define COPYING_UNIT int
#endif # endif
/* The functions allocating more room by calling `obstack_chunk_alloc' /* The functions allocating more room by calling `obstack_chunk_alloc'
@ -84,21 +84,21 @@ union fooround {long x; double d;};
abort gracefully or use longjump - but shouldn't return. This abort gracefully or use longjump - but shouldn't return. This
variable by default points to the internal function variable by default points to the internal function
`print_and_abort'. */ `print_and_abort'. */
#if defined (__STDC__) && __STDC__ # if defined __STDC__ && __STDC__
static void print_and_abort (void); static void print_and_abort (void);
void (*obstack_alloc_failed_handler) (void) = print_and_abort; void (*obstack_alloc_failed_handler) (void) = print_and_abort;
#else # else
static void print_and_abort (); static void print_and_abort ();
void (*obstack_alloc_failed_handler) () = print_and_abort; void (*obstack_alloc_failed_handler) () = print_and_abort;
#endif # endif
/* Exit value used when `print_and_abort' is used. */ /* Exit value used when `print_and_abort' is used. */
#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H # if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H
#include <stdlib.h> # include <stdlib.h>
#endif # endif
#ifndef EXIT_FAILURE # ifndef EXIT_FAILURE
#define EXIT_FAILURE 1 # define EXIT_FAILURE 1
#endif # endif
int obstack_exit_failure = EXIT_FAILURE; int obstack_exit_failure = EXIT_FAILURE;
/* The non-GNU-C macros copy the obstack into this global variable /* The non-GNU-C macros copy the obstack into this global variable
@ -112,33 +112,33 @@ struct obstack *_obstack;
For free, do not use ?:, since some compilers, like the MIPS compilers, For free, do not use ?:, since some compilers, like the MIPS compilers,
do not allow (expr) ? void : void. */ do not allow (expr) ? void : void. */
#if defined (__STDC__) && __STDC__ # if defined __STDC__ && __STDC__
#define CALL_CHUNKFUN(h, size) \ # define CALL_CHUNKFUN(h, size) \
(((h) -> use_extra_arg) \ (((h) -> use_extra_arg) \
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
: (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size))) : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
#define CALL_FREEFUN(h, old_chunk) \ # define CALL_FREEFUN(h, old_chunk) \
do { \ do { \
if ((h) -> use_extra_arg) \ if ((h) -> use_extra_arg) \
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
else \ else \
(*(void (*) (void *)) (h)->freefun) ((old_chunk)); \ (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
} while (0) } while (0)
#else # else
#define CALL_CHUNKFUN(h, size) \ # define CALL_CHUNKFUN(h, size) \
(((h) -> use_extra_arg) \ (((h) -> use_extra_arg) \
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
: (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size))) : (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size)))
#define CALL_FREEFUN(h, old_chunk) \ # define CALL_FREEFUN(h, old_chunk) \
do { \ do { \
if ((h) -> use_extra_arg) \ if ((h) -> use_extra_arg) \
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
else \ else \
(*(void (*) ()) (h)->freefun) ((old_chunk)); \ (*(void (*) ()) (h)->freefun) ((old_chunk)); \
} while (0) } while (0)
#endif # endif
/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default). /* Initialize an obstack H for use. Specify chunk size SIZE (0 means default).
@ -154,13 +154,13 @@ _obstack_begin (h, size, alignment, chunkfun, freefun)
struct obstack *h; struct obstack *h;
int size; int size;
int alignment; int alignment;
#if defined (__STDC__) && __STDC__ # if defined __STDC__ && __STDC__
POINTER (*chunkfun) (long); POINTER (*chunkfun) (long);
void (*freefun) (void *); void (*freefun) (void *);
#else # else
POINTER (*chunkfun) (); POINTER (*chunkfun) ();
void (*freefun) (); void (*freefun) ();
#endif # endif
{ {
register struct _obstack_chunk *chunk; /* points to new chunk */ register struct _obstack_chunk *chunk; /* points to new chunk */
@ -183,13 +183,13 @@ _obstack_begin (h, size, alignment, chunkfun, freefun)
size = 4096 - extra; size = 4096 - extra;
} }
#if defined (__STDC__) && __STDC__ # if defined __STDC__ && __STDC__
h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun; h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
#else # else
h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun; h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
h->freefun = freefun; h->freefun = freefun;
#endif # endif
h->chunk_size = size; h->chunk_size = size;
h->alignment_mask = alignment - 1; h->alignment_mask = alignment - 1;
h->use_extra_arg = 0; h->use_extra_arg = 0;
@ -212,13 +212,13 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
struct obstack *h; struct obstack *h;
int size; int size;
int alignment; int alignment;
#if defined (__STDC__) && __STDC__ # if defined __STDC__ && __STDC__
POINTER (*chunkfun) (POINTER, long); POINTER (*chunkfun) (POINTER, long);
void (*freefun) (POINTER, POINTER); void (*freefun) (POINTER, POINTER);
#else # else
POINTER (*chunkfun) (); POINTER (*chunkfun) ();
void (*freefun) (); void (*freefun) ();
#endif # endif
POINTER arg; POINTER arg;
{ {
register struct _obstack_chunk *chunk; /* points to new chunk */ register struct _obstack_chunk *chunk; /* points to new chunk */
@ -242,13 +242,13 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
size = 4096 - extra; size = 4096 - extra;
} }
#if defined(__STDC__) && __STDC__ # if defined __STDC__ && __STDC__
h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun; h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
#else # else
h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun; h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
h->freefun = freefun; h->freefun = freefun;
#endif # endif
h->chunk_size = size; h->chunk_size = size;
h->alignment_mask = alignment - 1; h->alignment_mask = alignment - 1;
h->extra_arg = arg; h->extra_arg = arg;
@ -343,11 +343,11 @@ _obstack_newchunk (h, length)
This is here for debugging. This is here for debugging.
If you use it in a program, you are probably losing. */ If you use it in a program, you are probably losing. */
#if defined (__STDC__) && __STDC__ # if defined __STDC__ && __STDC__
/* Suppress -Wmissing-prototypes warning. We don't want to declare this in /* Suppress -Wmissing-prototypes warning. We don't want to declare this in
obstack.h because it is just for debugging. */ obstack.h because it is just for debugging. */
int _obstack_allocated_p (struct obstack *h, POINTER obj); int _obstack_allocated_p (struct obstack *h, POINTER obj);
#endif # endif
int int
_obstack_allocated_p (h, obj) _obstack_allocated_p (h, obj)
@ -372,7 +372,7 @@ _obstack_allocated_p (h, obj)
/* Free objects in obstack H, including OBJ and everything allocate /* Free objects in obstack H, including OBJ and everything allocate
more recently than OBJ. If OBJ is zero, free everything in H. */ more recently than OBJ. If OBJ is zero, free everything in H. */
#undef obstack_free # undef obstack_free
/* This function has two names with identical definitions. /* This function has two names with identical definitions.
This is the first one, called from non-ANSI code. */ This is the first one, called from non-ANSI code. */
@ -458,27 +458,27 @@ _obstack_memory_used (h)
} }
/* Define the error handler. */ /* Define the error handler. */
#ifndef _ # ifndef _
# if defined HAVE_LIBINTL_H || defined _LIBC # if defined HAVE_LIBINTL_H || defined _LIBC
# include <libintl.h> # include <libintl.h>
# ifndef _ # ifndef _
# define _(Str) gettext (Str) # define _(Str) gettext (Str)
# endif
# else
# define _(Str) (Str)
# endif # endif
# else
# define _(Str) (Str)
# endif # endif
#endif # if defined _LIBC && defined USE_IN_LIBIO
#if defined _LIBC && defined USE_IN_LIBIO # include <libio/iolibio.h>
# include <libio/iolibio.h> # define fputs(s, f) _IO_fputs (s, f)
# define fputs(s, f) _IO_fputs (s, f) # endif
#endif
#ifndef __attribute__ # ifndef __attribute__
/* This feature is available in gcc versions 2.5 and later. */ /* This feature is available in gcc versions 2.5 and later. */
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
# define __attribute__(Spec) /* empty */ # define __attribute__(Spec) /* empty */
# endif
# endif # endif
#endif
static void static void
__attribute__ ((noreturn)) __attribute__ ((noreturn))
@ -489,23 +489,23 @@ print_and_abort ()
happen because the "memory exhausted" message appears in other places happen because the "memory exhausted" message appears in other places
like this and the translation should be reused instead of creating like this and the translation should be reused instead of creating
a very similar string which requires a separate translation. */ a very similar string which requires a separate translation. */
#if defined _LIBC && defined USE_IN_LIBIO # if defined _LIBC && defined USE_IN_LIBIO
if (_IO_fwide (stderr, 0) > 0) if (_IO_fwide (stderr, 0) > 0)
__fwprintf (stderr, L"%s\n", _("memory exhausted")); __fwprintf (stderr, L"%s\n", _("memory exhausted"));
else else
#endif # endif
fprintf (stderr, "%s\n", _("memory exhausted")); fprintf (stderr, "%s\n", _("memory exhausted"));
exit (obstack_exit_failure); exit (obstack_exit_failure);
} }
#if 0 # if 0
/* These are now turned off because the applications do not use it /* These are now turned off because the applications do not use it
and it uses bcopy via obstack_grow, which causes trouble on sysV. */ and it uses bcopy via obstack_grow, which causes trouble on sysV. */
/* Now define the functional versions of the obstack macros. /* Now define the functional versions of the obstack macros.
Define them to simply use the corresponding macros to do the job. */ Define them to simply use the corresponding macros to do the job. */
#if defined __STDC__ && __STDC__ # if defined __STDC__ && __STDC__
/* These function definitions do not work with non-ANSI preprocessors; /* These function definitions do not work with non-ANSI preprocessors;
they won't pass through the macro names in parentheses. */ they won't pass through the macro names in parentheses. */
@ -616,8 +616,8 @@ POINTER (obstack_copy0) (obstack, address, length)
return obstack_copy0 (obstack, address, length); return obstack_copy0 (obstack, address, length);
} }
#endif /* __STDC__ */ # endif /* __STDC__ */
#endif /* 0 */ # endif /* 0 */
#endif /* !ELIDE_CODE */ #endif /* !ELIDE_CODE */

View File

@ -101,7 +101,7 @@ main (void)
{ {
char *oldstate = (char *) setstate (state[s]); char *oldstate = (char *) setstate (state[s]);
if (oldstate != state[(s + nseq - 1) % nseq]) if (oldstate != state[(s + nseq - 1) % nseq])
fail ("bad setstate() return value", i, s); fail ("bad setstate() return value", s, i);
if (rnd[s][i] != random ()) if (rnd[s][i] != random ())
fail ("bad value generated in interleave test", s, i); fail ("bad value generated in interleave test", s, i);
} }

View File

@ -28,15 +28,15 @@
#include <stdint.h> #include <stdint.h>
/* Get a definition for wchar_t. But we must not define wchar_t itself. */ /* Get a definition for wchar_t. But we must not define wchar_t itself. */
#ifndef ____wchar_t_defined #ifndef ____gwchar_t_defined
# ifdef __WCHAR_TYPE__ # ifdef __WCHAR_TYPE__
typedef __WCHAR_TYPE__ __wchar_t; typedef __WCHAR_TYPE__ __gwchar_t;
# else # else
# defined __need_wchar_t # defined __need_wchar_t
# include <stddef.h> # include <stddef.h>
typedef wchar_t __wchar_t; typedef wchar_t __gwchar_t;
# endif # endif
# define ____wchar_t_defined 1 # define ____gwchar_t_defined 1
#endif #endif
@ -308,13 +308,13 @@ extern uintmax_t strtoumax (__const char *__restrict __nptr,
char ** __restrict __endptr, int __base) __THROW; char ** __restrict __endptr, int __base) __THROW;
/* Like `wcstol' but convert to `intmax_t'. */ /* Like `wcstol' but convert to `intmax_t'. */
extern intmax_t wcstoimax (__const __wchar_t *__restrict __nptr, extern intmax_t wcstoimax (__const __gwchar_t *__restrict __nptr,
__wchar_t **__restrict __endptr, int __base) __gwchar_t **__restrict __endptr, int __base)
__THROW; __THROW;
/* Like `wcstoul' but convert to `uintmax_t'. */ /* Like `wcstoul' but convert to `uintmax_t'. */
extern uintmax_t wcstoumax (__const __wchar_t *__restrict __nptr, extern uintmax_t wcstoumax (__const __gwchar_t *__restrict __nptr,
__wchar_t ** __restrict __endptr, int __base) __gwchar_t ** __restrict __endptr, int __base)
__THROW; __THROW;
#ifdef __USE_EXTERN_INLINES #ifdef __USE_EXTERN_INLINES
@ -352,13 +352,13 @@ strtoumax (__const char *__restrict nptr, char **__restrict endptr,
/* Like `wcstol' but convert to `intmax_t'. */ /* Like `wcstol' but convert to `intmax_t'. */
# ifndef __wcstol_internal_defined # ifndef __wcstol_internal_defined
extern long int __wcstol_internal (__const __wchar_t * __restrict __nptr, extern long int __wcstol_internal (__const __gwchar_t * __restrict __nptr,
__wchar_t **__restrict __endptr, __gwchar_t **__restrict __endptr,
int __base, int __group) __THROW; int __base, int __group) __THROW;
# define __wcstol_internal_defined 1 # define __wcstol_internal_defined 1
# endif # endif
extern __inline intmax_t extern __inline intmax_t
wcstoimax (__const __wchar_t *__restrict nptr, __wchar_t **__restrict endptr, wcstoimax (__const __gwchar_t *__restrict nptr, __gwchar_t **__restrict endptr,
int base) __THROW int base) __THROW
{ {
return __wcstol_internal (nptr, endptr, base, 0); return __wcstol_internal (nptr, endptr, base, 0);
@ -367,15 +367,15 @@ wcstoimax (__const __wchar_t *__restrict nptr, __wchar_t **__restrict endptr,
/* Like `wcstoul' but convert to `uintmax_t'. */ /* Like `wcstoul' but convert to `uintmax_t'. */
# ifndef __wcstoul_internal_defined # ifndef __wcstoul_internal_defined
extern unsigned long int __wcstoul_internal (__const __wchar_t * extern unsigned long int __wcstoul_internal (__const __gwchar_t *
__restrict __nptr, __restrict __nptr,
__wchar_t ** __gwchar_t **
__restrict __endptr, __restrict __endptr,
int __base, int __group) __THROW; int __base, int __group) __THROW;
# define __wcstoul_internal_defined 1 # define __wcstoul_internal_defined 1
# endif # endif
extern __inline uintmax_t extern __inline uintmax_t
wcstoumax (__const __wchar_t *__restrict nptr, __wchar_t **__restrict endptr, wcstoumax (__const __gwchar_t *__restrict nptr, __gwchar_t **__restrict endptr,
int base) __THROW int base) __THROW
{ {
return __wcstoul_internal (nptr, endptr, base, 0); return __wcstoul_internal (nptr, endptr, base, 0);
@ -419,14 +419,14 @@ strtoumax (__const char *__restrict nptr, char **__restrict endptr,
/* Like `wcstol' but convert to `intmax_t'. */ /* Like `wcstol' but convert to `intmax_t'. */
# ifndef __wcstoll_internal_defined # ifndef __wcstoll_internal_defined
__extension__ __extension__
extern long long int __wcstoll_internal (__const __wchar_t * extern long long int __wcstoll_internal (__const __gwchar_t *
__restrict __nptr, __restrict __nptr,
__wchar_t **__restrict __endptr, __gwchar_t **__restrict __endptr,
int __base, int __group) __THROW; int __base, int __group) __THROW;
# define __wcstoll_internal_defined 1 # define __wcstoll_internal_defined 1
# endif # endif
extern __inline intmax_t extern __inline intmax_t
wcstoimax (__const __wchar_t *__restrict nptr, __wchar_t **__restrict endptr, wcstoimax (__const __gwchar_t *__restrict nptr, __gwchar_t **__restrict endptr,
int base) __THROW int base) __THROW
{ {
return __wcstoll_internal (nptr, endptr, base, 0); return __wcstoll_internal (nptr, endptr, base, 0);
@ -436,16 +436,16 @@ wcstoimax (__const __wchar_t *__restrict nptr, __wchar_t **__restrict endptr,
/* Like `wcstoul' but convert to `uintmax_t'. */ /* Like `wcstoul' but convert to `uintmax_t'. */
# ifndef __wcstoull_internal_defined # ifndef __wcstoull_internal_defined
__extension__ __extension__
extern unsigned long long int __wcstoull_internal (__const __wchar_t * extern unsigned long long int __wcstoull_internal (__const __gwchar_t *
__restrict __nptr, __restrict __nptr,
__wchar_t ** __gwchar_t **
__restrict __endptr, __restrict __endptr,
int __base, int __base,
int __group) __THROW; int __group) __THROW;
# define __wcstoull_internal_defined 1 # define __wcstoull_internal_defined 1
# endif # endif
extern __inline uintmax_t extern __inline uintmax_t
wcstoumax (__const __wchar_t *__restrict nptr, __wchar_t **__restrict endptr, wcstoumax (__const __gwchar_t *__restrict nptr, __gwchar_t **__restrict endptr,
int base) __THROW int base) __THROW
{ {
return __wcstoull_internal (nptr, endptr, base, 0); return __wcstoull_internal (nptr, endptr, base, 0);

View File

@ -327,6 +327,21 @@ extern void _dl_map_object_deps (struct link_map *map,
/* Cache the locations of MAP's hash table. */ /* Cache the locations of MAP's hash table. */
extern void _dl_setup_hash (struct link_map *map) internal_function; extern void _dl_setup_hash (struct link_map *map) internal_function;
/* This holds symbol lookup cache. */
struct lookup_cache
{
const ElfW(Sym) *sym;
struct link_map *map;
const struct r_found_version *version;
int noexec;
int noplt;
lookup_t value;
const ElfW(Sym) *ret;
};
extern struct lookup_cache _dl_lookup_cache;
extern struct lookup_cache _dl_lookup_cache_versioned;
/* Search loaded objects' symbol tables for a definition of the symbol /* Search loaded objects' symbol tables for a definition of the symbol
referred to by UNDEF. *SYM is the symbol table entry containing the referred to by UNDEF. *SYM is the symbol table entry containing the