--- XFree86-4.2.1/xc/programs/Xserver/hw/xfree86/loader/elfloader.c Wed Sep 11 13:46:48 2002 +++ XFree86-4.2.1-alpha-gcc3-gprel-fix/xc/programs/Xserver/hw/xfree86/loader/elfloader.c Wed Sep 11 13:46:33 2002 @@ -1121,6 +1121,7 @@ #if defined(__alpha__) unsigned int *dest32h; /* address of the high 32 bit place being modified */ unsigned long *dest64; + unsigned short *dest16; #endif #if defined(__x86_64__) unsigned long *dest64; @@ -1304,6 +1305,33 @@ #ifdef ELFDEBUG ELFDEBUG( "*dest32=%x\n", *dest32 ); #endif + break; + } + case R_ALPHA_GPRELLOW: + { + dest64=(unsigned long *)(secp+rel->r_offset); + dest16=(unsigned short *)dest64; + + symval += rel->r_addend; + symval = ((unsigned char *)symval)-((unsigned char *)elffile->got); + + *dest16=symval; + break; + } + case R_ALPHA_GPRELHIGH: + { + dest64=(unsigned long *)(secp+rel->r_offset); + dest16=(unsigned short *)dest64; + + symval += rel->r_addend; + symval = ((unsigned char *)symval)-((unsigned char *)elffile->got); + symval = ((long)symval >> 16) + ((symval >> 15) & 1); + if( (long)symval > 0x7fff || + (long)symval < -(long)0x8000 ) { + FatalError("R_ALPHA_GPRELHIGH symval-got is too large for %s:%lx\n", + ElfGetSymbolName(elffile,ELF_R_SYM(rel->r_info)),symval); + } + *dest16=symval; break; } case R_ALPHA_LITERAL: