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

Reply via email to