diff -urN binutils-2.22/bfd/elf32-arm.c binutils-2.22.new/bfd/elf32-arm.c --- binutils-2.22/bfd/elf32-arm.c 2011-11-21 10:29:13.000000000 +0100 +++ binutils-2.22.new/bfd/elf32-arm.c 2012-10-14 03:59:52.518670462 +0200 @@ -61,6 +61,9 @@ #define ARM_ELF_ABI_VERSION 0 #define ARM_ELF_OS_ABI_VERSION ELFOSABI_ARM +typedef struct { bfd_vma v; } __attribute__((packed)) unaligned_bfd_vma; +typedef struct { bfd_signed_vma v; } __attribute__((packed)) unaligned_bfd_signed_vma; + static bfd_boolean elf32_arm_write_section (bfd *output_bfd, struct bfd_link_info *link_info, asection *sec, @@ -7851,8 +7854,8 @@ unsigned long r_type = howto->type; unsigned long r_symndx; bfd_byte * hit_data = contents + rel->r_offset; - bfd_vma * local_got_offsets; - bfd_vma * local_tlsdesc_gotents; + unaligned_bfd_vma * local_got_offsets; + unaligned_bfd_vma * local_tlsdesc_gotents; asection * sgot; asection * splt; asection * sreloc = NULL; @@ -7900,8 +7903,8 @@ eh = (struct elf32_arm_link_hash_entry *) h; sgot = globals->root.sgot; - local_got_offsets = elf_local_got_offsets (input_bfd); - local_tlsdesc_gotents = elf32_arm_local_tlsdesc_gotent (input_bfd); + local_got_offsets = (void *)elf_local_got_offsets (input_bfd); + local_tlsdesc_gotents = (void *)elf32_arm_local_tlsdesc_gotent (input_bfd); if (globals->root.dynamic_sections_created) srelgot = globals->root.srelgot; @@ -9041,9 +9044,9 @@ bfd_vma off; BFD_ASSERT (local_got_offsets != NULL && - local_got_offsets[r_symndx] != (bfd_vma) -1); + local_got_offsets[r_symndx].v != (bfd_vma) -1); - off = local_got_offsets[r_symndx]; + off = local_got_offsets[r_symndx].v; /* The offset must always be a multiple of 4. We use the least significant bit to record whether we have already @@ -9070,7 +9073,7 @@ elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel); } - local_got_offsets[r_symndx] |= 1; + local_got_offsets[r_symndx].v |= 1; } value = sgot->output_offset + off; @@ -9168,8 +9171,8 @@ else { BFD_ASSERT (local_got_offsets != NULL); - off = local_got_offsets[r_symndx]; - offplt = local_tlsdesc_gotents[r_symndx]; + off = local_got_offsets[r_symndx].v; + offplt = local_tlsdesc_gotents[r_symndx].v; tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx]; } @@ -9321,7 +9324,7 @@ if (h != NULL) h->got.offset |= 1; else - local_got_offsets[r_symndx] |= 1; + local_got_offsets[r_symndx].v |= 1; } if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32) @@ -13248,11 +13251,11 @@ relocs. */ for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) { - bfd_signed_vma *local_got; - bfd_signed_vma *end_local_got; + unaligned_bfd_signed_vma *local_got; + unaligned_bfd_signed_vma *end_local_got; struct arm_local_iplt_info **local_iplt_ptr, *local_iplt; char *local_tls_type; - bfd_vma *local_tlsdesc_gotent; + unaligned_bfd_vma *local_tlsdesc_gotent; bfd_size_type locsymcount; Elf_Internal_Shdr *symtab_hdr; asection *srel; @@ -13294,7 +13297,7 @@ } } - local_got = elf_local_got_refcounts (ibfd); + local_got = (void *)elf_local_got_refcounts (ibfd); if (!local_got) continue; @@ -13311,7 +13314,7 @@ ++local_got, ++local_iplt_ptr, ++local_tls_type, ++local_tlsdesc_gotent, ++symndx) { - *local_tlsdesc_gotent = (bfd_vma) -1; + local_tlsdesc_gotent->v = (bfd_vma) -1; local_iplt = *local_iplt_ptr; if (local_iplt != NULL) { @@ -13328,7 +13331,7 @@ run-time target. This means that the .got entry would be the same as the .igot.plt entry, so there's no point creating both. */ - *local_got = 0; + local_got->v = 0; } else { @@ -13347,20 +13350,20 @@ elf32_arm_allocate_dynrelocs (info, psrel, p->count); } } - if (*local_got > 0) + if (local_got->v > 0) { Elf_Internal_Sym *isym; - *local_got = s->size; + local_got->v = s->size; if (*local_tls_type & GOT_TLS_GD) /* TLS_GD relocs need an 8-byte structure in the GOT. */ s->size += 8; if (*local_tls_type & GOT_TLS_GDESC) { - *local_tlsdesc_gotent = htab->root.sgotplt->size + local_tlsdesc_gotent->v = htab->root.sgotplt->size - elf32_arm_compute_jump_table_size (htab); htab->root.sgotplt->size += 8; - *local_got = (bfd_vma) -2; + local_got->v = (bfd_vma) -2; /* plt.got_offset needs to know there's a TLS_DESC reloc in the middle of .got.plt. */ htab->num_tls_desc++; @@ -13372,7 +13375,7 @@ { /* If the symbol is both GD and GDESC, *local_got may have been overwritten. */ - *local_got = s->size; + local_got->v = s->size; s->size += 4; } @@ -13398,7 +13401,7 @@ } } else - *local_got = (bfd_vma) -1; + local_got->v = (bfd_vma) -1; } }