On Sat, May 20, 2006 at 09:28:15PM -0500, Will L G wrote:
>On startup I immediatedly received the error:

The attached patch should fix the following problem:

>Fatal server error:
>R_ALPHA_GPRELHIGH symval-got is too large for trans:fffffffffe011f6e

Let me know how it works for you.

David
-- 
David Dawes                                     X-Oz Technologies
www.XFree86.org/~dawes                          www.x-oz.com
Index: elfloader.c
===================================================================
RCS file: /home/x-cvs/xc/programs/Xserver/hw/xfree86/loader/elfloader.c,v
retrieving revision 1.72
diff -u -r1.72 elfloader.c
--- elfloader.c 6 Jun 2006 01:20:43 -0000       1.72
+++ elfloader.c 27 Jun 2006 18:31:26 -0000
@@ -1959,11 +1959,12 @@
 
     case R_ALPHA_GPRELHIGH:
        {
+           int nonfatal = 0;
            dest64 = (unsigned long *)(secp + rel->r_offset);
            dest16 = (unsigned short *)dest64;
 
 #if LOADERDEBUG
-           LoaderDebugMsg(LOADER_DEBUG_LOWLEVEL, "R_ALPHA_GPRELLOW %s\t",
+           LoaderDebugMsg(LOADER_DEBUG_LOWLEVEL, "R_ALPHA_GPRELHIGH %s\t",
                     ElfGetSymbolName(elffile, ELF_R_SYM(rel->r_info)));
            LoaderDebugMsg(LOADER_DEBUG_LOWLEVEL, "secp=%p\t", secp);
            LoaderDebugMsg(LOADER_DEBUG_LOWLEVEL, "symval=%lx\t", symval);
@@ -1976,6 +1977,11 @@
 #if LOADERDEBUG
            LoaderDebugMsg(LOADER_DEBUG_LOWLEVEL, "symval=%lx\t", symval);
 #endif
+           /*
+            * R_ALPHA_GPRELHIGH relocations to LoaderDefaultFunc should be
+            * temporary, so ignore out of range problems with them.
+            */
+           nonfatal = (symval == (Elf_Addr) &LoaderDefaultFunc);
            symval = ((unsigned char *)symval) -
                    ((unsigned char *)elffile->got);
 #if LOADERDEBUG
@@ -1983,10 +1989,22 @@
 #endif
            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 
(%ld)\n",
-                        ElfGetSymbolName(elffile, ELF_R_SYM(rel->r_info)),
-                        symval, symval);
+               if (nonfatal) {
+#if LOADERDEBUG
+                   LoaderDebugMsg(LOADER_DEBUG_LOWLEVEL,
+                                  "R_ALPHA_GPRELHIGH symval-got is too large "
+                                  "for %s:%lx (%ld)\n", 
+                                  ElfGetSymbolName(elffile,
+                                                   ELF_R_SYM(rel->r_info)),
+                                  symval, symval);
+#endif
+               } else {
+                   FatalError("R_ALPHA_GPRELHIGH symval-got is too large "
+                              "for %s:%lx (%ld)\n",
+                              ElfGetSymbolName(elffile,
+                                               ELF_R_SYM(rel->r_info)),
+                              symval, symval);
+               }
            }
 
 #if LOADERDEBUG

Reply via email to