Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 29 Sep 2000 06:52:39 +0000 (06:52 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 29 Sep 2000 06:52:39 +0000 (06:52 +0000)
2000-09-28  Ulrich Drepper  <drepper@redhat.com>

* sysdeps/alpha/dl-machine.h (elf_machine_rela): Handle unaligned
relocation also for R_ALPHA_RELATIVE.
Reported by Ivan Kokshaysky <ink@jurassic.park.msu.ru>.

ChangeLog
sysdeps/alpha/dl-machine.h

index b341887..77f9f6b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2000-09-28  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/alpha/dl-machine.h (elf_machine_rela): Handle unaligned
+       relocation also for R_ALPHA_RELATIVE.
+       Reported by Ivan Kokshaysky <ink@jurassic.park.msu.ru>.
+
 2000-09-18  Bruno Haible  <haible@clisp.cons.org>
 
        * intl/dcigettext.c: Outside libc, use local variable names that don't
index 33c32fa..69845b4 100644 (file)
@@ -482,7 +482,19 @@ elf_machine_rela (struct link_map *map,
       /* Already done in dynamic linker.  */
       if (map != &_dl_rtld_map)
 #endif
-       *reloc_addr += map->l_addr;
+       {
+         /* XXX Make some timings.  Maybe it's preverable to test for
+            unaligned access and only do it the complex way if necessary.  */
+         void *reloc_addr_1 = reloc_addr;
+         Elf64_Addr reloc_addr_val;
+
+         /* Load value without causing unaligned trap. */
+         memcpy (&reloc_addr_val, reloc_addr_1, 8);
+         reloc_addr_val += map->l_addr;
+
+         /* Store value without causing unaligned trap. */
+         memcpy (reloc_addr_1, &reloc_addr_val, 8);
+       }
     }
   else if (r_type == R_ALPHA_NONE)
     return;