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);
} }
} }

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

@ -39,7 +39,7 @@
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
@ -53,7 +53,7 @@
#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 *
@ -84,7 +84,7 @@ 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
@ -112,7 +112,7 @@ 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)) \
@ -154,7 +154,7 @@ _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
@ -183,7 +183,7 @@ _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
@ -212,7 +212,7 @@ _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
@ -242,7 +242,7 @@ _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
@ -343,7 +343,7 @@ _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);

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