Hi, here's a patch, extracted from upstream. I've tested it, it works fine.
-- Falk
--- xc/programs/Xserver/hw/xfree86/loader/elfloader.c.orig 2003-01-26 19:08:31.000000000 +0100 +++ xc/programs/Xserver/hw/xfree86/loader/elfloader.c 2003-01-26 19:08:35.000000000 +0100 @@ -1116,6 +1116,7 @@ int force; #if defined(__alpha__) unsigned int *dest32h; /* address of the high 32 bit place being modified */ unsigned long *dest64; + unsigned short *dest16; #endif #if defined(__ia64__) unsigned long *dest64; @@ -1379,6 +1380,51 @@ int force; ELFDEBUG( "*dest32=%8.8x\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_GPREL16: + { + dest64=(unsigned long *)(secp+rel->r_offset); + dest16=(unsigned short *)dest64; + + symval += rel->r_addend; + symval = ((unsigned char *)symval)-((unsigned char *)elffile->got); + if( (long)symval > 0x7fff || + (long)symval < -(long)0x8000 ) { + FatalError("R_ALPHA_GPREL16 symval-got is too large for %s:%lx\n", + ElfGetSymbolName(elffile,ELF_R_SYM(rel->r_info)),symval); + } + + *dest16=symval; + break; + } #endif /* alpha */ #if defined(__mc68000__) --- xc/programs/Xserver/hw/xfree86/loader/elf.h.orig 2002-01-14 19:16:52.000000000 +0100 +++ xc/programs/Xserver/hw/xfree86/loader/elf.h 2003-01-26 18:45:04.000000000 +0100 @@ -245,7 +245,7 @@ #define R_ALPHA_GPVALUE 16 #define R_ALPHA_GPRELHIGH 17 #define R_ALPHA_GPRELLOW 18 -#define R_ALPHA_IMMED_GP_16 19 +#define R_ALPHA_GPREL16 19 #define R_ALPHA_IMMED_GP_HI32 20 #define R_ALPHA_IMMED_SCN_HI32 21 #define R_ALPHA_IMMED_BR_HI32 22