diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | elf/dl-deps.c | 85 |
2 files changed, 50 insertions, 41 deletions
diff --git a/ChangeLog b/ChangeLog index 72c932f86e..727c7e513d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-03-02 Andreas Schwab <schwab@redhat.com> + + [BZ #12454] + * elf/dl-deps.c (_dl_map_object_deps): Don't try to sort + dependencies when there are none. + 2011-02-23 Andreas Schwab <schwab@redhat.com> Ulrich Drepper <drepper@gmail.com> diff --git a/elf/dl-deps.c b/elf/dl-deps.c index d3c27f14cc..9e30594838 100644 --- a/elf/dl-deps.c +++ b/elf/dl-deps.c @@ -623,55 +623,58 @@ Filters not supported with LD_TRACE_PRELINKING")); /* 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 (nlist > 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) + 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. */ |