linker: remove link from external library on unload

When unloading library make sure the soinfo_link to parent
from linked external libraries is removed as well.

Bug: 36104177
Bug: http://b/37433850
Test: manual
Merged-In: I601b54144acecac54744805b38313c46045c54cb
Change-Id: I601b54144acecac54744805b38313c46045c54cb
(cherry picked from commit 6fa537f8cbfc9aa48e322e8080e56a408c158292)
diff --git a/linker/linked_list.h b/linker/linked_list.h
index 8003dbf..0572e63 100644
--- a/linker/linked_list.h
+++ b/linker/linked_list.h
@@ -127,7 +127,13 @@
         } else {
           p->next = next;
         }
+
+        if (tail_ == e) {
+          tail_ = p;
+        }
+
         Allocator::free(e);
+
         e = next;
       } else {
         p = e;
diff --git a/linker/linker.cpp b/linker/linker.cpp
index d3ac1d0..19f5e94 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -1597,6 +1597,9 @@
           if (local_unload_list.contains(child)) {
             continue;
           } else if (child->is_linked() && child->get_local_group_root() != root) {
+            child->get_parents().remove_if([&] (const soinfo* parent) {
+              return parent == si;
+            });
             external_unload_list.push_back(child);
           } else {
             depth_first_list.push_front(child);