diff -Nur --exclude aaA.d --exclude math.d dgcc/d/phobos/internal/gc/gc.d gcc-4.2.4/gcc/d/phobos/internal/gc/gc.d
--- dgcc/d/phobos/internal/gc/gc.d	2008-03-07 16:55:56.000000000 +0100
+++ gcc-4.2.4/gcc/d/phobos/internal/gc/gc.d	2008-06-25 17:42:38.000000000 +0200
@@ -56,8 +56,11 @@
 
 void addRoot(void *p)		      { _gc.addRoot(p); }
 void removeRoot(void *p)	      { _gc.removeRoot(p); }
-void addRange(void *pbot, void *ptop) { _gc.addRange(pbot, ptop); }
+void addRange(void *pbot, void *ptop, size_t* target = null) {
+  _gc.addRange(pbot, ptop, target);
+}
 void removeRange(void *pbot)	      { _gc.removeRange(pbot); }
+void removeRange(size_t index)        { _gc.removeRange(index); }
 void fullCollect()		      { _gc.fullCollect(); }
 void fullCollectNoStack()	      { _gc.fullCollectNoStack(); }
 void genCollect()		      { _gc.genCollect(); }
diff -Nur --exclude aaA.d --exclude math.d dgcc/d/phobos/internal/gc/gcx.d gcc-4.2.4/gcc/d/phobos/internal/gc/gcx.d
--- dgcc/d/phobos/internal/gc/gcx.d	2008-06-18 19:36:26.000000000 +0200
+++ gcc-4.2.4/gcc/d/phobos/internal/gc/gcx.d	2008-06-25 18:00:39.000000000 +0200
@@ -343,6 +343,7 @@
     //
     //
     //
+    import std.stdio: writefln;
     private void *mallocNoSync(size_t size)
     {
         assert(size != 0);
@@ -353,6 +354,7 @@
 	//debug(PRINTF) printf("GC::malloc(size = %d, gcx = %p)\n", size, gcx);
 	assert(gcx);
 	//debug(PRINTF) printf("gcx.self = %x, pthread_self() = %x\n", gcx.self, pthread_self());
+	//writefln("malloc: pre buckets: ", gcx.bucket);
         size += SENTINEL_EXTRA;
 
         // Compute size bin
@@ -404,6 +406,7 @@
 
             // Return next item from free list
             gcx.bucket[bin] = (cast(List *)p).next;
+            auto test = *gcx.bucket[bin]; // trigger segv early
             cstring.memset(p + size, 0, binsize[bin] - size);
             //debug(PRINTF) printf("\tmalloc => %x\n", p);
             debug (MEMSTOMP) cstring.memset(p, 0xF0, size);
@@ -722,7 +725,8 @@
 	    List *list = cast(List *)p;
 
 	    debug (MEMSTOMP) cstring.memset(p, 0xF2, binsize[bin]);
-
+            
+            if (auto p = gcx.bucket[bin]) auto test = *p; // test
 	    list.next = gcx.bucket[bin];
 	    gcx.bucket[bin] = list;
 	}
@@ -966,7 +970,7 @@
     /**
      * add range to scan for roots
      */
-    void addRange(void *pbot, void *ptop)
+    void addRange(void *pbot, void *ptop, size_t* target = null)
     {
         if (!pbot || !ptop)
         {
@@ -976,11 +980,11 @@
 	//debug(PRINTF) printf("+GC.addRange(pbot = x%x, ptop = x%x)\n", pbot, ptop);
         if (!thread_needLock())
         {
-	    gcx.addRange(pbot, ptop);
+	    gcx.addRange(pbot, ptop, target);
         }
         else synchronized (gcLock)
 	{
-	    gcx.addRange(pbot, ptop);
+	    gcx.addRange(pbot, ptop, target);
 	}
 	//debug(PRINTF) printf("-GC.addRange()\n");
     }
@@ -1006,6 +1010,20 @@
 	}
     }
 
+    /**
+     * remove range with index
+     */
+    void removeRange(size_t index)
+    {
+	if (!thread_needLock())
+	{
+	    gcx.removeRange(index);
+	}
+	else synchronized (gcLock)
+	{
+	    gcx.removeRange(index);
+	}
+    }
 
     /**
      * do full garbage collection
@@ -1211,6 +1229,7 @@
 
 struct Range
 {
+    size_t* target;
     void *pbot;
     void *ptop;
 }
@@ -1417,7 +1436,7 @@
     /**
      *
      */
-    void addRange(void *pbot, void *ptop)
+    void addRange(void *pbot, void *ptop, size_t* target = null)
     {
 	debug(THREADINVARIANT) { debug(PRINTF) printf("Thread %x ", pthread_self()); }
 	debug(PRINTF) printf("%x.Gcx::addRange(%x, %x), nranges = %d\n", this, pbot, ptop, nranges);
@@ -1438,7 +1457,8 @@
 	}
 	ranges[nranges].pbot = pbot;
 	ranges[nranges].ptop = ptop;
-	nranges++;
+	ranges[nranges].target = target;
+	nranges ++;
     }
 
 
@@ -1453,8 +1473,9 @@
 	{
 	    if (ranges[i].pbot == pbot)
 	    {
-		nranges--;
-		cstring.memmove(ranges + i, ranges + i + 1, (nranges - i) * ranges[0].sizeof);
+		/*nranges--;
+		cstring.memmove(ranges + i, ranges + i + 1, (nranges - i) * ranges[0].sizeof);*/
+		removeRange(i);
 		return;
 	    }
 	}
@@ -1466,6 +1487,17 @@
 	//assert(zero);
     }
 
+    void removeRange(size_t index) {
+	if (index !< nranges)
+	    throw new Exception("removeRange: No such index!");
+	if (index < nranges - 1) {
+	    ranges[index] = ranges[nranges - 1];
+	    if (ranges[index].target)
+		*ranges[index].target = index;
+        }
+	nranges--;
+    }
+
 
     /**
      * Find Pool that pointer is in.
diff -Nur --exclude aaA.d --exclude math.d dgcc/d/phobos/std/gc.d gcc-4.2.4/gcc/d/phobos/std/gc.d
--- dgcc/d/phobos/std/gc.d	2007-10-16 21:02:09.000000000 +0200
+++ gcc-4.2.4/gcc/d/phobos/std/gc.d	2008-06-25 17:50:43.000000000 +0200
@@ -52,12 +52,13 @@
 /**
  * Add range to scan for roots.
  */
-void addRange(void *pbot, void *ptop);	// add range to scan for roots
+void addRange(void *pbot, void *ptop, size_t* target = null);
 
 /**
  * Remove range.
  */
 void removeRange(void *pbot);		// remove range
+void removeRange(size_t index);		// remove range by index
 
 /**
  * Mark a gc allocated block of memory as possibly containing pointers.
