This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[committed] TILE-Gx/TILEPro: pad plt section to multiple of entry size


This patch adds padding to the plt section so that its size is
a multiple of its entry size.

	* elf32-tilepro.c (allocate_dynrelocs): Use PLT_ENTRY_SIZE as size
	of header.
	(tilepro_plt_entry_build): Account for new header size.
	(tilepro_elf_finish_dynamic_sections): Ditto.
	(tilepro_elf_plt_sym_val): Ditto.
	* elfxx-tilegx.c (allocate_dynrelocs): Use PLT_ENTRY_SIZE as size
	of header + tail.
	(tilegx_elf_finish_dynamic_sections): Account for new padding.

Index: bfd/elf32-tilepro.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-tilepro.c,v
retrieving revision 1.10
diff -u -p -r1.10 elf32-tilepro.c
--- bfd/elf32-tilepro.c	29 Jun 2012 14:46:01 -0000	1.10
+++ bfd/elf32-tilepro.c	28 Aug 2012 06:17:07 -0000
@@ -1105,7 +1105,7 @@ static int
 tilepro_plt_entry_build (asection *splt, asection *sgotplt, bfd_vma offset,
 		      bfd_vma *r_offset)
 {
-  int plt_index = (offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
+  int plt_index = (offset - PLT_ENTRY_SIZE) / PLT_ENTRY_SIZE;
   int got_offset = plt_index * GOT_ENTRY_SIZE + GOTPLT_HEADER_SIZE;
   tilepro_bundle_bits *pc;
 
@@ -2193,7 +2193,7 @@ allocate_dynrelocs (struct elf_link_hash
 	  /* Allocate room for the header.  */
 	  if (s->size == 0)
 	    {
-	      s->size = PLT_HEADER_SIZE;
+	      s->size = PLT_ENTRY_SIZE;
 	    }
 
           h->plt.offset = s->size;
@@ -3867,7 +3867,11 @@ tilepro_elf_finish_dynamic_sections (bfd
 
       /* Fill in the first entry in the procedure linkage table.  */
       if (splt->size > 0)
-        memcpy (splt->contents, tilepro_plt0_entry, PLT_HEADER_SIZE);
+	{
+	  memcpy (splt->contents, tilepro_plt0_entry, PLT_HEADER_SIZE);
+	  memset (splt->contents + PLT_HEADER_SIZE, 0,
+		  PLT_ENTRY_SIZE - PLT_HEADER_SIZE);
+	}
 
       elf_section_data (splt->output_section)->this_hdr.sh_entsize
 	= PLT_ENTRY_SIZE;
@@ -3924,7 +3928,7 @@ static bfd_vma
 tilepro_elf_plt_sym_val (bfd_vma i, const asection *plt,
                       const arelent *rel ATTRIBUTE_UNUSED)
 {
-  return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
+  return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
 }
 
 static enum elf_reloc_type_class
Index: bfd/elfxx-tilegx.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-tilegx.c,v
retrieving revision 1.12
diff -u -p -r1.12 elfxx-tilegx.c
--- bfd/elfxx-tilegx.c	28 Aug 2012 02:43:19 -0000	1.12
+++ bfd/elfxx-tilegx.c	28 Aug 2012 06:17:08 -0000
@@ -2470,10 +2470,10 @@ allocate_dynrelocs (struct elf_link_hash
 	  /* Allocate room for the header and tail.  */
 	  if (s->size == 0)
 	    {
-	      s->size = PLT_HEADER_SIZE + PLT_TAIL_SIZE;
+	      s->size = PLT_ENTRY_SIZE;
 	    }
 
-          h->plt.offset = s->size - PLT_TAIL_SIZE;
+          h->plt.offset = s->size - PLT_ENTRY_SIZE + PLT_HEADER_SIZE;
 
 	  /* If this symbol is not defined in a regular file, and we are
 	     not generating a shared library, then set the symbol to this
@@ -4247,6 +4247,7 @@ tilegx_elf_finish_dynamic_sections (bfd 
   bfd *dynobj;
   asection *sdyn;
   struct tilegx_elf_link_hash_table *htab;
+  size_t pad_size;
 
   htab = tilegx_elf_hash_table (info);
   BFD_ASSERT (htab != NULL);
@@ -4275,10 +4276,15 @@ tilegx_elf_finish_dynamic_sections (bfd 
 		    tilegx64_plt0_entry : tilegx32_plt0_entry,
 		  PLT_HEADER_SIZE);
 
-	  memcpy (splt->contents + splt->size - PLT_TAIL_SIZE,
+	  memcpy (splt->contents + splt->size
+		  - PLT_ENTRY_SIZE + PLT_HEADER_SIZE,
 		  ABI_64_P (output_bfd) ?
 		    tilegx64_plt_tail_entry : tilegx32_plt_tail_entry,
 		  PLT_TAIL_SIZE);
+	  /* Add padding so that the plt section is a multiple of its
+	     entry size.  */
+	  pad_size = PLT_ENTRY_SIZE - PLT_HEADER_SIZE - PLT_TAIL_SIZE;
+	  memset (splt->contents + splt->size - pad_size, 0, pad_size);
 	}
 
       elf_section_data (splt->output_section)->this_hdr.sh_entsize


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]