This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

PPC Java fix and better relocation error reporting


Hi,

2 minor patches, the first marks __data_start global for Java use, the 2nd 
makes the error reporting for relocation errors more useful.

Franz.

	* sysdeps/powerpc/elf/start.S (__data_start): Make it global.
	* sysdeps/powerpc/dl-machine.c (dl_reloc_overflow): Print the name of
	the failing symbol.
	(__process_machine_rela): Pass symbol to dl_reloc_overflow().

Index: sysdeps/powerpc/dl-machine.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/dl-machine.c,v
retrieving revision 1.13
diff -u -p -r1.13 dl-machine.c
--- sysdeps/powerpc/dl-machine.c	2000/10/19 08:15:09	1.13
+++ sysdeps/powerpc/dl-machine.c	2001/01/01 20:28:46
@@ -368,13 +368,25 @@ __elf_machine_fixup_plt(struct link_map 
 static void
 dl_reloc_overflow (struct link_map *map,
 		   const char *name,
-		   Elf32_Addr *const reloc_addr)
+		   Elf32_Addr *const reloc_addr,
+		   const Elf32_Sym *sym,
+		   const Elf32_Sym *refsym)
 {
   char buffer[128];
   char *t;
+  const Elf32_Sym *errsym = sym ? sym : refsym;
   t = stpcpy (buffer, name);
   t = stpcpy (t, " relocation at 0x00000000");
   _itoa_word ((unsigned) reloc_addr, t, 16, 0);
+  if (errsym)
+    {
+      const char *strtab;
+
+      strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
+      t = stpcpy (t, " for symbol `");
+      t = stpcpy (t, strtab + errsym->st_name);
+      t = stpcpy (t, "'");
+    }
   t = stpcpy (t, " out of range");
   _dl_signal_error (0, map->l_name, buffer);
 }
@@ -402,14 +414,14 @@ __process_machine_rela (struct link_map 
 
     case R_PPC_ADDR24:
       if (finaladdr > 0x01fffffc && finaladdr < 0xfe000000)
-	dl_reloc_overflow (map,  "R_PPC_ADDR24", reloc_addr);
+	dl_reloc_overflow (map,  "R_PPC_ADDR24", reloc_addr, sym, refsym);
       *reloc_addr = (*reloc_addr & 0xfc000003) | (finaladdr & 0x3fffffc);
       break;
 
     case R_PPC_ADDR16:
     case R_PPC_UADDR16:
       if (finaladdr > 0x7fff && finaladdr < 0x8000)
-	dl_reloc_overflow (map,  "R_PPC_ADDR16", reloc_addr);
+	dl_reloc_overflow (map,  "R_PPC_ADDR16", reloc_addr, sym, refsym);
       *(Elf32_Half*) reloc_addr = finaladdr;
       break;
 
@@ -429,7 +441,7 @@ __process_machine_rela (struct link_map 
     case R_PPC_ADDR14_BRTAKEN:
     case R_PPC_ADDR14_BRNTAKEN:
       if (finaladdr > 0x7fff && finaladdr < 0x8000)
-	dl_reloc_overflow (map,  "R_PPC_ADDR14", reloc_addr);
+	dl_reloc_overflow (map,  "R_PPC_ADDR14", reloc_addr, sym, refsym);
       *reloc_addr = (*reloc_addr & 0xffff0003) | (finaladdr & 0xfffc);
       if (rinfo != R_PPC_ADDR14)
 	*reloc_addr = ((*reloc_addr & 0xffdfffff)
@@ -441,7 +453,7 @@ __process_machine_rela (struct link_map 
       {
 	Elf32_Sword delta = finaladdr - (Elf32_Word) reloc_addr;
 	if (delta << 6 >> 6 != delta)
-	  dl_reloc_overflow (map,  "R_PPC_REL14", reloc_addr);
+	  dl_reloc_overflow (map,  "R_PPC_REL24", reloc_addr, sym, refsym);
 	*reloc_addr = (*reloc_addr & 0xfc000003) | (delta & 0x3fffffc);
       }
       break;
Index: sysdeps/powerpc/elf/start.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/elf/start.S,v
retrieving revision 1.4
diff -u -p -r1.4 start.S
--- sysdeps/powerpc/elf/start.S	2000/07/21 07:43:25	1.4
+++ sysdeps/powerpc/elf/start.S	2001/01/01 20:28:46
@@ -61,5 +61,6 @@ END(_start)
 
 /* Define a symbol for the first piece of initialized data.  */
 	.section ".data"
+	.globl	__data_start
 __data_start:
 weak_alias (__data_start, data_start)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]