diff options
Diffstat (limited to 'sysdeps/powerpc/powerpc32/dl-machine.c')
-rw-r--r-- | sysdeps/powerpc/powerpc32/dl-machine.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/sysdeps/powerpc/powerpc32/dl-machine.c b/sysdeps/powerpc/powerpc32/dl-machine.c index 188f72cdb7..aba3618561 100644 --- a/sysdeps/powerpc/powerpc32/dl-machine.c +++ b/sysdeps/powerpc/powerpc32/dl-machine.c @@ -29,13 +29,6 @@ by _dl_sysdep_start via DL_PLATFORM_INIT. */ extern int __cache_line_size attribute_hidden; -/* Because ld.so is now versioned, these functions can be in their own file; - no relocations need to be done to call them. - Of course, if ld.so is not versioned... */ -#if defined SHARED && !(DO_VERSIONING - 0) -#error This will not work with versioning turned off, sorry. -#endif - /* Stuff for the PLT. */ #define PLT_INITIAL_ENTRY_WORDS 18 @@ -423,6 +416,12 @@ __process_machine_rela (struct link_map *map, Elf32_Addr const finaladdr, int rinfo) { + union unaligned + { + uint16_t u2; + uint32_t u4; + } __attribute__((__packed__)); + switch (rinfo) { case R_PPC_NONE: @@ -439,10 +438,7 @@ __process_machine_rela (struct link_map *map, return; case R_PPC_UADDR32: - ((char *) reloc_addr)[0] = finaladdr >> 24; - ((char *) reloc_addr)[1] = finaladdr >> 16; - ((char *) reloc_addr)[2] = finaladdr >> 8; - ((char *) reloc_addr)[3] = finaladdr; + ((union unaligned *) reloc_addr)->u4 = finaladdr; break; case R_PPC_ADDR24: @@ -460,8 +456,7 @@ __process_machine_rela (struct link_map *map, case R_PPC_UADDR16: if (__builtin_expect (finaladdr > 0x7fff && finaladdr < 0xffff8000, 0)) _dl_reloc_overflow (map, "R_PPC_UADDR16", reloc_addr, refsym); - ((char *) reloc_addr)[0] = finaladdr >> 8; - ((char *) reloc_addr)[1] = finaladdr; + ((union unaligned *) reloc_addr)->u2 = finaladdr; break; case R_PPC_ADDR16_LO: |