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))