]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Handle DSOs without any dependency in ld.so release/2.13/master
authorUlrich Drepper <drepper@gmail.com>
Mon, 30 May 2011 16:31:25 +0000 (12:31 -0400)
committerCarlos O'Donell <carlos@codesourcery.com>
Wed, 20 Jul 2011 20:46:15 +0000 (16:46 -0400)
(cherry picked from commit 6b1e7d1992cd89032df431c0e0d1418b97e57cd8)

ChangeLog
NEWS
elf/dl-deps.c
elf/dl-fini.c

index 9d3222a92b73c63d9aa5aceee032503b82ee2179..c2f5a1835d12b46555a9f62f4cc45c9920853ceb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2011-05-30  Ulrich Drepper  <drepper@gmail.com>
+
+       [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@gentoo.org>
 
        [BZ #12653]
diff --git a/NEWS b/NEWS
index 7a723e4146ab864cef185bea608164aca14d2df0..91facbec12f4cb1a5d30e04260ba4e77aae3d5c5 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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 @@ Version 2.13
   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
 
index 440fb563da00ebee7d922df034800522de170703..f47f43d48fece3ae34da6792d2c82e344804ffc6 100644 (file)
@@ -613,61 +613,64 @@ Filters not supported with LD_TRACE_PRELINKING"));
        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)
+  if (__builtin_expect (nlist > 1, 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)
+      /* 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;
+             --k;
+           }
 
-                 goto next;
-               }
+         if (++i == nlist)
+           break;
+       next_clear:
+         memset (&seen[i], false, (nlist - i) * sizeof (seen[0]));
 
-         --k;
+       next:;
        }
-
-      if (++i == nlist)
-       break;
-    next_clear:
-      memset (&seen[i], false, (nlist - i) * sizeof (seen[0]));
-
-    next:;
     }
 
   /* Terminate the list of dependencies.  */
index ba6c62a55d8fa1fbf3bd0415d6184190ec5148e3..269bcece4c39c229c6770d76e935e53ad09a5ef4 100644 (file)
@@ -33,9 +33,12 @@ internal_function
 _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 @@ _dl_fini (void)
       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