From Gentoo 005_all_grub-0.96-PIC.patch diff -Naur grub-0.97.orig/stage2/char_io.c grub-0.97/stage2/char_io.c --- grub-0.97.orig/stage2/char_io.c 2005-02-01 20:51:23.000000000 +0000 +++ grub-0.97/stage2/char_io.c 2008-10-13 19:01:54.000000000 +0000 @@ -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); @@ -1188,6 +1208,8 @@ asm volatile ("movl $start, %0" : "=a" (ret)); # elif defined(HAVE_USCORE_START_SYMBOL) asm volatile ("movl $_start, %0" : "=a" (ret)); +# else +# error "function would return undefined data in this case" # endif return ret; } @@ -1199,12 +1221,15 @@ asm volatile ("movl $end, %0" : "=a" (ret)); # elif defined(HAVE_USCORE_END_SYMBOL) asm volatile ("movl $_end, %0" : "=a" (ret)); +# else +# error "function would return undefined data in this case" # endif return ret; } if (start_addr () <= addr && end_addr () > addr + len) return ! errnum; +# endif /* __PIC__ */ #endif /* GRUB_UTIL */ if ((addr < RAW_ADDR (0x1000))