fix PIC issues by psm and Kevin F. Quinn http://bugs.gentoo.org/80693 --- grub-0.96/stage2/char_io.c +++ grub-0.96/stage2/char_io.c @@ -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))