about summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
authorAndreas Jaeger <aj@suse.de>2000-05-17 11:04:21 +0000
committerAndreas Jaeger <aj@suse.de>2000-05-17 11:04:21 +0000
commite25054c49c92587a07de4badfe4b7e01ceb99858 (patch)
tree1ad481eff77aa0310a5b5c664917467b450bce6c /sysdeps
parent7626e16ceb26772b82ae4ef32e8e4b027cd79ed0 (diff)
downloadglibc-e25054c49c92587a07de4badfe4b7e01ceb99858.tar.gz
glibc-e25054c49c92587a07de4badfe4b7e01ceb99858.tar.xz
glibc-e25054c49c92587a07de4badfe4b7e01ceb99858.zip
Update.
2000-05-17  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/generic/dl-cache.h (_DL_CACHE_DEFAULT_ID): Only define if
	not yet defined.
	(_dl_cache_check_flags): Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/dl-cache.h: include_next
	dl-cache.h.

2000-05-17  Andreas Jaeger  <aj@suse.de>

	* manual/creature.texi (Feature Test Macros): Remove paragraph
	since the description is wrong.
	Closes PR libc/1691, reported by Geoff Clare <gwc@unisoft.com>.

2000-05-17  Andreas Jaeger  <aj@suse.de>

	* time/test_time.args: Removed.
	* time/Makefile (test_time-ARGS): Added contents here instead.

	* posix/tstgetopt.args: Removed.
	* posix/Makefile (tstgetopt-ARGS): Added contents here instead.

	* Rules: Allow arguments for test files to be specified in
	Makefile with testname-ARGS; remove rules with .args in it.

	* dirent/Makefile (opendir-tst1-ARGS): Use this for opendir-tst1,
	remove old bogus rule for opendir-tst1.args.

	* stdlib/test-canon.c: Rewrite to use test-skeleton.c.

	* stdlib/Makefile (test-canon-ARGS): New, supply argument to chdir
	into objdir.  This allows a readonly sourcetree.
	Reported by lrgallardo@yahoo.com, closes PR libc/1421.

2000-05-16  Andreas Jaeger  <aj@suse.de>,
            David Huggins-Daines <dhd@linuxcare.com>

	* sysdeps/generic/dl-cache.c (_dl_load_cache_lookup): Set
	cache_data in case of only new cache format correctly.

	* sysdeps/generic/dl-cache.c (_dl_load_cache_lookup): Align struct
	cache_file_new.

	* sysdeps/generic/dl-cache.h (ALIGN_CACHE): New macro to align
	struct cache_file_new.

	* elf/cache.c (save_cache): Fix str_offset if only new cache is
	present.

	* elf/cache.c (save_cache): Align struct new_file_cache.
	(print_cache): Likewise.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/dl-cache.c26
-rw-r--r--sysdeps/generic/dl-cache.h20
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/dl-cache.h4
3 files changed, 34 insertions, 16 deletions
diff --git a/sysdeps/generic/dl-cache.c b/sysdeps/generic/dl-cache.c
index 28fab0b19e..85db10e06c 100644
--- a/sysdeps/generic/dl-cache.c
+++ b/sysdeps/generic/dl-cache.c
@@ -52,7 +52,7 @@ do									  \
     right = cache->nlibs - 1;						  \
     middle = (left + right) / 2;					  \
     cmpres = 1;								  \
-    									  \
+									  \
     while (left <= right)						  \
       {									  \
 	/* Make sure string table indices are not bogus before using	  \
@@ -121,7 +121,7 @@ do									  \
 		  {							  \
 		    HWCAP_CHECK;					  \
 		    best = cache_data + cache->libs[middle].value;	  \
-		    							  \
+									  \
 		    if (flags == _dl_correct_cache_id)			  \
 		      /* We've found an exact match for the shared	  \
 			 object and no general `ELF' release.  Stop	  \
@@ -166,14 +166,16 @@ _dl_load_cache_lookup (const char *name)
       if (file && cachesize > sizeof *cache &&
 	  !memcmp (file, CACHEMAGIC, sizeof CACHEMAGIC - 1))
 	{
+	  size_t offset;
 	  /* Looks ok.  */
 	  cache = file;
 
 	  /* Check for new version.  */
-	  cache_new = (struct cache_file_new *) &cache->libs[cache->nlibs];
-	  if (cachesize <
-	      (sizeof (struct cache_file) + cache->nlibs * sizeof (struct file_entry)
-	       + sizeof (struct cache_file_new))
+	  offset = ALIGN_CACHE (sizeof (struct cache_file)
+				+ cache->nlibs * sizeof (struct file_entry));
+
+	  cache_new = (struct cache_file_new *) ((void *)cache + offset);
+	  if (cachesize < (offset + sizeof (struct cache_file_new))
 	      || memcmp (cache_new->magic, CACHEMAGIC_NEW,
 			  sizeof CACHEMAGIC_NEW - 1)
 	      || memcmp (cache_new->version, CACHE_VERSION,
@@ -202,9 +204,6 @@ _dl_load_cache_lookup (const char *name)
     /* Previously looked for the cache file and didn't find it.  */
     return NULL;
 
-  /* This is where the strings start.  */
-  cache_data = (const char *) &cache->libs[cache->nlibs];
-
   best = NULL;
 
   if (cache_new != (void *) -1)
@@ -213,6 +212,9 @@ _dl_load_cache_lookup (const char *name)
       unsigned long int *hwcap;
       weak_extern (_dl_hwcap);
 
+      /* This is where the strings start.  */
+      cache_data = (const char *) cache_new;
+
       hwcap = &_dl_hwcap;
 
 #define HWCAP_CHECK							     \
@@ -221,9 +223,13 @@ _dl_load_cache_lookup (const char *name)
       SEARCH_CACHE (cache_new);
     }
   else
+    {
+      /* This is where the strings start.  */
+      cache_data = (const char *) &cache->libs[cache->nlibs];
 #undef HWCAP_CHECK
 #define HWCAP_CHECK do {} while (0)
-    SEARCH_CACHE (cache);
+      SEARCH_CACHE (cache);
+    }
 
   /* Print our result if wanted.  */
   if (_dl_debug_libs && best != NULL)
diff --git a/sysdeps/generic/dl-cache.h b/sysdeps/generic/dl-cache.h
index 4eb64cf557..197638b09d 100644
--- a/sysdeps/generic/dl-cache.h
+++ b/sysdeps/generic/dl-cache.h
@@ -17,11 +17,14 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#define _DL_CACHE_DEFAULT_ID	3
+#ifndef _DL_CACHE_DEFAULT_ID
+# define _DL_CACHE_DEFAULT_ID	3
+#endif
 
-#define _dl_cache_check_flags(flags)			\
+#ifndef _dl_cache_check_flags
+# define _dl_cache_check_flags(flags)			\
   ((flags) == 1 || (flags) == _DL_CACHE_DEFAULT_ID)
-
+#endif
 
 #ifndef LD_SO_CACHE
 # define LD_SO_CACHE "/etc/ld.so.cache"
@@ -32,12 +35,14 @@
 /* libc5 and glibc 2.0/2.1 use the same format.  For glibc 2.2 another
    format has been added in a compatible way:
    The beginning of the string table is used for the new table:
-   	old_magic
+	old_magic
 	nlibs
 	libs[0]
 	...
 	libs[nlibs-1]
-	new magic
+	pad, new magic needs to be aligned
+	     - this is string[0] for the old format
+	new magic - this is string[0] for the new format
 	newnlibs
 	...
 	newlibs[0]
@@ -82,6 +87,11 @@ struct cache_file_new
   /* After this the string table of size len_strings is found.  */
 };
 
+/* Used to align cache_file_new.  */
+#define ALIGN_CACHE(addr)				\
+(((addr) + __alignof__ (struct cache_file_new) -1)	\
+ & (~(__alignof__ (struct cache_file_new) - 1)))
+
 static int
 _dl_cache_libcmp (const char *p1, const char *p2)
 {
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/dl-cache.h b/sysdeps/unix/sysv/linux/sparc/sparc64/dl-cache.h
index 2d074ffa9c..eb9c040429 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/dl-cache.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/dl-cache.h
@@ -1,5 +1,5 @@
 /* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
-   Copyright (C) 1999 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000 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
@@ -21,3 +21,5 @@
 
 #define _dl_cache_check_flags(flags)			\
   ((flags) == _DL_CACHE_DEFAULT_ID)
+
+#include_next <dl-cache.h>