Module Name:    src
Committed By:   matt
Date:           Sat Apr  5 07:19:34 UTC 2014

Modified Files:
        src/gnu/dist/binutils/bfd [matt-nb5-mips64]: elf32-arm.c

Log Message:
When writing BE8 executables, make the PLTs are written as little endian.


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.1 -r1.1.1.1.32.1 src/gnu/dist/binutils/bfd/elf32-arm.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/gnu/dist/binutils/bfd/elf32-arm.c
diff -u src/gnu/dist/binutils/bfd/elf32-arm.c:1.1.1.1 src/gnu/dist/binutils/bfd/elf32-arm.c:1.1.1.1.32.1
--- src/gnu/dist/binutils/bfd/elf32-arm.c:1.1.1.1	Thu Feb  2 20:45:20 2006
+++ src/gnu/dist/binutils/bfd/elf32-arm.c	Sat Apr  5 07:19:34 2014
@@ -2012,6 +2012,35 @@ insert_thumb_branch (insn32 br_insn, int
   return br_insn;
 }
 
+
+/* Store an Arm insn into an output section not processed by
+   elf32_arm_write_section.  */
+
+static void
+put_arm_insn(struct elf32_arm_link_hash_table *htab,
+	     bfd * output_bfd, bfd_vma val, void * ptr)
+{
+    if (htab->byteswap_code != bfd_little_endian (output_bfd))
+      bfd_putl32(val, ptr);
+    else
+      bfd_putb32(val, ptr);
+}
+
+
+/* Store a 16-bit Thumb insn into an output section not processed by
+   elf32_arm_write_section.  */
+
+static void
+put_thumb_insn(struct elf32_arm_link_hash_table *htab,
+	       bfd * output_bfd, bfd_vma val, void * ptr)
+{
+    if (htab->byteswap_code != bfd_little_endian (output_bfd))
+      bfd_putl16(val, ptr);
+    else
+      bfd_putb16(val, ptr);
+}
+
+
 /* Thumb code calling an ARM function.  */
 
 static int
