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: