diff -aur ruby-1.8.5.orig/Makefile.in ruby-1.8.5/Makefile.in
--- ruby-1.8.5.orig/Makefile.in	2006-08-08 04:37:43.000000000 +0200
+++ ruby-1.8.5/Makefile.in	2006-08-25 16:44:19.273278750 +0200
@@ -33,7 +33,7 @@
 
 empty =
 OUTFLAG = @OUTFLAG@$(empty)
-CFLAGS = @CFLAGS@ @XCFLAGS@ @ARCH_FLAG@
+CFLAGS = @CFLAGS@ @XCFLAGS@ @ARCH_FLAG@ @VALGRIND_CFLAGS@
 CPPFLAGS = -I. -I$(srcdir) @CPPFLAGS@
 LDFLAGS = @STATIC@ $(CFLAGS) @LDFLAGS@
 EXTLDFLAGS = 
diff -aur ruby-1.8.5.orig/configure ruby-1.8.5/configure
--- ruby-1.8.5.orig/configure	2006-08-25 10:34:16.000000000 +0200
+++ ruby-1.8.5/configure	2006-08-25 16:44:19.281279250 +0200
@@ -682,6 +682,9 @@
 MAKEDIRS
 LIBOBJS
 ALLOCA
+PKG_CONFIG
+VALGRIND_CFLAGS
+VALGRIND_LIBS
 DLDFLAGS
 ARCH_FLAG
 STATIC
@@ -747,7 +750,10 @@
 CPPFLAGS
 CPP
 YACC
-YFLAGS'
+YFLAGS
+PKG_CONFIG
+VALGRIND_CFLAGS
+VALGRIND_LIBS'
 
 
 # Initialize some variables set by options.
@@ -794,7 +800,7 @@
 psdir='${docdir}'
 libdir='${exec_prefix}/lib'
 localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
+mandir='${prefix}/man'
 
 ac_prev=
 ac_dashdash=
@@ -1297,7 +1303,7 @@
   --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
   --infodir=DIR          info documentation [DATAROOTDIR/info]
   --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --mandir=DIR           man documentation [PREFIX/man]
   --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
   --htmldir=DIR          html documentation [DOCDIR]
   --dvidir=DIR           dvi documentation [DOCDIR]
@@ -1340,6 +1346,7 @@
   --disable-largefile     omit support for large files
   --enable-pthread        use pthread library.
   --enable-setreuid       use setreuid()/setregid() according to need even if obsolete.
+  --enable-valgrind       use valgrind support.
   --disable-rpath         embed run path into extension libraries.
   --enable-shared         build a shared library for Ruby.
   --enable-install-doc    build and install rdoc indexes during install
@@ -1370,6 +1377,11 @@
   YFLAGS      The list of arguments that will be passed by default to $YACC.
               This script will default YFLAGS to the empty string to avoid a
               default value of `-d' given by some make applications.
+  PKG_CONFIG  path to pkg-config utility
+  VALGRIND_CFLAGS
+              C compiler flags for VALGRIND, overriding pkg-config
+  VALGRIND_LIBS
+              linker flags for VALGRIND, overriding pkg-config
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
@@ -17964,6 +17976,217 @@
     fi
 fi
 
+# Check whether --enable-valgrind was given.
+if test "${enable_valgrind+set}" = set; then
+  enableval=$enable_valgrind; want_valgrind=$enableval
+else
+  want_valgrind=auto
+fi
+
+
+if test x"$want_valgrind" != xno; then
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=0.9.0
+	{ echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
+echo $ECHO_N "checking pkg-config is at least version $_pkg_min_version... $ECHO_C" >&6; }
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	else
+		{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+		PKG_CONFIG=""
+	fi
+
+fi
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for VALGRIND" >&5
+echo $ECHO_N "checking for VALGRIND... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$VALGRIND_CFLAGS"; then
+        pkg_cv_VALGRIND_CFLAGS="$VALGRIND_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"valgrind\"") >&5
+  ($PKG_CONFIG --exists --print-errors "valgrind") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_VALGRIND_CFLAGS=`$PKG_CONFIG --cflags "valgrind" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$VALGRIND_LIBS"; then
+        pkg_cv_VALGRIND_LIBS="$VALGRIND_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"valgrind\"") >&5
+  ($PKG_CONFIG --exists --print-errors "valgrind") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_VALGRIND_LIBS=`$PKG_CONFIG --libs "valgrind" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        VALGRIND_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "valgrind"`
+        else
+	        VALGRIND_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "valgrind"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$VALGRIND_PKG_ERRORS" >&5
+
+	have_valgrind=no
+elif test $pkg_failed = untried; then
+	have_valgrind=no
+else
+	VALGRIND_CFLAGS=$pkg_cv_VALGRIND_CFLAGS
+	VALGRIND_LIBS=$pkg_cv_VALGRIND_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	have_valgrind=yes
+fi
+
+	if test x"$have_valgrind" = xyes; then
+		cat >>confdefs.h <<\_ACEOF
+#define HAVE_VALGRIND 1
+_ACEOF
+
+	elif test x"$want_valgrind" = xyes -a x"$have_valgrind" = xno; then
+		{ { echo "$as_me:$LINENO: error: valgrind support requested but valgrind not found" >&5
+echo "$as_me: error: valgrind support requested but valgrind not found" >&2;}
+   { (exit 1); exit 1; }; }
+	fi
+fi
+
 DEFAULT_KCODE="KCODE_NONE"
 
 