@@ -2068,11 +2097,11 @@ elf32_thumb_to_arm_stub (struct bfd_link
       --my_offset;
       myh->root.u.def.value = my_offset;
 
-      bfd_put_16 (output_bfd, (bfd_vma) t2a1_bx_pc_insn,
-		  s->contents + my_offset);
+      put_thumb_insn (globals, output_bfd, (bfd_vma) t2a1_bx_pc_insn,
+		      s->contents + my_offset);
 
-      bfd_put_16 (output_bfd, (bfd_vma) t2a2_noop_insn,
-		  s->contents + my_offset + 2);
+      put_thumb_insn (globals, output_bfd, (bfd_vma) t2a2_noop_insn,
+		      s->contents + my_offset + 2);
 
       ret_offset =
 	/* Address of destination of the stub.  */
@@ -2090,9 +2119,9 @@ elf32_thumb_to_arm_stub (struct bfd_link
 	   /* ARM branches work from the pc of the instruction + 8.  */
 	   + 8);
 
-      bfd_put_32 (output_bfd,
-		  (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
-		  s->contents + my_offset + 4);
+      put_arm_insn (globals, output_bfd,
+		    (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
+		    s->contents + my_offset + 4);
     }
 
   BFD_ASSERT (my_offset <= globals->thumb_glue_size);
@@ -2171,11 +2200,11 @@ elf32_arm_to_thumb_stub (struct bfd_link
       --my_offset;
       myh->root.u.def.value = my_offset;
 
-      bfd_put_32 (output_bfd, (bfd_vma) a2t1_ldr_insn,
-		  s->contents + my_offset);
+      put_arm_insn (globals, output_bfd, (bfd_vma) a2t1_ldr_insn,
+		    s->contents + my_offset);
 
-      bfd_put_32 (output_bfd, (bfd_vma) a2t2_bx_r12_insn,
-		  s->contents + my_offset + 4);
+      put_arm_insn (globals, output_bfd, (bfd_vma) a2t2_bx_r12_insn,
+		    s->contents + my_offset + 4);
 
       /* It's a thumb address.  Add the low order bit.  */
       bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
@@ -4959,16 +4988,17 @@ elf32_arm_finish_dynamic_symbol (bfd * o
       /* Fill in the entry in the procedure linkage table.  */
       if (htab->symbian_p)
 	{
-	  unsigned i;
-	  for (i = 0; i < htab->plt_entry_size / 4; ++i)
-	    bfd_put_32 (output_bfd, 
-			elf32_arm_symbian_plt_entry[i],
-			splt->contents + h->plt.offset + 4 * i);
+	  put_arm_insn (htab, output_bfd, 
+		        elf32_arm_symbian_plt_entry[0],
+		        splt->contents + h->plt.offset);
+	  put_arm_insn (htab, output_bfd, 
+		        elf32_arm_symbian_plt_entry[1],
+		        splt->contents + h->plt.offset + 4);
 	  
 	  /* Fill in the entry in the .rel.plt section.  */
 	  rel.r_offset = (splt->output_section->vma
 			  + splt->output_offset
-			  + h->plt.offset + 4 * (i - 1));
+			  + h->plt.offset + 4);
 	  rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
 
 	  /* Get the index in the procedure linkage table which
@@ -5014,20 +5044,23 @@ elf32_arm_finish_dynamic_symbol (bfd * o
 
 	  if (eh->plt_thumb_refcount > 0)
 	    {
-	      bfd_put_16 (output_bfd, elf32_arm_plt_thumb_stub[0],
-			  splt->contents + h->plt.offset - 4);
-	      bfd_put_16 (output_bfd, elf32_arm_plt_thumb_stub[1],
-			  splt->contents + h->plt.offset - 2);
+	      put_thumb_insn (htab, output_bfd, elf32_arm_plt_thumb_stub[0],
+			      splt->contents + h->plt.offset - 4);
+	      put_thumb_insn (htab, output_bfd, elf32_arm_plt_thumb_stub[1],
+			      splt->contents + h->plt.offset - 2);
 	    }
 
-	  bfd_put_32 (output_bfd, elf32_arm_plt_entry[0] | ((got_displacement & 0x0ff00000) >> 20),
-		      splt->contents + h->plt.offset + 0);
-	  bfd_put_32 (output_bfd, elf32_arm_plt_entry[1] | ((got_displacement & 0x000ff000) >> 12),
-		      splt->contents + h->plt.offset + 4);
-	  bfd_put_32 (output_bfd, elf32_arm_plt_entry[2] | (got_displacement & 0x00000fff),
-		      splt->contents + h->plt.offset + 8);
+	  put_arm_insn (htab, output_bfd,
+			elf32_arm_plt_entry[0] | ((got_displacement & 0x0ff00000) >> 20),
+			splt->contents + h->plt.offset + 0);
+	  put_arm_insn (htab, output_bfd,
+			elf32_arm_plt_entry[1] | ((got_displacement & 0x000ff000) >> 12),
+			splt->contents + h->plt.offset + 4);
+	  put_arm_insn (htab, output_bfd,
+			elf32_arm_plt_entry[2] | (got_displacement & 0x00000fff),
+			splt->contents + h->plt.offset + 8);
 #ifdef FOUR_WORD_PLT
-	  bfd_put_32 (output_bfd, elf32_arm_plt_entry[3],
+	  put_arm_insn (htab, output_bfd, elf32_arm_plt_entry[3],
 		      splt->contents + h->plt.offset + 12);
 #endif
 
@@ -5317,10 +5350,14 @@ elf32_arm_finish_dynamic_sections (bfd *
 			      - splt->output_offset
 			      - 16);
 
-	  bfd_put_32 (output_bfd, elf32_arm_plt0_entry[0], splt->contents +  0);
-	  bfd_put_32 (output_bfd, elf32_arm_plt0_entry[1], splt->contents +  4);
-	  bfd_put_32 (output_bfd, elf32_arm_plt0_entry[2], splt->contents +  8);
-	  bfd_put_32 (output_bfd, elf32_arm_plt0_entry[3], splt->contents + 12);
+	  put_arm_insn (htab, output_bfd, elf32_arm_plt0_entry[0],
+			splt->contents +  0);
+	  put_arm_insn (htab, output_bfd, elf32_arm_plt0_entry[1],
+			splt->contents +  4);
+	  put_arm_insn (htab, output_bfd, elf32_arm_plt0_entry[2],
+			splt->contents +  8);
+	  put_arm_insn (htab, output_bfd, elf32_arm_plt0_entry[3],
+			splt->contents + 12);
 #ifdef FOUR_WORD_PLT
 	  /* The displacement value goes in the otherwise-unused last word of
 	     the second entry.  */

Reply via email to