diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h index 5ceeaa9..fe64800 100644 --- a/sysdeps/arm/dl-machine.h +++ b/sysdeps/arm/dl-machine.h @@ -413,6 +413,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, break; case R_ARM_ABS32: { + Elf32_Addr reloc_value; # ifndef RTLD_BOOTSTRAP /* This is defined in rtld.c, but nowhere in the static libc.a; make the reference weak so static programs can @@ -431,7 +432,10 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, used while loading those libraries. */ value -= map->l_addr + refsym->st_value; # endif - *reloc_addr += value; + /* Support relocations on mis-aligned offsets. */ + memcpy (&reloc_value, reloc_addr_arg, sizeof (reloc_value)); + reloc_value += value; + memcpy (reloc_addr_arg, &reloc_value, sizeof (reloc_value)); break; } case R_ARM_TLS_DESC: