[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[commits] r3647 - in /fsf/trunk/libc: ./ elf/ iconvdata/ include/ localedata/ localedata/charmaps/ sysdeps/generic/



Author: eglibc
Date: Sat Sep 29 00:03:39 2007
New Revision: 3647

Log:
Import glibc-mainline for 2007-09-29

Added:
    fsf/trunk/libc/iconvdata/koi8-ru.c
    fsf/trunk/libc/localedata/charmaps/KOI8-RU
Modified:
    fsf/trunk/libc/ChangeLog
    fsf/trunk/libc/elf/dl-close.c
    fsf/trunk/libc/elf/dl-deps.c
    fsf/trunk/libc/elf/dl-fini.c
    fsf/trunk/libc/elf/dl-lookup.c
    fsf/trunk/libc/elf/dl-open.c
    fsf/trunk/libc/iconvdata/Makefile
    fsf/trunk/libc/iconvdata/TESTS
    fsf/trunk/libc/iconvdata/gconv-modules
    fsf/trunk/libc/iconvdata/koi8-r.c
    fsf/trunk/libc/iconvdata/tst-tables.sh
    fsf/trunk/libc/include/link.h
    fsf/trunk/libc/localedata/ChangeLog
    fsf/trunk/libc/sysdeps/generic/ldsodefs.h

Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Sat Sep 29 00:03:39 2007
@@ -1,3 +1,37 @@
+2007-09-24  Jakub Jelinek  <jakub@xxxxxxxxxx>
+
+	* sysdeps/generic/ldsodefs.h (struct dl_scope_free_list): Store
+	void * pointers instead of struct link_map **.
+	(_dl_scope_free): Change argument type to void *.
+	* include/link.h (struct link_map): Change type of l_reldeps
+	to struct link_map_reldeps, move l_reldepsact into that
+	struct too.
+	* elf/dl-deps.c: Include atomic.h.
+	(_dl_map_object_deps): Only change l->l_initfini when it is
+	fully populated, use _dl_scope_free for freeing it.  Optimize
+	removal of libs from reldeps by using l_reserved flag, when
+	some removal is needed, allocate a new list instead of
+	reallocating and free the old with _dl_scope_free.  Adjust
+	for l_reldeps and l_reldepsact changes.
+	* elf/dl-lookup.c (add_dependency): Likewise.  Reorganize to allow
+	searching in l_initfini and l_reldeps without holding dl_load_lock.
+	* elf/dl-fini.c (_dl_sort_fini): Adjust for l_reldeps and
+	l_reldepsact changes.
+	* elf/dl-close.c (_dl_close_worker): Likewise.
+	* elf/dl-open.c (_dl_scope_free): Change argument type to void *.
+
+2007-09-28  Ulrich Drepper  <drepper@xxxxxxxxxx>
+
+	* iconvdata/Makefile (modules): Add KOI8-RU.
+	(distribute): Add koi8-ru.c.
+	(gen-8bit-gap-modules): Add koi8-ru.
+	* iconvdata/koi8-ru.c: New file.
+	* iconvdata/gconv-modules: Add entries for KOI8-RU.
+	* iconvdata/TESTS: Likewise.
+	* iconvdata/tst-tables.sh: Likewise.
+
+	* iconvdata/koi8-r.c (HAS_HOLES): Define to 0.
+
 2007-09-26  Jakub Jelinek  <jakub@xxxxxxxxxx>
 
 	* misc/sys/cdefs.h (__warndecl, __errordecl): For GCC 4.3+ define

Modified: fsf/trunk/libc/elf/dl-close.c
==============================================================================
--- fsf/trunk/libc/elf/dl-close.c (original)
+++ fsf/trunk/libc/elf/dl-close.c Sat Sep 29 00:03:39 2007
@@ -203,9 +203,9 @@
 	}
       /* And the same for relocation dependencies.  */
       if (l->l_reldeps != NULL)
