From d45c60c2feb38d95e7ad95af6edb39a6d5afba81 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Wed, 19 Oct 2011 17:13:56 +0200 Subject: Preserve link time dependencies over relocation dependencies --- ChangeLog | 6 ++++++ NEWS | 8 ++++---- elf/dl-fini.c | 12 +++++++++++- 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 + + [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 * 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; -- cgit 1.4.1