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

[commits] r14816 - in /fsf/glibc-2_13-branch/libc: ChangeLog NEWS elf/dl-deps.c elf/dl-fini.c



Author: eglibc
Date: Thu Aug  4 00:07:19 2011
New Revision: 14816

Log:
Import glibc-2.13 for 2011-08-04

Modified:
    fsf/glibc-2_13-branch/libc/ChangeLog
    fsf/glibc-2_13-branch/libc/NEWS
    fsf/glibc-2_13-branch/libc/elf/dl-deps.c
    fsf/glibc-2_13-branch/libc/elf/dl-fini.c

Modified: fsf/glibc-2_13-branch/libc/ChangeLog
==============================================================================
--- fsf/glibc-2_13-branch/libc/ChangeLog (original)
+++ fsf/glibc-2_13-branch/libc/ChangeLog Thu Aug  4 00:07:19 2011
@@ -1,3 +1,13 @@
+2011-05-30  Ulrich Drepper  <drepper@xxxxxxxxx>
+
+	[BZ #12454]
+	* elf/dl-deps.c (_dl_map_object_deps): Run initializer sorting only
+	when there are multiple maps.
+	* elf/dl-fini.c (_dl_sort_fini): Check for list of one.
+	(_dl_fini): Remove test here.
+
+	* elf/rtld.c (dl_main): Don't allow the loader to load itself.
+
 2011-02-06  Mike Frysinger  <vapier@xxxxxxxxxx>
 
 	[BZ #12653]

Modified: fsf/glibc-2_13-branch/libc/NEWS
==============================================================================
--- fsf/glibc-2_13-branch/libc/NEWS (original)
+++ fsf/glibc-2_13-branch/libc/NEWS Thu Aug  4 00:07:19 2011
@@ -1,4 +1,4 @@
-GNU C Library NEWS -- history of user-visible changes.  2011-1-19
+GNU C Library NEWS -- history of user-visible changes.  2011-5-30
 Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc.
 See the end for copying conditions.
 
@@ -13,7 +13,7 @@
   11655, 11701, 11840, 11856, 11883, 11903, 11904, 11968, 11979, 12005,
   12037, 12067, 12077, 12078, 12092, 12093, 12107, 12108, 12113, 12140,
   12159, 12167, 12191, 12194, 12201, 12204, 12205, 12207, 12348, 12378,
-  12394, 12397, 12489, 12653
+  12394, 12397, 12489, 12653, 12454
 
 * New Linux interfaces: prlimit, prlimit64, fanotify_init, fanotify_mark
 

Modified: fsf/glibc-2_13-branch/libc/elf/dl-deps.c
==============================================================================
--- fsf/glibc-2_13-branch/libc/elf/dl-deps.c (original)
+++ fsf/glibc-2_13-branch/libc/elf/dl-deps.c Thu Aug  4 00:07:19 2011
@@ -613,61 +613,64 @@
 	map->l_searchlist.r_list[i]->l_reserved = 0;
     }
 
-  /* Now determine the order in which the initialization has to happen.  */
+  /* Sort the initializer list to take dependencies into account.  The binary
+     itself will always be initialize last.  */
   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.  */
-  assert (nlist > 1);
-  i = 1;
-  bool seen[nlist];
-  memset (seen, false, nlist * sizeof (seen[0]));
-  while (1)
-    {
-      /* Keep track of which object we looked at this round.  */
-      seen[i] = true;
-      struct link_map *thisp = l_initfini[i];
-
-      /* Find the last object in the list for which the current one is
-	 a dependency and move the current object behind the object
-	 with the dependency.  */
-      unsigned int k = nlist - 1;
-      while (k > i)
+  if (__builtin_expect (nlist > 1, 1))
+    {
+      /* We can skip looking for the binary itself which is at the front
+	 of the search list.  */
+      i = 1;
+      bool seen[nlist];
+      memset (seen, false, nlist * sizeof (seen[0]));
+      while (1)
 	{
-	  struct link_map **runp = l_initfini[k]->l_initfini;
-	  if (runp != NULL)
-	    /* Look through the dependencies of the object.  */
-	    while (*runp != NULL)
-	      if (__builtin_expect (*runp++ == thisp, 0))
-		{
-		  /* Move the current object to the back past the last
-		     object with it as the dependency.  */
-		  memmove (&l_initfini[i], &l_initfini[i + 1],
-			   (k - i) * sizeof (l_initfini[0]));
-		  l_initfini[k] = thisp;
-
-		  if (seen[i + 1])
+	  /* Keep track of which object we looked at this round.  */
+	  seen[i] = true;
+	  struct link_map *thisp = l_initfini[i];
+
+	  /* Find the last object in the list for which the current one is
+	     a dependency and move the current object behind the object
+	     with the dependency.  */
+	  unsigned int k = nlist - 1;
+	  while (k > i)
+	    {
+	      struct link_map **runp = l_initfini[k]->l_initfini;
+	      if (runp != NULL)
+		/* Look through the dependencies of the object.  */
+		while (*runp != NULL)
+		  if (__builtin_expect (*runp++ == thisp, 0))
 		    {
-		      ++i;
-		      goto next_clear;
+		      /* Move the current object to the back past the last
+			 object with it as the dependency.  */
+		      memmove (&l_initfini[i], &l_initfini[i + 1],
+			       (k - i) * sizeof (l_initfini[0]));
+		      l_initfini[k] = thisp;
+
+		      if (seen[i + 1])
+			{
+			  ++i;
+			  goto next_clear;
+			}
+
+		      memmove (&seen[i], &seen[i + 1],
+			       (k - i) * sizeof (seen[0]));
+		      seen[k] = true;
+
+		      goto next;
 		    }
 
-		  memmove (&seen[i], &seen[i + 1], (k - i) * sizeof (seen[0]));
-		  seen[k] = true;
-
-		  goto next;
-		}
-
-	  --k;
+	      --k;
+	    }
+
+	  if (++i == nlist)
+	    break;
+	next_clear:
+	  memset (&seen[i], false, (nlist - i) * sizeof (seen[0]));
+
+	next:;
 	}
-
-      if (++i == nlist)
-	break;
-    next_clear:
-      memset (&seen[i], false, (nlist - i) * sizeof (seen[0]));
-
-    next:;
     }
 
   /* Terminate the list of dependencies.  */

Modified: fsf/glibc-2_13-branch/libc/elf/dl-fini.c
==============================================================================
--- fsf/glibc-2_13-branch/libc/elf/dl-fini.c (original)
+++ fsf/glibc-2_13-branch/libc/elf/dl-fini.c Thu Aug  4 00:07:19 2011
@@ -33,9 +33,12 @@
 _dl_sort_fini (struct link_map *l, struct link_map **maps, size_t nmaps,
 	       char *used, Lmid_t ns)
 {
+  /* A list of one element need not be sorted.  */
+  if (nmaps == 1)
+    return;
+
   /* We can skip looking for the binary itself which is at the front
      of the search list for the main namespace.  */
-  assert (nmaps > 1);
   unsigned int i = ns == LM_ID_BASE;
   bool seen[nmaps];
   memset (seen, false, nmaps * sizeof (seen[0]));
@@ -195,9 +198,8 @@
       assert (ns == LM_ID_BASE || i == nloaded || i == nloaded - 1);
       nmaps = i;
 
-      if (nmaps > 1)
-	/* Now we have to do the sorting.  */
-	_dl_sort_fini (GL(dl_ns)[ns]._ns_loaded, maps, nmaps, NULL, ns);
+      /* Now we have to do the sorting.  */
+      _dl_sort_fini (GL(dl_ns)[ns]._ns_loaded, maps, nmaps, NULL, ns);
 
       /* We do not rely on the linked list of loaded object anymore from
 	 this point on.  We have our own list here (maps).  The various