-	for (unsigned int j = 0; j < l->l_reldepsact; ++j)
+	for (unsigned int j = 0; j < l->l_reldeps->act; ++j)
 	  {
-	    struct link_map *jmap = l->l_reldeps[j];
+	    struct link_map *jmap = l->l_reldeps->list[j];
 
 	    if (jmap->l_idx != IDX_STILL_USED)
 	      {
@@ -497,7 +497,7 @@
       THREAD_GSCOPE_WAIT ();
 
       /* Now we can free any queued old scopes.  */
-      struct dl_scope_free_list *fsl  = GL(dl_scope_free_list);
+      struct dl_scope_free_list *fsl = GL(dl_scope_free_list);
       if (fsl != NULL)
 	while (fsl->count > 0)
 	  free (fsl->list[--fsl->count]);

Modified: fsf/trunk/libc/elf/dl-deps.c
==============================================================================
--- fsf/trunk/libc/elf/dl-deps.c (original)
+++ fsf/trunk/libc/elf/dl-deps.c Sat Sep 29 00:03:39 2007
@@ -1,5 +1,6 @@
 /* Load the dependencies of a mapped object.
-   Copyright (C) 1996-2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1996-2003, 2004, 2005, 2006, 2007
+   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
@@ -17,6 +18,7 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <atomic.h>
 #include <assert.h>
 #include <dlfcn.h>
 #include <errno.h>
@@ -465,15 +467,17 @@
 	{
 	  needed[nneeded++] = NULL;
 
-	  l->l_initfini = (struct link_map **)
+	  struct link_map **l_initfini = (struct link_map **)
 	    malloc ((2 * nneeded + 1) * sizeof needed[0]);
-	  if (l->l_initfini == NULL)
+	  if (l_initfini == NULL)
 	    _dl_signal_error (ENOMEM, map->l_name, NULL,
 			      N_("cannot allocate dependency list"));
-	  l->l_initfini[0] = l;
-	  memcpy (&l->l_initfini[1], needed, nneeded * sizeof needed[0]);
-	  memcpy (&l->l_initfini[nneeded + 1], l->l_initfini,
+	  l_initfini[0] = l;
+	  memcpy (&l_initfini[1], needed, nneeded * sizeof needed[0]);
+	  memcpy (&l_initfini[nneeded + 1], l_initfini,
 		  nneeded * sizeof needed[0]);
+	  atomic_write_barrier ();
+	  l->l_initfini = l_initfini;
 	}
 
       /* If we have no auxiliary objects just go on to the next map.  */
@@ -487,25 +491,26 @@
   if (errno == 0 && errno_saved != 0)
     __set_errno (errno_saved);
 
+  struct link_map **old_l_initfini = NULL;
   if (map->l_initfini != NULL && map->l_type == lt_loaded)
     {
       /* This object was previously loaded as a dependency and we have
 	 a separate l_initfini list.  We don't need it anymore.  */
       assert (map->l_searchlist.r_list == NULL);
-      free (map->l_initfini);
+      old_l_initfini = map->l_initfini;
     }
 
   /* Store the search list we built in the object.  It will be used for
      searches in the scope of this object.  */
-  map->l_initfini =
+  struct link_map **l_initfini =
     (struct link_map **) malloc ((2 * nlist + 1)
 				 * sizeof (struct link_map *));
-  if (map->l_initfini == NULL)
+  if (l_initfini == NULL)
     _dl_signal_error (ENOMEM, map->l_name, NULL,
 		      N_("cannot allocate symbol search list"));
 
 
-  map->l_searchlist.r_list = &map->l_initfini[nlist + 1];
+  map->l_searchlist.r_list = &l_initfini[nlist + 1];
   map->l_searchlist.r_nlist = nlist;
 
   for (nlist = 0, runp = known; runp; runp = runp->next)
@@ -546,10 +551,10 @@
 Filters not supported with LD_TRACE_PRELINKING"));
 	    }
 
-	  cnt = _dl_build_local_scope (map->l_initfini, l);
+	  cnt = _dl_build_local_scope (l_initfini, l);
 	  assert (cnt <= nlist);
 	  for (j = 0; j < cnt; j++)
-	    map->l_initfini[j]->l_reserved = 0;
+	    l_initfini[j]->l_reserved = 0;
 
 	  l->l_local_scope[0] =
 	    (struct r_scope_elem *) malloc (sizeof (struct r_scope_elem)
@@ -561,35 +566,50 @@
 	  l->l_local_scope[0]->r_nlist = cnt;
 	  l->l_local_scope[0]->r_list =
 	    (struct link_map **) (l->l_local_scope[0] + 1);
-	  memcpy (l->l_local_scope[0]->r_list, map->l_initfini,
+	  memcpy (l->l_local_scope[0]->r_list, l_initfini,
 		  cnt * sizeof (struct link_map *));
 	}
     }
 
   /* Maybe we can remove some relocation dependencies now.  */
   assert (map->l_searchlist.r_list[0] == map);
-  for (i = 0; i < map->l_reldepsact; ++i)
-    {
-      unsigned int j;
-
-      for (j = 1; j < nlist; ++j)
-	if (map->l_searchlist.r_list[j] == map->l_reldeps[i])
+  struct link_map_reldeps *l_reldeps = NULL;
+  if (map->l_reldeps != NULL)
+    {
+      for (i = 1; i < nlist; ++i)
+	map->l_searchlist.r_list[i]->l_reserved = 1;
+
+      struct link_map **list = &map->l_reldeps->list[0];
+      for (i = 0; i < map->l_reldeps->act; ++i)
+	if (list[i]->l_reserved)
 	  {
-	    /* A direct or transitive dependency is also on the list
-	       of relocation dependencies.  Remove the latter.  */
-	    for (j = i + 1; j < map->l_reldepsact; ++j)
-	      map->l_reldeps[j - 1] = map->l_reldeps[j];
-
-	    --map->l_reldepsact;
-
-	    /* Account for the '++i' performed by the 'for'.  */
-	    --i;
-	    break;
+	    /* Need to allocate new array of relocation dependencies.  */
+	    struct link_map_reldeps *l_reldeps;
+	    l_reldeps = malloc (sizeof (*l_reldeps)
+	    			+ map->l_reldepsmax
+				  * sizeof (struct link_map *));
+	    if (l_reldeps == NULL)
+	      /* Bad luck, keep the reldeps duplicated between
+		 map->l_reldeps->list and map->l_initfini lists.  */
+	      ;
+	    else
+	      {
+		unsigned int j = i;
+		memcpy (&l_reldeps->list[0], &list[0],
+			i * sizeof (struct link_map *));
+		for (i = i + 1; i < map->l_reldeps->act; ++i)
+		  if (!list[i]->l_reserved)
+		    l_reldeps->list[j++] = list[i];
+		l_reldeps->act = j;
+	      }
 	  }
+
+      for (i = 1; i < nlist; ++i)
+	map->l_searchlist.r_list[i]->l_reserved = 0;
     }
 
   /* Now determine the order in which the initialization has to happen.  */
-  memcpy (map->l_initfini, map->l_searchlist.r_list,
+  memcpy (l_initfini, map->l_searchlist.r_list,
 	  nlist * sizeof (struct link_map *));
   /* We can skip looking for the binary itself which is at the front
      of the search list.  Look through the list backward so that circular
@@ -602,7 +622,7 @@
 
       /* Find the place in the initfini list where the map is currently
 	 located.  */
-      for (j = 1; map->l_initfini[j] != l; ++j)
+      for (j = 1; l_initfini[j] != l; ++j)
 	;
 
       /* Find all object for which the current one is a dependency and
@@ -611,19 +631,18 @@
 	{
 	  struct link_map **runp;
 
-	  runp = map->l_initfini[k]->l_initfini;
+	  runp = l_initfini[k]->l_initfini;
 	  if (runp != NULL)
 	    {
 	      while (*runp != NULL)
 		if (__builtin_expect (*runp++ == l, 0))
 		  {
-		    struct link_map *here = map->l_initfini[k];
+		    struct link_map *here = l_initfini[k];
 
 		    /* Move it now.  */
-		    memmove (&map->l_initfini[j] + 1,
-			     &map->l_initfini[j],
+		    memmove (&l_initfini[j] + 1, &l_initfini[j],
 			     (k - j) * sizeof (struct link_map *));
-		    map->l_initfini[j] = here;
+		    l_initfini[j] = here;
 
 		    /* Don't insert further matches before the last
 		       entry moved to the front.  */
@@ -635,7 +654,18 @@
 	}
     }
   /* Terminate the list of dependencies.  */
-  map->l_initfini[nlist] = NULL;
+  l_initfini[nlist] = NULL;
+  atomic_write_barrier ();
+  map->l_initfini = l_initfini;
+  if (l_reldeps != NULL)
+    {
+      atomic_write_barrier ();
+      void *old_l_reldeps = map->l_reldeps;
+      map->l_reldeps = l_reldeps;
+      _dl_scope_free (old_l_reldeps);
+    }
+  if (old_l_initfini != NULL)
+    _dl_scope_free (old_l_initfini);
 
   if (errno_reason)
     _dl_signal_error (errno_reason == -1 ? 0 : errno_reason, objname,

Modified: fsf/trunk/libc/elf/dl-fini.c
==============================================================================
--- fsf/trunk/libc/elf/dl-fini.c (original)
+++ fsf/trunk/libc/elf/dl-fini.c Sat Sep 29 00:03:39 2007
@@ -82,8 +82,8 @@
 
 	    if (__builtin_expect (maps[k]->l_reldeps != NULL, 0))
 	      {
-		unsigned int m = maps[k]->l_reldepsact;
-		struct link_map **relmaps = maps[k]->l_reldeps;
+		unsigned int m = maps[k]->l_reldeps->act;
+		struct link_map **relmaps = &maps[k]->l_reldeps->list[0];
 
 		while (m-- > 0)
 		  {

Modified: fsf/trunk/libc/elf/dl-lookup.c
==============================================================================
--- fsf/trunk/libc/elf/dl-lookup.c (original)
+++ fsf/trunk/libc/elf/dl-lookup.c Sat Sep 29 00:03:39 2007
@@ -88,20 +88,50 @@
 internal_function
 add_dependency (struct link_map *undef_map, struct link_map *map, int flags)
 {
-  struct link_map **list;
   struct link_map *runp;
-  unsigned int act;
   unsigned int i;
   int result = 0;
-  unsigned long long int serial;
 
   /* Avoid self-references and references to objects which cannot be
      unloaded anyway.  */
   if (undef_map == map)
     return 0;
 
+  /* Avoid references to objects which cannot be unloaded anyway.  */
+  assert (map->l_type == lt_loaded);
+  if ((map->l_flags_1 & DF_1_NODELETE) != 0)
+    return 0;
+
+  struct link_map_reldeps *l_reldeps
+    = atomic_forced_read (undef_map->l_reldeps);
+
+  /* Make sure l_reldeps is read before l_initfini.  */
+  atomic_read_barrier ();
+
+  /* Determine whether UNDEF_MAP already has a reference to MAP.  First
+     look in the normal dependencies.  */
+  struct link_map **l_initfini = atomic_forced_read (undef_map->l_initfini);
+  if (l_initfini != NULL)
+    {
+      for (i = 0; l_initfini[i] != NULL; ++i)
+	if (l_initfini[i] == map)
+	  return 0;
+    }
+
+  /* No normal dependency.  See whether we already had to add it
+     to the special list of dynamic dependencies.  */
+  unsigned int l_reldepsact = 0;
+  if (l_reldeps != NULL)
+    {
+      struct link_map **list = &l_reldeps->list[0];
+      l_reldepsact = l_reldeps->act;
+      for (i = 0; i < l_reldepsact; ++i)
+	if (list[i] == map)
+	  return 0;
+    }
+
   /* Save serial number of the target MAP.  */
-  serial = map->l_serial;
+  unsigned long long serial = map->l_serial;
 
   /* Make sure nobody can unload the object while we are at it.  */
   if (__builtin_expect (flags & DL_LOOKUP_GSCOPE_LOCK, 0))
@@ -110,38 +140,52 @@
 	 here, that can result in ABBA deadlock.  */
       THREAD_GSCOPE_RESET_FLAG ();
       __rtld_lock_lock_recursive (GL(dl_load_lock));
-      THREAD_GSCOPE_SET_FLAG ();
       /* While MAP value won't change, after THREAD_GSCOPE_RESET_FLAG ()
 	 it can e.g. point to unallocated memory.  So avoid the optimizer
 	 treating the above read from MAP->l_serial as ensurance it
 	 can safely dereference it.  */
       map = atomic_forced_read (map);
+
+      /* From this point on it is unsafe to dereference MAP, until it
+	 has been found in one of the lists.  */
+
+      /* Redo the l_initfini check in case undef_map's l_initfini
+	 changed in the mean time.  */
+      if (undef_map->l_initfini != l_initfini
+	  && undef_map->l_initfini != NULL)
+	{
+	  l_initfini = undef_map->l_initfini;
+	  for (i = 0; l_initfini[i] != NULL; ++i)
+	    if (l_initfini[i] == map)
+	      goto out_check;
+	}
+
+      /* Redo the l_reldeps check if undef_map's l_reldeps changed in
+	 the mean time.  */
+      if (undef_map->l_reldeps != NULL)
+	{
+	  if (undef_map->l_reldeps != l_reldeps)
+	    {
+	      struct link_map **list = &undef_map->l_reldeps->list[0];
+	      l_reldepsact = undef_map->l_reldeps->act;
+	      for (i = 0; i < l_reldepsact; ++i)
+		if (list[i] == map)
+		  goto out_check;
+	    }
+	  else if (undef_map->l_reldeps->act > l_reldepsact)
+	    {
+	      struct link_map **list
+		= &undef_map->l_reldeps->list[0];
+	      i = l_reldepsact;
+	      l_reldepsact = undef_map->l_reldeps->act;
+	      for (; i < l_reldepsact; ++i)
+		if (list[i] == map)
+		  goto out_check;
+	    }
+	}
     }
   else
     __rtld_lock_lock_recursive (GL(dl_load_lock));
-
-  /* From this point on it is unsafe to dereference MAP, until it
-     has been found in one of the lists.  */
-
-  /* Determine whether UNDEF_MAP already has a reference to MAP.  First
-     look in the normal dependencies.  */
-  if (undef_map->l_initfini != NULL)
-    {
-      list = undef_map->l_initfini;
-
-      for (i = 0; list[i] != NULL; ++i)
-	if (list[i] == map)
-	  goto out_check;
-    }
-
-  /* No normal dependency.  See whether we already had to add it
-     to the special list of dynamic dependencies.  */
-  list = undef_map->l_reldeps;
-  act = undef_map->l_reldepsact;
-
-  for (i = 0; i < act; ++i)
-    if (list[i] == map)
-      goto out_check;
 
   /* The object is not yet in the dependency list.  Before we add
      it make sure just one more time the object we are about to
@@ -161,8 +205,8 @@
       if (map->l_serial != serial)
 	goto out_check;
 
-      /* Avoid references to objects which cannot be unloaded anyway.  */
-      assert (map->l_type == lt_loaded);
+      /* Redo the NODELETE check, as when dl_load_lock wasn't held
+	 yet this could have changed.  */
       if ((map->l_flags_1 & DF_1_NODELETE) != 0)
 	goto out;
 
@@ -177,33 +221,46 @@
 	}
 
       /* Add the reference now.  */
-      if (__builtin_expect (act >= undef_map->l_reldepsmax, 0))
+      if (__builtin_expect (l_reldepsact >= undef_map->l_reldepsmax, 0))
 	{
 	  /* Allocate more memory for the dependency list.  Since this
 	     can never happen during the startup phase we can use
 	     `realloc'.  */
-	  void *newp;
-
-	  undef_map->l_reldepsmax += 5;
-	  newp = realloc (undef_map->l_reldeps,
-			  undef_map->l_reldepsmax
-			  * sizeof (struct link_map *));
-
-	  if (__builtin_expect (newp != NULL, 1))
-	    undef_map->l_reldeps = (struct link_map **) newp;
+	  struct link_map_reldeps *newp;
+	  unsigned int max
+	    = undef_map->l_reldepsmax ? undef_map->l_reldepsmax * 2 : 10;
+
+	  newp = malloc (sizeof (*newp) + max * sizeof (struct link_map *));
+	  if (newp == NULL)
+	    {
+	      /* If we didn't manage to allocate memory for the list this is
+		 no fatal problem.  We simply make sure the referenced object
+		 cannot be unloaded.  This is semantically the correct
+		 behavior.  */
+	      map->l_flags_1 |= DF_1_NODELETE;
+	      goto out;
+	    }
 	  else
-	    /* Correct the addition.  */
-	    undef_map->l_reldepsmax -= 5;
-	}
-
-      /* If we didn't manage to allocate memory for the list this is
-	 no fatal mistake.  We simply make sure the referenced object
-	 cannot be unloaded.  This is semantically the correct
-	 behavior.  */
-      if (__builtin_expect (act < undef_map->l_reldepsmax, 1))
-	undef_map->l_reldeps[undef_map->l_reldepsact++] = map;
+	    {
+	      if (l_reldepsact)
+		memcpy (&newp->list[0], &undef_map->l_reldeps->list[0],
+			l_reldepsact * sizeof (struct link_map *));
+	      newp->list[l_reldepsact] = map;
+	      newp->act = l_reldepsact + 1;
+	      atomic_write_barrier ();
+	      void *old = undef_map->l_reldeps;
+	      undef_map->l_reldeps = newp;
+	      undef_map->l_reldepsmax = max;
+	      if (old)
+		_dl_scope_free (old);
+	    }
+	}
       else
-	map->l_flags_1 |= DF_1_NODELETE;
+	{
+	  undef_map->l_reldeps->list[l_reldepsact] = map;
+	  atomic_write_barrier ();
+	  undef_map->l_reldeps->act = l_reldepsact + 1;
+	}
 
       /* Display information if we are debugging.  */
       if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0))
@@ -222,6 +279,9 @@
  out:
   /* Release the lock.  */
   __rtld_lock_unlock_recursive (GL(dl_load_lock));
+
+  if (__builtin_expect (flags & DL_LOOKUP_GSCOPE_LOCK, 0))
+    THREAD_GSCOPE_SET_FLAG ();
 
   return result;
 

Modified: fsf/trunk/libc/elf/dl-open.c
==============================================================================
--- fsf/trunk/libc/elf/dl-open.c (original)
+++ fsf/trunk/libc/elf/dl-open.c Sat Sep 29 00:03:39 2007
@@ -166,7 +166,7 @@
 }
 
 int
