[binutils-gdb/binutils-2_33-branch] [bfd] Provide 8-byte minimum alignment for .plt section

John David Anglin danglin@sourceware.org
Sun Oct 20 16:29:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7c65b97032bb8f8572723d4ce10d4f07c00c1734

commit 7c65b97032bb8f8572723d4ce10d4f07c00c1734
Author: John David Anglin <danglin@gcc.gnu.org>
Date:   Sun Oct 20 12:28:35 2019 -0400

    	[bfd]	Provide 8-byte minimum alignment for .plt section
    
    	This change increases the default alignment for the .plt section
    	from 4 bytes to 8 bytes.  When function descriptors are 8-byte
    	aligned, they can be updated atomically on 32-bit hppa.  This
    	helps with ordering issues on SMP machines.  It also ensures
    	that descriptors reside on the same cache line.  This reduces
    	the probability of a double TLB miss in a call.
    
    	2019-10-20  John David Anglin  <danglin@gcc.gnu.org>
    
    		* elf32-hppa.c (elf32_hppa_size_dynamic_sections): Provide 8-byte
    		minimum alignment for .plt section.

Diff:
---
 bfd/ChangeLog    | 3 +++
 bfd/elf32-hppa.c | 5 +++--
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 2aa9958..86ce07a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,8 @@
 2019-10-20  John David Anglin  <danglin@gcc.gnu.org>
 
+	* elf32-hppa.c (elf32_hppa_size_dynamic_sections): Provide 8-byte
+	minimum alignment for .plt section.
+
 	* elf32-hppa.c: Revise import stub sequences.
 	(LONG_BRANCH_STUB_SIZE): Define.
 	(LONG_BRANCH_SHARED_STUB_SIZE): Define.
diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
index 49f0ca6..cd99584 100644
--- a/bfd/elf32-hppa.c
+++ b/bfd/elf32-hppa.c
@@ -2280,10 +2280,11 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 		 against the .got section.  */
 	      int gotalign = bfd_section_alignment (dynobj, htab->etab.sgot);
 	      int pltalign = bfd_section_alignment (dynobj, sec);
+	      int align = gotalign > 3 ? gotalign : 3;
 	      bfd_size_type mask;
 
-	      if (gotalign > pltalign)
-		(void) bfd_set_section_alignment (dynobj, sec, gotalign);
+	      if (align > pltalign)
+		(void) bfd_set_section_alignment (dynobj, sec, align);
 	      mask = ((bfd_size_type) 1 << gotalign) - 1;
 	      sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask;
 	    }



More information about the Binutils-cvs mailing list