--- /dev/null
+--- grub-0.96/stage2/char_io.c.orig 2005-02-18 09:12:39.163407496 +0100
++++ grub-0.96/stage2/char_io.c 2005-02-18 09:13:11.431502000 +0100
+@@ -1202,37 +1202,62 @@
+ }
+ #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);
+
+ auto int start_addr (void)
+ {
+ int ret;
+-# if defined(HAVE_START_SYMBOL)
++# if defined(HAVE_START_SYMBOL)
+ asm volatile ("movl $start, %0" : "=a" (ret));
+-# elif defined(HAVE_USCORE_START_SYMBOL)
++# elif defined(HAVE_USCORE_START_SYMBOL)
+ asm volatile ("movl $_start, %0" : "=a" (ret));
+-# endif
++# else
++ erk! /* function would return undefined data in this case - barf */
++# endif
+ return ret;
+ }
+
+ auto int end_addr (void)
+ {
+ int ret;
+-# if defined(HAVE_END_SYMBOL)
++# if defined(HAVE_END_SYMBOL)
+ asm volatile ("movl $end, %0" : "=a" (ret));
+-# elif defined(HAVE_USCORE_END_SYMBOL)
++# elif defined(HAVE_USCORE_END_SYMBOL)
+ asm volatile ("movl $_end, %0" : "=a" (ret));
+-# endif
++# else
++ erk! /* function would return undefined data in this case - barf */
++# endif
+ return ret;
+ }
+
+ if (start_addr () <= addr && end_addr () > addr + len)
+ return ! errnum;
++# endif /* __PIC__ */
+ #endif /* GRUB_UTIL */
+
+ if ((addr < RAW_ADDR (0x1000))