Index: git/ldso/libdl/libdl.c
===================================================================
--- git.orig/ldso/libdl/libdl.c	2012-01-15 01:25:04.151631360 -0800
+++ git/ldso/libdl/libdl.c	2012-01-15 01:29:55.515645461 -0800
@@ -748,14 +748,15 @@
 	struct dyn_elf *handle;
 	unsigned int end;
 	unsigned int i, j;
-	struct r_scope_elem *ls;
+	struct r_scope_elem *ls, *stored_ls;
 #if defined(USE_TLS) && USE_TLS
 	bool any_tls = false;
 	size_t tls_free_start = NO_TLS_OFFSET;
 	size_t tls_free_end = NO_TLS_OFFSET;
 	struct link_map *tls_lmap;
 #endif
-
+    struct elf_resolve **symbol_scope_to_be_removed = NULL;
+	int unlink_local_scope = 0;
 	handle = (struct dyn_elf *) vhandle;
 	if (handle == _dl_symbol_tables)
 		return 0;
@@ -937,15 +938,16 @@
 					}
 				}
 			}
-
 			if (handle->dyn == tpnt) {
 				/* Unlink the local scope from global one */
 				for (ls = &_dl_loaded_modules->symbol_scope; ls; ls = ls->next)
 					if (ls->next->r_list[0] == tpnt) {
 						_dl_if_debug_print("removing symbol_scope: %s\n", tpnt->libname);
+						unlink_local_scope = 1;
+						symbol_scope_to_be_removed = tpnt->symbol_scope.r_list;
+						stored_ls = ls;
 						break;
 					}
-				ls->next = ls->next->next;
 			}
 
 			/* Next, remove tpnt from the global symbol table list */
@@ -969,10 +971,14 @@
 				}
 			}
 			free(tpnt->libname);
-			free(tpnt->symbol_scope.r_list);
 			free(tpnt);
 		}
 	}
+		if (unlink_local_scope) {
+			stored_ls->next = stored_ls->next->next;
+			free(symbol_scope_to_be_removed);
+		    unlink_local_scope = 0;
+		}
 	for (rpnt1 = handle->next; rpnt1; rpnt1 = rpnt1_tmp) {
 		rpnt1_tmp = rpnt1->next;
 		free(rpnt1);
