Preserve link time dependencies over relocation dependencies
authorAndreas Schwab <schwab@redhat.com>
Wed, 19 Oct 2011 15:13:56 +0000 (17:13 +0200)
committerAndreas Schwab <schwab@redhat.com>
Thu, 20 Oct 2011 10:03:14 +0000 (12:03 +0200)
ChangeLog
NEWS
elf/dl-fini.c

index ba2ff4c..c076b36 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-10-20  Andreas Schwab  <schwab@redhat.com>
+
+       [BZ #12892]
+       * elf/dl-fini.c (_dl_sort_fini): Ignore relocation dependency if
+       it would create a cycle with a link time dependency.
+
 2011-10-19  Ulrich Drepper  <drepper@gmail.com>
 
        * sysdeps/x86_64/multiarch/rawmemchr.S: Small optimization to safe an
diff --git a/NEWS b/NEWS
index a4b59f1..5e55ade 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-GNU C Library NEWS -- history of user-visible changes.  2011-10-19
+GNU C Library NEWS -- history of user-visible changes.  2011-10-20
 Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc.
 See the end for copying conditions.
 
@@ -9,9 +9,9 @@ Version 2.15
 
 * The following bugs are resolved with this release:
 
-  6779, 6783, 9696, 11589, 12403, 12847, 12868, 12852, 12874, 12885, 12907,
-  12922, 12935, 13007, 13021, 13067, 13068, 13090, 13092, 13114, 13118,
-  13123, 13134, 13138, 13150, 13179, 13192, 13268, 13291
+  6779, 6783, 9696, 11589, 12403, 12847, 12868, 12852, 12874, 12885, 12892,
+  12907, 12922, 12935, 13007, 13021, 13067, 13068, 13090, 13092, 13114,
+  13118, 13123, 13134, 13138, 13150, 13179, 13192, 13268, 13291
 
 * New program pldd to list loaded object of a process
   Implemented by Ulrich Drepper.
index bafc83a..6df80ef 100644 (file)
@@ -100,7 +100,17 @@ _dl_sort_fini (struct link_map **maps, size_t nmaps, char *used, Lmid_t ns)
              /* Look through the relocation dependencies of the object.  */
              while (m-- > 0)
                if (__builtin_expect (relmaps[m] == thisp, 0))
-                 goto move;
+                 {
+                   /* If a cycle exists with a link time dependency,
+                      preserve the latter.  */
+                   struct link_map **runp = thisp->l_initfini;
+                   if (runp != NULL)
+                     while (*runp != NULL)
+                       if (__builtin_expect (*runp++ == maps[k], 0))
+                         goto ignore;
+                   goto move;
+                 }
+           ignore:;
            }
 
          --k;