Add more comments to dlclose() algorithm.
authorCarlos O'Donell <carlos@redhat.com>
Thu, 9 May 2013 21:37:15 +0000 (17:37 -0400)
committerCarlos O'Donell <carlos@redhat.com>
Thu, 9 May 2013 21:37:15 +0000 (17:37 -0400)
The algorithm for scanning dependencies upon dlclose is
less than immediately obvious. This patch adds two bits
of comments that explain why you start the dependency
search at l_initfini[1], and why you need to restart
the search.

---

2013-05-09  Carlos O'Donell  <carlos@redhat.com>

* elf/dl-close.c (_dl_close_worker): Add comments.

ChangeLog
elf/dl-close.c

index 619ce64..d9c38d2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-05-09  Carlos O'Donell  <carlos@redhat.com>
+
+       * elf/dl-close.c (_dl_close_worker): Add comments.
+
 2013-05-09  Joseph Myers  <joseph@codesourcery.com>
 
        [BZ #15359]
index c86f609..fe3014c 100644 (file)
@@ -183,6 +183,8 @@ _dl_close_worker (struct link_map *map)
       /* Mark all dependencies as used.  */
       if (l->l_initfini != NULL)
        {
+         /* We are always the zeroth entry, and since we don't include
+            ourselves in the dependency analysis start at 1.  */
          struct link_map **lp = &l->l_initfini[1];
          while (*lp != NULL)
            {
@@ -193,6 +195,10 @@ _dl_close_worker (struct link_map *map)
                  if (!used[(*lp)->l_idx])
                    {
                      used[(*lp)->l_idx] = 1;
+                     /* If we marked a new object as used, and we've
+                        already processed it, then we need to go back
+                        and process again from that point forward to
+                        ensure we keep all of its dependencies also.  */
                      if ((*lp)->l_idx - 1 < done_index)
                        done_index = (*lp)->l_idx - 1;
                    }