diff options
-rw-r--r-- | linker/linked_list.h | 6 | ||||
-rw-r--r-- | linker/linker.cpp | 3 |
2 files changed, 9 insertions, 0 deletions
diff --git a/linker/linked_list.h b/linker/linked_list.h index 8003dbf84..0572e635b 100644 --- a/linker/linked_list.h +++ b/linker/linked_list.h @@ -127,7 +127,13 @@ class LinkedList { } 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 d3ac1d000..19f5e94c4 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -1597,6 +1597,9 @@ static void soinfo_unload(soinfo* root) { 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); |