--- 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,34 +1202,59 @@ } #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__ */ static 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; } static 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))