[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#178496: xserver-xfree86: [core server] module loading broken on Alpha due to GCC 3.2's new relocation type



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 to: