[ARC] PLT content endianess awareness.
authorClaudiu Zissulescu <claziss@synopsys.com>
Tue, 5 Apr 2016 15:23:24 +0000 (17:23 +0200)
committerClaudiu Zissulescu <claziss@synopsys.com>
Tue, 5 Apr 2016 15:24:18 +0000 (17:24 +0200)
bfd/
2016-04-05  Cupertino Miranda  <cmiranda@synopsys.com>

* elf32-arc.c (plt_do_relocs_for_symbol): Changed.
(relocate_plt_for_entry): Likewise.

bfd/ChangeLog
bfd/elf32-arc.c

index d8a4fef029142148a327ffbc823c0af87d545c19..4fd4b4c1314aae1f84bde9a86f005372a6f0ff93 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-05  Cupertino Miranda  <cmiranda@synopsys.com>
+
+       * elf32-arc.c (plt_do_relocs_for_symbol): Changed.
+       (relocate_plt_for_entry): Likewise.
+
 2016-04-05  Cupertino Miranda  <cmiranda@synopsys.com>
 
        * elf32-arc.c (elf_arc_check_relocs): Changed
index 0a4f4807e041ac8b99cfaf7ff0875c295ca9f374..323f65d0bbec6e4c322103b339c148c897c1b882 100644 (file)
@@ -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);
 }