This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
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
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |