diff options
-rw-r--r-- | ChangeLog | 28 | ||||
-rw-r--r-- | elf/dl-lookup.c | 56 | ||||
-rw-r--r-- | elf/dl-reloc.c | 7 | ||||
-rw-r--r-- | elf/ldconfig.c | 4 | ||||
-rw-r--r-- | elf/rtld.c | 3 | ||||
-rw-r--r-- | malloc/obstack.c | 138 | ||||
-rw-r--r-- | stdlib/tst-random.c | 2 | ||||
-rw-r--r-- | sysdeps/generic/inttypes.h | 40 | ||||
-rw-r--r-- | sysdeps/generic/ldsodefs.h | 15 |
9 files changed, 202 insertions, 91 deletions
@@ -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> + + * 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. 2001-08-23 Roland McGrath <roland@frob.com> diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index fe833ba..48850e6 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -60,6 +60,7 @@ struct sym_val /* Statistics function. */ 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 @@ -184,6 +185,9 @@ _dl_do_lookup_versioned (const char *undef_name, unsigned long int hash, const struct r_found_version *const version, 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 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 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; /* 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; } + /* 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 (*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 : (_dl_argv[0] ?: "<main program>")), make_string (undefined_msg, undef_name)); + _dl_lookup_cache.ret = NULL; + _dl_lookup_cache.value = 0; *ref = NULL; return 0; } @@ -254,6 +276,8 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map, 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; 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) { + _dl_lookup_cache.ret = current_value.s; + _dl_lookup_cache.value = LOOKUP_VALUE (current_value.m); *ref = current_value.s; return LOOKUP_VALUE (current_value.m); } + _dl_lookup_cache.ret = *ref; + _dl_lookup_cache.value = 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 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; /* 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 (*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>")), make_string (undefined_msg, undef_name, ", version ", version->name ?: NULL)); + _dl_lookup_cache_versioned.ret = NULL; + _dl_lookup_cache_versioned.value = 0; *ref = NULL; return 0; } @@ -457,6 +505,8 @@ _dl_lookup_versioned_symbol (const char *undef_name, 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; 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) { + _dl_lookup_cache_versioned.ret = current_value.s; + _dl_lookup_cache_versioned.value = LOOKUP_VALUE (current_value.m); *ref = current_value.s; 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); } } @@ -605,7 +659,7 @@ _dl_do_lookup (const char *undef_name, unsigned long int hash, struct link_map *skip, int noexec, int noplt) { return do_lookup (undef_name, hash, ref, result, scope, i, skip, noexec, - noplt); + noplt); } static int diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c index dbbc19c..b46d3bc 100644 --- a/elf/dl-reloc.c +++ b/elf/dl-reloc.c @@ -89,8 +89,15 @@ cannot make segment writable for relocation")); : l->l_addr) #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); + _dl_lookup_cache.map = NULL; + _dl_lookup_cache_versioned.map = NULL; + if (__builtin_expect (consider_profiling, 0)) { /* Allocate the array which will contain the already found diff --git a/elf/ldconfig.c b/elf/ldconfig.c index a087da8..ba05c67 100644 --- a/elf/ldconfig.c +++ b/elf/ldconfig.c @@ -699,6 +699,10 @@ search_dir (const struct dir_entry *entry) { if (opt_verbose) error (0, errno, _("Cannot stat %s"), file_name); + + /* Remove stale symlinks. */ + if (strstr (direntry->d_name, ".so.")) + unlink (real_file_name); continue; } is_dir = S_ISDIR (stat_buf.st_mode); @@ -127,6 +127,7 @@ static hp_timing_t relocate_time; static hp_timing_t load_time; #endif 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, hp_timing_t start_time); @@ -1524,6 +1525,8 @@ print_statistics (void) #endif _dl_debug_printf (" number of relocations: %lu\n", _dl_num_relocations); + _dl_debug_printf (" number of relocations from cache: %lu\n", + _dl_num_cache_relocations); #ifndef HP_TIMING_NONAVAIL /* Time spend while loading the object and the dependencies. */ diff --git a/malloc/obstack.c b/malloc/obstack.c index 8a02a0b..7b1206c 100644 --- a/malloc/obstack.c +++ b/malloc/obstack.c @@ -19,7 +19,7 @@ 02111-1307 USA. */ #ifdef HAVE_CONFIG_H -#include <config.h> +# include <config.h> #endif #include "obstack.h" @@ -39,11 +39,11 @@ files, it is simpler to just do this in the source for each such file. */ #include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */ -#if !defined (_LIBC) && defined (__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1 -#include <gnu-versions.h> -#if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION -#define ELIDE_CODE -#endif +#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 +# include <gnu-versions.h> +# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION +# define ELIDE_CODE +# endif #endif #if defined _LIBC && defined USE_IN_LIBIO @@ -53,29 +53,29 @@ #ifndef ELIDE_CODE -#if defined (__STDC__) && __STDC__ -#define POINTER void * -#else -#define POINTER char * -#endif +# if defined __STDC__ && __STDC__ +# define POINTER void * +# else +# define POINTER char * +# endif /* Determine default alignment. */ struct fooalign {char x; double d;}; -#define DEFAULT_ALIGNMENT \ +# define DEFAULT_ALIGNMENT \ ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0)) /* 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 DEFAULT_ROUNDING. So we prepare for it to do that. */ 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. On some machines, copying successive ints does not work; in such a case, redefine COPYING_UNIT to `long' (if that works) or `char' as a last resort. */ -#ifndef COPYING_UNIT -#define COPYING_UNIT int -#endif +# ifndef COPYING_UNIT +# define COPYING_UNIT int +# endif /* 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 variable by default points to the internal function `print_and_abort'. */ -#if defined (__STDC__) && __STDC__ +# if defined __STDC__ && __STDC__ static void print_and_abort (void); void (*obstack_alloc_failed_handler) (void) = print_and_abort; -#else +# else static void print_and_abort (); void (*obstack_alloc_failed_handler) () = print_and_abort; -#endif +# endif /* Exit value used when `print_and_abort' is used. */ -#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifndef EXIT_FAILURE -#define EXIT_FAILURE 1 -#endif +# if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H +# include <stdlib.h> +# endif +# ifndef EXIT_FAILURE +# define EXIT_FAILURE 1 +# endif int obstack_exit_failure = EXIT_FAILURE; /* 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, do not allow (expr) ? void : void. */ -#if defined (__STDC__) && __STDC__ -#define CALL_CHUNKFUN(h, size) \ +# if defined __STDC__ && __STDC__ +# define CALL_CHUNKFUN(h, size) \ (((h) -> use_extra_arg) \ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size))) -#define CALL_FREEFUN(h, old_chunk) \ +# define CALL_FREEFUN(h, old_chunk) \ do { \ if ((h) -> use_extra_arg) \ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ else \ (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \ } while (0) -#else -#define CALL_CHUNKFUN(h, size) \ +# else +# define CALL_CHUNKFUN(h, size) \ (((h) -> use_extra_arg) \ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ : (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size))) -#define CALL_FREEFUN(h, old_chunk) \ +# define CALL_FREEFUN(h, old_chunk) \ do { \ if ((h) -> use_extra_arg) \ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ else \ (*(void (*) ()) (h)->freefun) ((old_chunk)); \ } while (0) -#endif +# endif /* 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; int size; int alignment; -#if defined (__STDC__) && __STDC__ +# if defined __STDC__ && __STDC__ POINTER (*chunkfun) (long); void (*freefun) (void *); -#else +# else POINTER (*chunkfun) (); void (*freefun) (); -#endif +# endif { register struct _obstack_chunk *chunk; /* points to new chunk */ @@ -183,13 +183,13 @@ _obstack_begin (h, size, alignment, chunkfun, freefun) size = 4096 - extra; } -#if defined (__STDC__) && __STDC__ +# if defined __STDC__ && __STDC__ h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun; h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; -#else +# else h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun; h->freefun = freefun; -#endif +# endif h->chunk_size = size; h->alignment_mask = alignment - 1; h->use_extra_arg = 0; @@ -212,13 +212,13 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg) struct obstack *h; int size; int alignment; -#if defined (__STDC__) && __STDC__ +# if defined __STDC__ && __STDC__ POINTER (*chunkfun) (POINTER, long); void (*freefun) (POINTER, POINTER); -#else +# else POINTER (*chunkfun) (); void (*freefun) (); -#endif +# endif POINTER arg; { 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; } -#if defined(__STDC__) && __STDC__ +# if defined __STDC__ && __STDC__ h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun; h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; -#else +# else h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun; h->freefun = freefun; -#endif +# endif h->chunk_size = size; h->alignment_mask = alignment - 1; h->extra_arg = arg; @@ -343,11 +343,11 @@ _obstack_newchunk (h, length) This is here for debugging. 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 obstack.h because it is just for debugging. */ int _obstack_allocated_p (struct obstack *h, POINTER obj); -#endif +# endif int _obstack_allocated_p (h, obj) @@ -372,7 +372,7 @@ _obstack_allocated_p (h, obj) /* Free objects in obstack H, including OBJ and everything allocate 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 is the first one, called from non-ANSI code. */ @@ -458,27 +458,27 @@ _obstack_memory_used (h) } /* Define the error handler. */ -#ifndef _ -# if defined HAVE_LIBINTL_H || defined _LIBC -# include <libintl.h> -# ifndef _ -# define _(Str) gettext (Str) +# ifndef _ +# if defined HAVE_LIBINTL_H || defined _LIBC +# include <libintl.h> +# ifndef _ +# define _(Str) gettext (Str) +# endif +# else +# define _(Str) (Str) # endif -# else -# define _(Str) (Str) # endif -#endif -#if defined _LIBC && defined USE_IN_LIBIO -# include <libio/iolibio.h> -# define fputs(s, f) _IO_fputs (s, f) -#endif +# if defined _LIBC && defined USE_IN_LIBIO +# include <libio/iolibio.h> +# define fputs(s, f) _IO_fputs (s, f) +# endif -#ifndef __attribute__ +# ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ -# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) -# define __attribute__(Spec) /* empty */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) +# define __attribute__(Spec) /* empty */ +# endif # endif -#endif static void __attribute__ ((noreturn)) @@ -489,23 +489,23 @@ print_and_abort () happen because the "memory exhausted" message appears in other places like this and the translation should be reused instead of creating 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) __fwprintf (stderr, L"%s\n", _("memory exhausted")); else -#endif +# endif fprintf (stderr, "%s\n", _("memory exhausted")); exit (obstack_exit_failure); } -#if 0 +# if 0 /* These are now turned off because the applications do not use it and it uses bcopy via obstack_grow, which causes trouble on sysV. */ /* Now define the functional versions of the obstack macros. 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; 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); } -#endif /* __STDC__ */ +# endif /* __STDC__ */ -#endif /* 0 */ +# endif /* 0 */ #endif /* !ELIDE_CODE */ diff --git a/stdlib/tst-random.c b/stdlib/tst-random.c index 2cc8e9c..47195d6 100644 --- a/stdlib/tst-random.c +++ b/stdlib/tst-random.c @@ -101,7 +101,7 @@ main (void) { char *oldstate = (char *) setstate (state[s]); 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 ()) fail ("bad value generated in interleave test", s, i); } diff --git a/sysdeps/generic/inttypes.h b/sysdeps/generic/inttypes.h index 29830ea..0549a6a 100644 --- a/sysdeps/generic/inttypes.h +++ b/sysdeps/generic/inttypes.h @@ -28,15 +28,15 @@ #include <stdint.h> /* 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__ -typedef __WCHAR_TYPE__ __wchar_t; +typedef __WCHAR_TYPE__ __gwchar_t; # else # defined __need_wchar_t # include <stddef.h> -typedef wchar_t __wchar_t; +typedef wchar_t __gwchar_t; # endif -# define ____wchar_t_defined 1 +# define ____gwchar_t_defined 1 #endif @@ -308,13 +308,13 @@ extern uintmax_t strtoumax (__const char *__restrict __nptr, char ** __restrict __endptr, int __base) __THROW; /* Like `wcstol' but convert to `intmax_t'. */ -extern intmax_t wcstoimax (__const __wchar_t *__restrict __nptr, - __wchar_t **__restrict __endptr, int __base) +extern intmax_t wcstoimax (__const __gwchar_t *__restrict __nptr, + __gwchar_t **__restrict __endptr, int __base) __THROW; /* Like `wcstoul' but convert to `uintmax_t'. */ -extern uintmax_t wcstoumax (__const __wchar_t *__restrict __nptr, - __wchar_t ** __restrict __endptr, int __base) +extern uintmax_t wcstoumax (__const __gwchar_t *__restrict __nptr, + __gwchar_t ** __restrict __endptr, int __base) __THROW; #ifdef __USE_EXTERN_INLINES @@ -352,13 +352,13 @@ strtoumax (__const char *__restrict nptr, char **__restrict endptr, /* Like `wcstol' but convert to `intmax_t'. */ # ifndef __wcstol_internal_defined -extern long int __wcstol_internal (__const __wchar_t * __restrict __nptr, - __wchar_t **__restrict __endptr, +extern long int __wcstol_internal (__const __gwchar_t * __restrict __nptr, + __gwchar_t **__restrict __endptr, int __base, int __group) __THROW; # define __wcstol_internal_defined 1 # endif 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 { 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'. */ # ifndef __wcstoul_internal_defined -extern unsigned long int __wcstoul_internal (__const __wchar_t * +extern unsigned long int __wcstoul_internal (__const __gwchar_t * __restrict __nptr, - __wchar_t ** + __gwchar_t ** __restrict __endptr, int __base, int __group) __THROW; # define __wcstoul_internal_defined 1 # endif 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 { 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'. */ # ifndef __wcstoll_internal_defined __extension__ -extern long long int __wcstoll_internal (__const __wchar_t * +extern long long int __wcstoll_internal (__const __gwchar_t * __restrict __nptr, - __wchar_t **__restrict __endptr, + __gwchar_t **__restrict __endptr, int __base, int __group) __THROW; # define __wcstoll_internal_defined 1 # endif 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 { 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'. */ # ifndef __wcstoull_internal_defined __extension__ -extern unsigned long long int __wcstoull_internal (__const __wchar_t * +extern unsigned long long int __wcstoull_internal (__const __gwchar_t * __restrict __nptr, - __wchar_t ** + __gwchar_t ** __restrict __endptr, int __base, int __group) __THROW; # define __wcstoull_internal_defined 1 # endif 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 { return __wcstoull_internal (nptr, endptr, base, 0); diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index 6d196c7..5e093fc 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -327,6 +327,21 @@ extern void _dl_map_object_deps (struct link_map *map, /* Cache the locations of MAP's hash table. */ 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 referred to by UNDEF. *SYM is the symbol table entry containing the |