This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
PPC Java fix and better relocation error reporting
- To: libc-alpha at sources dot redhat dot com
- Subject: PPC Java fix and better relocation error reporting
- From: Franz Sirl <Franz dot Sirl-kernel at lauterbach dot com>
- Date: Mon, 1 Jan 2001 21:44:42 +0100
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)