diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d8a4fef029..4fd4b4c131 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2016-04-05 Cupertino Miranda + + * elf32-arc.c (plt_do_relocs_for_symbol): Changed. + (relocate_plt_for_entry): Likewise. + 2016-04-05 Cupertino Miranda * elf32-arc.c (elf_arc_check_relocs): Changed diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c index 0a4f4807e0..323f65d0bb 100644 --- a/bfd/elf32-arc.c +++ b/bfd/elf32-arc.c @@ -1960,7 +1960,7 @@ plt_do_relocs_for_symbol (bfd *abfd, /* TODO: being ME is not a property of the relocation but of the section of which is applying the relocation. */ - if (IS_MIDDLE_ENDIAN (reloc->symbol) || bfd_big_endian (abfd)) + if (IS_MIDDLE_ENDIAN (reloc->symbol) && !bfd_big_endian (abfd)) { relocation = ((relocation & 0xffff0000) >> 16) | @@ -2004,9 +2004,19 @@ GOT_ENTRY_OFFSET = 0x%x, GOT_ENTRY_VMA = 0x%x, for symbol %s\n", + got_offset, h->root.root.string); - memcpy (htab->splt->contents + h->plt.offset, - plt_data->elem, - plt_data->elem_size); + + { + bfd_vma i = 0; + uint16_t *ptr = (uint16_t *) plt_data->elem; + for (i = 0; i < plt_data->elem_size/2; i++) + { + uint16_t data = ptr[i]; + bfd_put_16 (output_bfd, + (bfd_vma) data, + htab->splt->contents + h->plt.offset + (i*2)); + } + } + plt_do_relocs_for_symbol (output_bfd, htab, plt_data->elem_relocs, h->plt.offset, @@ -2044,8 +2054,17 @@ relocate_plt_for_entry (bfd *abfd, struct plt_version_t *plt_data = arc_get_plt_version (info); struct elf_link_hash_table *htab = elf_hash_table (info); - memcpy (htab->splt->contents, plt_data->entry, - plt_data->entry_size); + { + bfd_vma i = 0; + uint16_t *ptr = (uint16_t *) plt_data->entry; + for (i = 0; i < plt_data->entry_size/2; i++) + { + uint16_t data = ptr[i]; + bfd_put_16 (abfd, + (bfd_vma) data, + htab->splt->contents + (i*2)); + } + } PLT_DO_RELOCS_FOR_ENTRY (abfd, htab, plt_data->entry_relocs); }