@@ -20080,6 +20303,9 @@
 MAKEDIRS!$MAKEDIRS$ac_delim
 LIBOBJS!$LIBOBJS$ac_delim
 ALLOCA!$ALLOCA$ac_delim
+PKG_CONFIG!$PKG_CONFIG$ac_delim
+VALGRIND_CFLAGS!$VALGRIND_CFLAGS$ac_delim
+VALGRIND_LIBS!$VALGRIND_LIBS$ac_delim
 DLDFLAGS!$DLDFLAGS$ac_delim
 ARCH_FLAG!$ARCH_FLAG$ac_delim
 STATIC!$STATIC$ac_delim
@@ -20089,9 +20315,6 @@
 DLEXT2!$DLEXT2$ac_delim
 LIBEXT!$LIBEXT$ac_delim
 LINK_SO!$LINK_SO$ac_delim
-LIBPATHFLAG!$LIBPATHFLAG$ac_delim
-RPATHFLAG!$RPATHFLAG$ac_delim
-LIBPATHENV!$LIBPATHENV$ac_delim
 _ACEOF
 
   if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
@@ -20133,6 +20356,9 @@
 ac_delim='%!_!# '
 for ac_last_try in false false false false false :; do
   cat >conf$$subs.sed <<_ACEOF
+LIBPATHFLAG!$LIBPATHFLAG$ac_delim
+RPATHFLAG!$RPATHFLAG$ac_delim
+LIBPATHENV!$LIBPATHENV$ac_delim
 TRY_LINK!$TRY_LINK$ac_delim
 STRIP!$STRIP$ac_delim
 EXTSTATIC!$EXTSTATIC$ac_delim
@@ -20178,7 +20404,7 @@
 LTLIBOBJS!$LTLIBOBJS$ac_delim
 _ACEOF
 
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 43; then
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 46; then
     break
   elif $ac_last_try; then
     { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
diff -aur ruby-1.8.5.orig/configure.in ruby-1.8.5/configure.in
--- ruby-1.8.5.orig/configure.in	2006-08-08 04:37:43.000000000 +0200
+++ ruby-1.8.5/configure.in	2006-08-25 16:44:19.281279250 +0200
@@ -832,6 +832,20 @@
     fi
 fi
 
+AC_ARG_ENABLE(valgrind,
+       [  --enable-valgrind       use valgrind support.],
+       [want_valgrind=$enableval], [want_valgrind=auto])
+
+if test x"$want_valgrind" != xno; then
+	PKG_CHECK_MODULES(VALGRIND, valgrind, have_valgrind=yes, have_valgrind=no)
+
+	if test x"$have_valgrind" = xyes; then
+		AC_DEFINE(HAVE_VALGRIND)
+	elif test x"$want_valgrind" = xyes -a x"$have_valgrind" = xno; then
+		AC_MSG_ERROR(valgrind support requested but valgrind not found)
+	fi
+fi
+
 dnl default value for $KANJI
 DEFAULT_KCODE="KCODE_NONE"
 
diff -aur ruby-1.8.5.orig/gc.c ruby-1.8.5/gc.c
--- ruby-1.8.5.orig/gc.c	2006-08-25 10:12:46.000000000 +0200
+++ ruby-1.8.5/gc.c	2006-08-25 16:44:19.285279500 +0200
@@ -30,6 +30,12 @@
 #include <sys/resource.h>
 #endif
 
+#ifdef HAVE_VALGRIND
+#include <memcheck.h>
+#else
+#define VALGRIND_MAKE_MEM_DEFINED(p, n) /* empty */
+#endif
+
 #ifdef __ia64__
 #include <ucontext.h>
 #if defined(__FreeBSD__)
@@ -634,6 +640,9 @@
     register long n;
 {
     VALUE v;
+
+    VALGRIND_MAKE_MEM_DEFINED(x, sizeof(*x) * n);
+
     while (n--) {
         v = *x;
 	if (is_pointer_to_heap((void *)v)) {
@@ -724,7 +733,10 @@
 {
     register RVALUE *obj;
 
+    VALGRIND_MAKE_MEM_DEFINED(&ptr, sizeof(ptr));
     obj = RANY(ptr);
+    VALGRIND_MAKE_MEM_DEFINED(obj, sizeof(*obj));
+
     if (rb_special_const_p(ptr)) return; /* special const not marked */
     if (obj->as.basic.flags == 0) return;       /* free cell */
     if (obj->as.basic.flags & FL_MARK) return;  /* already marked */
