* PPC32 dl-machine.c bugs
@ 2002-10-07 0:50 Jakub Jelinek
0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2002-10-07 0:50 UTC (permalink / raw)
To: Glibc hackers, geoffk
Hi!
While looking at ppc64 dl-machine.h and comparing it
with ppc32 dl-machine.[ch], I stopped on the following two issues:
a) from ppc64/dl-machine.h I understand ppc is strict alignment machine,
ie. unaligned stores should be done one byte at a time, right?
b) finaladdr > 0x7fff && finaladdr < 0x8000 where finaladdr is uint32_t
is bogus test (always 0). It should be finaladdr > 0x7fff
&& finaladdr < 0xffff8000 (or (finaladdr + 0x8000) < 0x10000).
And __builtin_expect certainly won't hurt.
2002-10-06 Jakub Jelinek <jakub@redhat.com>
* sysdeps/powerpc/powerpc32/dl-machine.c (__process_machine_rela):
Store R_PPC_UADDR32 and R_PPC_UADDR16 one byte at a time.
Use __builtin_expect for R_PPC_ADDR24 overflow check. Fix
R_PPC_ADDR16, R_PPC_UADDR16 and R_PPC_ADDR14* overflow check, use
__builtin_expect.
--- libc/sysdeps/powerpc/powerpc32/dl-machine.c.jj 2002-09-05 10:24:12.000000000 +0200
+++ libc/sysdeps/powerpc/powerpc32/dl-machine.c 2002-10-06 22:24:41.000000000 +0200
@@ -409,25 +409,37 @@ __process_machine_rela (struct link_map
return;
case R_PPC_ADDR32:
- case R_PPC_UADDR32:
case R_PPC_GLOB_DAT:
case R_PPC_RELATIVE:
*reloc_addr = finaladdr;
return;
+ case R_PPC_UADDR32:
+ ((char *) reloc_addr)[0] = value >> 24;
+ ((char *) reloc_addr)[1] = value >> 16;
+ ((char *) reloc_addr)[2] = value >> 8;
+ ((char *) reloc_addr)[3] = value;
+ break;
+
case R_PPC_ADDR24:
- if (finaladdr > 0x01fffffc && finaladdr < 0xfe000000)
+ if (__builtin_expect (finaladdr > 0x01fffffc && finaladdr < 0xfe000000, 0))
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)
+ if (__builtin_expect (finaladdr > 0x7fff && finaladdr < 0xffff8000, 0))
dl_reloc_overflow (map, "R_PPC_ADDR16", reloc_addr, sym, refsym);
*(Elf32_Half*) reloc_addr = finaladdr;
break;
+ case R_PPC_UADDR16:
+ if (__builtin_expect (finaladdr > 0x7fff && finaladdr < 0xffff8000, 0))
+ dl_reloc_overflow (map, "R_PPC_UADDR16", reloc_addr, sym, refsym);
+ ((char *) reloc_addr)[0] = value >> 8;
+ ((char *) reloc_addr)[1] = value;
+ break;
+
case R_PPC_ADDR16_LO:
*(Elf32_Half*) reloc_addr = finaladdr;
break;
@@ -443,7 +455,7 @@ __process_machine_rela (struct link_map
case R_PPC_ADDR14:
case R_PPC_ADDR14_BRTAKEN:
case R_PPC_ADDR14_BRNTAKEN:
- if (finaladdr > 0x7fff && finaladdr < 0x8000)
+ if (__builtin_expect (finaladdr > 0x7fff && finaladdr < 0xffff8000, 0))
dl_reloc_overflow (map, "R_PPC_ADDR14", reloc_addr, sym, refsym);
*reloc_addr = (*reloc_addr & 0xffff0003) | (finaladdr & 0xfffc);
if (rinfo != R_PPC_ADDR14)
Jakub
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2002-10-06 20:24 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-07 0:50 PPC32 dl-machine.c bugs Jakub Jelinek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).