diff -ur grub-0.97-orig/stage2/char_io.c grub-0.97/stage2/char_io.c
--- grub-0.97-orig/stage2/char_io.c	2005-05-08 20:29:59.000000000 -0600
+++ grub-0.97/stage2/char_io.c	2005-05-08 20:37:11.000000000 -0600
@@ -1174,10 +1174,30 @@
 }
 #endif /* ! STAGE1_5 */
 
+#ifdef GRUB_UTIL
+# ifdef __PIC__
+#  if defined(HAVE_START_SYMBOL) && defined(HAVE_END_SYMBOL)
+      extern char start[];
+      extern char end[];
+#  elif defined(HAVE_USCORE_START_SYMBOL) && defined (HAVE_USCORE_END_SYMBOL)
+      extern char _start[];
+      extern char _end[];
+#  endif
+# endif
+#endif
 int
 memcheck (int addr, int len)
 {
 #ifdef GRUB_UTIL
+# ifdef __PIC__
+#  if defined(HAVE_START_SYMBOL) && defined(HAVE_END_SYMBOL)
+  if (start <= addr && end > addr + len)
+    return ! errnum;
+#  elif defined(HAVE_USCORE_START_SYMBOL) && defined (HAVE_USCORE_END_SYMBOL)
+  if (_start <= addr && _end > addr + len)
+    return ! errnum;
+#  endif
+# else /* __PIC__ */
   auto int start_addr (void);
   auto int end_addr (void);
   
@@ -1189,7 +1209,7 @@
 # elif defined(HAVE_USCORE_START_SYMBOL)
       asm volatile ("movl	$_start, %0" : "=a" (ret));
 # endif
-      return ret;
+		return ret;
     }
 
   auto int end_addr (void)
@@ -1205,6 +1225,7 @@
 
   if (start_addr () <= addr && end_addr () > addr + len)
     return ! errnum;
+# endif /* __PIC__ */
 #endif /* GRUB_UTIL */
 
   if ((addr < RAW_ADDR (0x1000))