-_dl_scope_free (struct r_scope_elem **old)
+_dl_scope_free (void *old)
 {
   struct dl_scope_free_list *fsl;
 #define DL_SCOPE_FREE_LIST_SIZE (sizeof (fsl->list) / sizeof (fsl->list[0]))

Modified: fsf/trunk/libc/iconvdata/Makefile
==============================================================================
--- fsf/trunk/libc/iconvdata/Makefile (original)
+++ fsf/trunk/libc/iconvdata/Makefile Sat Sep 29 00:03:39 2007
@@ -59,7 +59,7 @@
 	   IBM1149 IBM1166 IBM1167 IBM4517 IBM4899 IBM4909 IBM4971 	 \
 	   IBM5347 IBM9030 IBM9066 IBM9448 IBM12712 IBM16804             \
 	   IBM1364 IBM1371 IBM1388 IBM1390 IBM1399 ISO_11548-1 MIK BRF	 \
-	   MAC-CENTRALEUROPE
+	   MAC-CENTRALEUROPE KOI8-RU
 
 modules.so := $(addsuffix .so, $(modules))
 
@@ -240,7 +240,7 @@
 			iso-ir-197 tis-620 koi8-u ibm874 cp10007 koi8-t	   \
 			georgian-ps georgian-academy iso-ir-209 mac-sami   \
 			iso8859-11 ibm866nav pt154 rk1048 mik brf \
-			mac-centraleurope
+			mac-centraleurope koi8-ru
 
 gen-special-modules := iso8859-7jp
 

Modified: fsf/trunk/libc/iconvdata/TESTS
==============================================================================
--- fsf/trunk/libc/iconvdata/TESTS (original)
+++ fsf/trunk/libc/iconvdata/TESTS Sat Sep 29 00:03:39 2007
@@ -169,3 +169,4 @@
 BRF			BRF			-	UTF8
 MAC-SAMI		MAC-SAMI		Y	UTF8
 MAC-CENTRALEUROPE	MAC-CENTRALEUROPE	Y	UTF8
+KOI8-RU			KOI8-RU			Y	UTF8

Modified: fsf/trunk/libc/iconvdata/gconv-modules
==============================================================================
--- fsf/trunk/libc/iconvdata/gconv-modules (original)
+++ fsf/trunk/libc/iconvdata/gconv-modules Sat Sep 29 00:03:39 2007
@@ -1916,3 +1916,7 @@
 alias	CP1282//		MAC-CENTRALEUROPE//
 module	MAC-CENTRALEUROPE//	INTERNAL		MAC-CENTRALEUROPE 1
 module	INTERNAL		MAC-CENTRALEUROPE//	MAC-CENTRALEUROPE 1
+
+#	from			to			module		cost
+module	KOI8-RU//		INTERNAL		KOI8-RU		1
+module	INTERNAL		KOI8-RU//		KOI8-RU		1

Modified: fsf/trunk/libc/iconvdata/koi8-r.c
==============================================================================
--- fsf/trunk/libc/iconvdata/koi8-r.c (original)
+++ fsf/trunk/libc/iconvdata/koi8-r.c Sat Sep 29 00:03:39 2007
@@ -1,5 +1,5 @@
 /* Conversion from and to KOI8-R.
-   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1998, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@xxxxxxxxxx>, 1997.
 
@@ -24,6 +24,6 @@
 #define TABLES <koi8-r.h>
 
 #define CHARSET_NAME	"KOI8-R//"
-#define HAS_HOLES	1	/* Not all 256 character are defined.  */
+#define HAS_HOLES	0	/* All 256 character are defined.  */
 
 #include <8bit-gap.c>

Added: fsf/trunk/libc/iconvdata/koi8-ru.c
==============================================================================
--- fsf/trunk/libc/iconvdata/koi8-ru.c (added)
+++ fsf/trunk/libc/iconvdata/koi8-ru.c Sat Sep 29 00:03:39 2007
@@ -1,0 +1,29 @@
+/* Conversion from and to KOI8-RU.
+   Copyright (C) 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@xxxxxxxxxx>, 20077.
+
+   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, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <stdint.h>
+
+/* Specify the conversion table.  */
+#define TABLES <koi8-ru.h>
+
+#define CHARSET_NAME	"KOI8-RU//"
+#define HAS_HOLES	0	/* All 256 character are defined.  */
+
+#include <8bit-gap.c>

Modified: fsf/trunk/libc/iconvdata/tst-tables.sh
==============================================================================
--- fsf/trunk/libc/iconvdata/tst-tables.sh (original)
+++ fsf/trunk/libc/iconvdata/tst-tables.sh Sat Sep 29 00:03:39 2007
@@ -210,6 +210,7 @@
   MIK
   BRF
   MAC-CENTRALEUROPE
+  KOI8-RU
   #
   # Multibyte encodings come here
   #

Modified: fsf/trunk/libc/include/link.h
==============================================================================
--- fsf/trunk/libc/include/link.h (original)
+++ fsf/trunk/libc/include/link.h Sat Sep 29 00:03:39 2007
@@ -240,8 +240,11 @@
 
     /* List of the dependencies introduced through symbol binding.  */
     unsigned int l_reldepsmax;
-    unsigned int l_reldepsact;
-    struct link_map **l_reldeps;
+    struct link_map_reldeps
+      {
+	unsigned int act;
+	struct link_map *list[];
+      } *l_reldeps;
 
     /* Various flag words.  */
     ElfW(Word) l_feature_1;

Modified: fsf/trunk/libc/localedata/ChangeLog
==============================================================================
--- fsf/trunk/libc/localedata/ChangeLog (original)
+++ fsf/trunk/libc/localedata/ChangeLog Sat Sep 29 00:03:39 2007
@@ -1,3 +1,7 @@
+2007-09-28  Ulrich Drepper  <drepper@xxxxxxxxxx>
+
+	* charmaps/KOI8-RU: New file.
+
 2007-09-23  Ulrich Drepper  <drepper@xxxxxxxxxx>
 
 	[BZ #4556]

Added: fsf/trunk/libc/localedata/charmaps/KOI8-RU
==============================================================================
--- fsf/trunk/libc/localedata/charmaps/KOI8-RU (added)
+++ fsf/trunk/libc/localedata/charmaps/KOI8-RU Sat Sep 29 00:03:39 2007
@@ -1,0 +1,264 @@
+<code_set_name> KOI8-RU
+<comment_char> %
+<escape_char> /
+% version: 1.0
+%  source: Draft RFC rfc-draft-koi8-ru.txt
+
+CHARMAP
+<U0000>     /x00         NULL (NUL)
+<U0001>     /x01         START OF HEADING (SOH)
+<U0002>     /x02         START OF TEXT (STX)
+<U0003>     /x03         END OF TEXT (ETX)
+<U0004>     /x04         END OF TRANSMISSION (EOT)
+<U0005>     /x05         ENQUIRY (ENQ)
+<U0006>     /x06         ACKNOWLEDGE (ACK)
+<U0007>     /x07         BELL (BEL)
+<U0008>     /x08         BACKSPACE (BS)
+<U0009>     /x09         CHARACTER TABULATION (HT)
+<U000A>     /x0a         LINE FEED (LF)
+<U000B>     /x0b         LINE TABULATION (VT)
+<U000C>     /x0c         FORM FEED (FF)
+<U000D>     /x0d         CARRIAGE RETURN (CR)
+<U000E>     /x0e         SHIFT OUT (SO)
+<U000F>     /x0f         SHIFT IN (SI)
+<U0010>     /x10         DATALINK ESCAPE (DLE)
+<U0011>     /x11         DEVICE CONTROL ONE (DC1)
+<U0012>     /x12         DEVICE CONTROL TWO (DC2)
+<U0013>     /x13         DEVICE CONTROL THREE (DC3)
+<U0014>     /x14         DEVICE CONTROL FOUR (DC4)
+<U0015>     /x15         NEGATIVE ACKNOWLEDGE (NAK)
+<U0016>     /x16         SYNCHRONOUS IDLE (SYN)
+<U0017>     /x17         END OF TRANSMISSION BLOCK (ETB)
+<U0018>     /x18         CANCEL (CAN)
+<U0019>     /x19         END OF MEDIUM (EM)
+<U001A>     /x1a         SUBSTITUTE (SUB)
+<U001B>     /x1b         ESCAPE (ESC)
+<U001C>     /x1c         FILE SEPARATOR (IS4)
+<U001D>     /x1d         GROUP SEPARATOR (IS3)
+<U001E>     /x1e         RECORD SEPARATOR (IS2)
+<U001F>     /x1f         UNIT SEPARATOR (IS1)
+<U0020>     /x20         SPACE
+<U0021>     /x21         EXCLAMATION MARK
+<U0022>     /x22         QUOTATION MARK
+<U0023>     /x23         NUMBER SIGN
+<U0024>     /x24         DOLLAR SIGN
+<U0025>     /x25         PERCENT SIGN
+<U0026>     /x26         AMPERSAND
+<U0027>     /x27         APOSTROPHE
+<U0028>     /x28         LEFT PARENTHESIS
+<U0029>     /x29         RIGHT PARENTHESIS
+<U002A>     /x2a         ASTERISK
+<U002B>     /x2b         PLUS SIGN
+<U002C>     /x2c         COMMA
+<U002D>     /x2d         HYPHEN-MINUS
+<U002E>     /x2e         FULL STOP
+<U002F>     /x2f         SOLIDUS
+<U0030>     /x30         DIGIT ZERO
+<U0031>     /x31         DIGIT ONE
+<U0032>     /x32         DIGIT TWO
+<U0033>     /x33         DIGIT THREE
+<U0034>     /x34         DIGIT FOUR
+<U0035>     /x35         DIGIT FIVE
+<U0036>     /x36         DIGIT SIX
+<U0037>     /x37         DIGIT SEVEN
+<U0038>     /x38         DIGIT EIGHT
+<U0039>     /x39         DIGIT NINE
+<U003A>     /x3a         COLON
+<U003B>     /x3b         SEMICOLON
+<U003C>     /x3c         LESS-THAN SIGN
+<U003D>     /x3d         EQUALS SIGN
+<U003E>     /x3e         GREATER-THAN SIGN
+<U003F>     /x3f         QUESTION MARK
+<U0040>     /x40         COMMERCIAL AT
+<U0041>     /x41         LATIN CAPITAL LETTER A
+<U0042>     /x42         LATIN CAPITAL LETTER B
+<U0043>     /x43         LATIN CAPITAL LETTER C
+<U0044>     /x44         LATIN CAPITAL LETTER D
+<U0045>     /x45         LATIN CAPITAL LETTER E
+<U0046>     /x46         LATIN CAPITAL LETTER F
+<U0047>     /x47         LATIN CAPITAL LETTER G
+<U0048>     /x48         LATIN CAPITAL LETTER H
+<U0049>     /x49         LATIN CAPITAL LETTER I
+<U004A>     /x4a         LATIN CAPITAL LETTER J
+<U004B>     /x4b         LATIN CAPITAL LETTER K
+<U004C>     /x4c         LATIN CAPITAL LETTER L
+<U004D>     /x4d         LATIN CAPITAL LETTER M
+<U004E>     /x4e         LATIN CAPITAL LETTER N
+<U004F>     /x4f         LATIN CAPITAL LETTER O
+<U0050>     /x50         LATIN CAPITAL LETTER P
+<U0051>     /x51         LATIN CAPITAL LETTER Q
+<U0052>     /x52         LATIN CAPITAL LETTER R
+<U0053>     /x53         LATIN CAPITAL LETTER S
+<U0054>     /x54         LATIN CAPITAL LETTER T
+<U0055>     /x55         LATIN CAPITAL LETTER U
+<U0056>     /x56         LATIN CAPITAL LETTER V
+<U0057>     /x57         LATIN CAPITAL LETTER W
+<U0058>     /x58         LATIN CAPITAL LETTER X
+<U0059>     /x59         LATIN CAPITAL LETTER Y
+<U005A>     /x5a         LATIN CAPITAL LETTER Z
+<U005B>     /x5b         LEFT SQUARE BRACKET
+<U005C>     /x5c         REVERSE SOLIDUS
+<U005D>     /x5d         RIGHT SQUARE BRACKET
+<U005E>     /x5e         CIRCUMFLEX ACCENT
+<U005F>     /x5f         LOW LINE
+<U0060>     /x60         GRAVE ACCENT
+<U0061>     /x61         LATIN SMALL LETTER A
+<U0062>     /x62         LATIN SMALL LETTER B
+<U0063>     /x63         LATIN SMALL LETTER C
+<U0064>     /x64         LATIN SMALL LETTER D
+<U0065>     /x65         LATIN SMALL LETTER E
+<U0066>     /x66         LATIN SMALL LETTER F
+<U0067>     /x67         LATIN SMALL LETTER G
+<U0068>     /x68         LATIN SMALL LETTER H
+<U0069>     /x69         LATIN SMALL LETTER I
+<U006A>     /x6a         LATIN SMALL LETTER J
+<U006B>     /x6b         LATIN SMALL LETTER K
+<U006C>     /x6c         LATIN SMALL LETTER L
+<U006D>     /x6d         LATIN SMALL LETTER M
+<U006E>     /x6e         LATIN SMALL LETTER N
+<U006F>     /x6f         LATIN SMALL LETTER O
+<U0070>     /x70         LATIN SMALL LETTER P
+<U0071>     /x71         LATIN SMALL LETTER Q
+<U0072>     /x72         LATIN SMALL LETTER R
+<U0073>     /x73         LATIN SMALL LETTER S
+<U0074>     /x74         LATIN SMALL LETTER T
+<U0075>     /x75         LATIN SMALL LETTER U
+<U0076>     /x76         LATIN SMALL LETTER V
+<U0077>     /x77         LATIN SMALL LETTER W
+<U0078>     /x78         LATIN SMALL LETTER X
+<U0079>     /x79         LATIN SMALL LETTER Y
+<U007A>     /x7a         LATIN SMALL LETTER Z
+<U007B>     /x7b         LEFT CURLY BRACKET
+<U007C>     /x7c         VERTICAL LINE
+<U007D>     /x7d         RIGHT CURLY BRACKET
+<U007E>     /x7e         TILDE
+<U007F>     /x7f         DELETE (DEL)
+<U2500>     /x80         BOX DRAWINGS LIGHT HORIZONTAL
+<U2502>     /x81         BOX DRAWINGS LIGHT VERTICAL
+<U250C>     /x82         BOX DRAWINGS LIGHT DOWN AND RIGHT
+<U2510>     /x83         BOX DRAWINGS LIGHT DOWN AND LEFT
+<U2514>     /x84         BOX DRAWINGS LIGHT UP AND RIGHT
+<U2518>     /x85         BOX DRAWINGS LIGHT UP AND LEFT
+<U251C>     /x86         BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+<U2524>     /x87         BOX DRAWINGS LIGHT VERTICAL AND LEFT
+<U252C>     /x88         BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+<U2534>     /x89         BOX DRAWINGS LIGHT UP AND HORIZONTAL
+<U253C>     /x8a         BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+<U2580>     /x8b         UPPER HALF BLOCK
+<U2584>     /x8c         LOWER HALF BLOCK
+<U2588>     /x8d         FULL BLOCK
+<U258C>     /x8e         LEFT HALF BLOCK
+<U2590>     /x8f         RIGHT HALF BLOCK
+<U2591>     /x90         LIGHT SHADE
+<U2592>     /x91         MEDIUM SHADE
+<U2593>     /x92         DARK SHADE
+<U201C>     /x93         LEFT DOUBLE QUOTATION MARK
+<U25A0>     /x94         BLACK SQUARE
+<U2219>     /x95         BULLET OPERATOR
+<U201D>     /x96         RIGHT DOUBLE QUOTATION MARK
+<U2014>     /x97         EM DASH
+<U2116>     /x98         NUMERO SIGN
+<U2122>     /x99         TRADE MARK SIGN
+<U00A0>     /x9a         NO-BREAK SPACE
+<U00BB>     /x9b         RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+<U00AE>     /x9c         REGISTERED SIGN
+<U00AB>     /x9d         LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+<U00B7>     /x9e         MIDDLE DOT
+<U00A4>     /x9f         CURRENCY SIGN
+<U2550>     /xa0         BOX DRAWINGS DOUBLE HORIZONTAL
+<U2551>     /xa1         BOX DRAWINGS DOUBLE VERTICAL
+<U2552>     /xa2         BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+<U0451>     /xa3         CYRILLIC SMALL LETTER IO
+<U0454>     /xa4         CYRILLIC SMALL LETTER UKRAINIAN IE
+<U2554>     /xa5         BOX DRAWINGS DOUBLE DOWN AND RIGHT
+<U0456>     /xa6         CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+<U0457>     /xa7         CYRILLIC SMALL LETTER YI
+<U2557>     /xa8         BOX DRAWINGS DOUBLE DOWN AND LEFT
+<U2558>     /xa9         BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+<U2559>     /xaa         BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+<U255A>     /xab         BOX DRAWINGS DOUBLE UP AND RIGHT
+<U255B>     /xac         BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+<U0491>     /xad         CYRILLIC SMALL LETTER GHE WITH UPTURN
+<U045E>     /xae         CYRILLIC SMALL LETTER SHORT U
+<U255E>     /xaf         BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+<U255F>     /xb0         BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+<U2560>     /xb1         BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+<U2561>     /xb2         BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+<U0401>     /xb3         CYRILLIC CAPITAL LETTER IO
+<U0404>     /xb4         CYRILLIC CAPITAL LETTER UKRAINIAN IE
+<U2563>     /xb5         BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+<U0406>     /xb6         CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+<U0407>     /xb7         CYRILLIC CAPITAL LETTER YI
+<U2566>     /xb8         BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+<U2567>     /xb9         BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+<U2568>     /xba         BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+<U2569>     /xbb         BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+<U256A>     /xbc         BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+<U0490>     /xbd         CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+<U040E>     /xbe         CYRILLIC CAPITAL LETTER SHORT U
+<U00A9>     /xbf         COPYRIGHT SIGN
+<U044E>     /xc0         CYRILLIC SMALL LETTER YU
+<U0430>     /xc1         CYRILLIC SMALL LETTER A
+<U0431>     /xc2         CYRILLIC SMALL LETTER BE
+<U0446>     /xc3         CYRILLIC SMALL LETTER TSE
+<U0434>     /xc4         CYRILLIC SMALL LETTER DE
+<U0435>     /xc5         CYRILLIC SMALL LETTER IE
+<U0444>     /xc6         CYRILLIC SMALL LETTER EF
+<U0433>     /xc7         CYRILLIC SMALL LETTER GHE
+<U0445>     /xc8         CYRILLIC SMALL LETTER HA
+<U0438>     /xc9         CYRILLIC SMALL LETTER I
+<U0439>     /xca         CYRILLIC SMALL LETTER SHORT I
+<U043A>     /xcb         CYRILLIC SMALL LETTER KA
+<U043B>     /xcc         CYRILLIC SMALL LETTER EL
+<U043C>     /xcd         CYRILLIC SMALL LETTER EM
+<U043D>     /xce         CYRILLIC SMALL LETTER EN
+<U043E>     /xcf         CYRILLIC SMALL LETTER O
+<U043F>     /xd0         CYRILLIC SMALL LETTER PE
+<U044F>     /xd1         CYRILLIC SMALL LETTER YA
+<U0440>     /xd2         CYRILLIC SMALL LETTER ER
+<U0441>     /xd3         CYRILLIC SMALL LETTER ES
+<U0442>     /xd4         CYRILLIC SMALL LETTER TE
+<U0443>     /xd5         CYRILLIC SMALL LETTER U
+<U0436>     /xd6         CYRILLIC SMALL LETTER ZHE
+<U0432>     /xd7         CYRILLIC SMALL LETTER VE
+<U044C>     /xd8         CYRILLIC SMALL LETTER SOFT SIGN
+<U044B>     /xd9         CYRILLIC SMALL LETTER YERU
+<U0437>     /xda         CYRILLIC SMALL LETTER ZE
+<U0448>     /xdb         CYRILLIC SMALL LETTER SHA
+<U044D>     /xdc         CYRILLIC SMALL LETTER E
+<U0449>     /xdd         CYRILLIC SMALL LETTER SHCHA
+<U0447>     /xde         CYRILLIC SMALL LETTER CHE
+<U044A>     /xdf         CYRILLIC SMALL LETTER HARD SIGN
+<U042E>     /xe0         CYRILLIC CAPITAL LETTER YU
+<U0410>     /xe1         CYRILLIC CAPITAL LETTER A
+<U0411>     /xe2         CYRILLIC CAPITAL LETTER BE
+<U0426>     /xe3         CYRILLIC CAPITAL LETTER TSE
+<U0414>     /xe4         CYRILLIC CAPITAL LETTER DE
+<U0415>     /xe5         CYRILLIC CAPITAL LETTER IE
+<U0424>     /xe6         CYRILLIC CAPITAL LETTER EF
+<U0413>     /xe7         CYRILLIC CAPITAL LETTER GHE
+<U0425>     /xe8         CYRILLIC CAPITAL LETTER HA
+<U0418>     /xe9         CYRILLIC CAPITAL LETTER I
+<U0419>     /xea         CYRILLIC CAPITAL LETTER SHORT I
+<U041A>     /xeb         CYRILLIC CAPITAL LETTER KA
+<U041B>     /xec         CYRILLIC CAPITAL LETTER EL
+<U041C>     /xed         CYRILLIC CAPITAL LETTER EM
+<U041D>     /xee         CYRILLIC CAPITAL LETTER EN
+<U041E>     /xef         CYRILLIC CAPITAL LETTER O
+<U041F>     /xf0         CYRILLIC CAPITAL LETTER PE
+<U042F>     /xf1         CYRILLIC CAPITAL LETTER YA
+<U0420>     /xf2         CYRILLIC CAPITAL LETTER ER
+<U0421>     /xf3         CYRILLIC CAPITAL LETTER ES
+<U0422>     /xf4         CYRILLIC CAPITAL LETTER TE
+<U0423>     /xf5         CYRILLIC CAPITAL LETTER U
+<U0416>     /xf6         CYRILLIC CAPITAL LETTER ZHE
+<U0412>     /xf7         CYRILLIC CAPITAL LETTER VE
+<U042C>     /xf8         CYRILLIC CAPITAL LETTER SOFT SIGN
+<U042B>     /xf9         CYRILLIC CAPITAL LETTER YERU
+<U0417>     /xfa         CYRILLIC CAPITAL LETTER ZE
+<U0428>     /xfb         CYRILLIC CAPITAL LETTER SHA
+<U042D>     /xfc         CYRILLIC CAPITAL LETTER E
+<U0429>     /xfd         CYRILLIC CAPITAL LETTER SHCHA
+<U0427>     /xfe         CYRILLIC CAPITAL LETTER CHE
+<U042A>     /xff         CYRILLIC CAPITAL LETTER HARD SIGN
+END CHARMAP

Modified: fsf/trunk/libc/sysdeps/generic/ldsodefs.h
==============================================================================
--- fsf/trunk/libc/sysdeps/generic/ldsodefs.h (original)
+++ fsf/trunk/libc/sysdeps/generic/ldsodefs.h Sat Sep 29 00:03:39 2007
@@ -491,7 +491,7 @@
   EXTERN struct dl_scope_free_list
   {
     size_t count;
-    struct r_scope_elem **list[50];
+    void *list[50];
   } *_dl_scope_free_list;
 #ifdef SHARED
 };
@@ -1058,7 +1058,7 @@
 /* Free or queue for freeing scope OLD.  If other threads might be
    in the middle of _dl_fixup, _dl_profile_fixup or dl*sym using the
    old scope, OLD can't be freed until no thread is using it.  */
-extern int _dl_scope_free (struct r_scope_elem **old) attribute_hidden;
+extern int _dl_scope_free (void *) attribute_hidden;
 
 /* Add module to slot information data.  */
 extern void _dl_add_to_slotinfo (struct link_map  *l) attribute_hidden;