about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
authorCarlos O'Donell <carlos@redhat.com>2013-05-09 17:37:15 -0400
committerCarlos O'Donell <carlos@redhat.com>2013-05-09 17:37:15 -0400
commit36129722342bed6b3f3729b922c2e513c404ba61 (patch)
tree1d52dd2e1db45127f76c541597e6199b41a88271 /elf
parented41ffefc3f947f14d565ea8d239ff2d31f6a7fe (diff)
downloadglibc-36129722342bed6b3f3729b922c2e513c404ba61.tar.gz
glibc-36129722342bed6b3f3729b922c2e513c404ba61.tar.xz
glibc-36129722342bed6b3f3729b922c2e513c404ba61.zip
Add more comments to dlclose() algorithm.
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.
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-close.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/elf/dl-close.c b/elf/dl-close.c
index c86f609402..fe3014cca3 100644
--- a/elf/dl-close.c
+++ b/elf/dl-close.c
@@ -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;
 		    }