Re: "Elf_RelocateEntry() "gettoken" Unsupported relocation type 28 (0x1c)"

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

 



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

[Index of Archives]     [X Forum]     [Xorg]     [XFree86 Newbie]     [IETF Announce]     [Security]     [Font Config]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux Kernel]

  Powered by Linux