summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@redhat.com>2011-10-19 17:13:56 +0200
committerAndreas Schwab <schwab@redhat.com>2011-10-20 12:03:14 +0200
commitd45c60c2feb38d95e7ad95af6edb39a6d5afba81 (patch)
tree65fa122aaf903fb10cf2d0dd9e9faea98a5adafc
parent855d156018a701b3613eb4b14ab3bd09fd12f0a3 (diff)
Preserve link time dependencies over relocation dependencies
-rw-r--r--ChangeLog6
-rw-r--r--NEWS8
-rw-r--r--elf/dl-fini.c12
3 files changed, 21 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index ba2ff4c343..c076b3669a 100644
--- 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 a4b59f1ee1..5e55ade5b6 100644
--- 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.
diff --git a/elf/dl-fini.c b/elf/dl-fini.c
index bafc83a92f..6df80ef78e 100644
--- a/elf/dl-fini.c
+++ b/elf/dl-fini.c
@@ -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;