[binutils-gdb] LD: Support fixed-size sections some psABIs may require

Maciej W.Rozycki macro@sourceware.org
Mon Feb 19 18:40:00 GMT 2018


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

commit 8772de117d8366988bc60c9f9c571e262ef75932
Author: Maciej W. Rozycki <macro@mips.com>
Date:   Mon Feb 19 18:38:41 2018 +0000

    LD: Support fixed-size sections some psABIs may require
    
    Define a SEC_FIXED_SIZE section flag for target backends to use for
    output sections whose size has been fixed in the psABI.  The size of
    such sections will not be changed anyhow by the generic linker and it is
    up to the target backend to get their size right.
    
    	bfd/
    	* section.c (SEC_FIXED_SIZE): New macro.
    	* bfd-in2.h: Regenerate.
    
    	ld/
    	* ldlang.c (insert_pad): Do not change output section's size if
    	SEC_FIXED_SIZE is set in the flags.
    	(size_input_section): Likewise.
    	(lang_size_sections_1): Likewise.
    	(lang_reset_memory_regions): Likewise.

Diff:
---
 bfd/ChangeLog |  5 +++++
 bfd/bfd-in2.h |  5 +++++
 bfd/section.c |  5 +++++
 ld/ChangeLog  |  8 ++++++++
 ld/ldlang.c   | 30 ++++++++++++++++++++----------
 5 files changed, 43 insertions(+), 10 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e4c33c7..b84a3d1 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,10 @@
 2018-02-19  Maciej W. Rozycki  <macro@mips.com>
 
+	* section.c (SEC_FIXED_SIZE): New macro.
+	* bfd-in2.h: Regenerate.
+
+2018-02-19  Maciej W. Rozycki  <macro@mips.com>
+
 	* section.c (SEC_HAS_GOT_REF): Remove macro.
 	* bfd-in2.h: Regenerate.
 
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 2901488..9742c1a 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -1342,6 +1342,11 @@ typedef struct bfd_section
   /* The section contains thread local data.  */
 #define SEC_THREAD_LOCAL                0x400
 
+  /* The section's size is fixed.  Generic linker code will not
+     recalculate it and it is up to whoever has set this flag to
+     get the size right.  */
+#define SEC_FIXED_SIZE                  0x800
+
   /* The section contains common symbols (symbols may be defined
      multiple times, the value of a symbol is the amount of
      space it requires, and the largest symbol value is the one
diff --git a/bfd/section.c b/bfd/section.c
index de4ca3a..6aa18d5 100644
--- a/bfd/section.c
+++ b/bfd/section.c
@@ -221,6 +221,11 @@ CODE_FRAGMENT
 .  {* The section contains thread local data.  *}
 .#define SEC_THREAD_LOCAL                0x400
 .
+.  {* The section's size is fixed.  Generic linker code will not
+.     recalculate it and it is up to whoever has set this flag to
+.     get the size right.  *}
+.#define SEC_FIXED_SIZE                  0x800
+.
 .  {* The section contains common symbols (symbols may be defined
 .     multiple times, the value of a symbol is the amount of
 .     space it requires, and the largest symbol value is the one
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 84c6d3e..4f5cd5f 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,11 @@
+2018-02-19  Maciej W. Rozycki  <macro@mips.com>
+
+	* ldlang.c (insert_pad): Do not change output section's size if
+	SEC_FIXED_SIZE is set in the flags.
+	(size_input_section): Likewise.
+	(lang_size_sections_1): Likewise.
+	(lang_reset_memory_regions): Likewise.
+
 2018-02-19  Alan Modra  <amodra@gmail.com>
 
 	* ldmisc.c (vfinfo) Handle %pI, %pR, %pS and %pT in place of
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 1a6f2cf..5401982 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -4675,8 +4675,9 @@ insert_pad (lang_statement_union_type **ptr,
     }
   pad->padding_statement.output_offset = dot - output_section->vma;
   pad->padding_statement.size = alignment_needed;
-  output_section->size = TO_SIZE (dot + TO_ADDR (alignment_needed)
-				  - output_section->vma);
+  if (!(output_section->flags & SEC_FIXED_SIZE))
+    output_section->size = TO_SIZE (dot + TO_ADDR (alignment_needed)
+				    - output_section->vma);
 }
 
 /* Work out how much this section will move the dot point.  */
@@ -4725,7 +4726,8 @@ size_input_section
 
       /* Mark how big the output section must be to contain this now.  */
       dot += TO_ADDR (i->size);
-      o->size = TO_SIZE (dot - o->vma);
+      if (!(o->flags & SEC_FIXED_SIZE))
+	o->size = TO_SIZE (dot - o->vma);
     }
 
   return dot;
@@ -5079,7 +5081,8 @@ lang_size_sections_1
 		bfd_set_section_vma (os->bfd_section->owner,
 				     os->bfd_section,
 				     bfd_section_vma (input->owner, input));
-		os->bfd_section->size = input->size;
+		if (!(os->bfd_section->flags & SEC_FIXED_SIZE))
+		  os->bfd_section->size = input->size;
 		break;
 	      }
 
@@ -5194,7 +5197,9 @@ lang_size_sections_1
 			  + os->block_value - 1)
 			 & - (bfd_vma) os->block_value);
 
-		os->bfd_section->size = TO_SIZE (after - os->bfd_section->vma);
+		if (!(os->bfd_section->flags & SEC_FIXED_SIZE))
+		  os->bfd_section->size = TO_SIZE (after
+						   - os->bfd_section->vma);
 	      }
 
 	    /* Set section lma.  */
@@ -5379,8 +5384,10 @@ lang_size_sections_1
 	    if (size < TO_SIZE ((unsigned) 1))
 	      size = TO_SIZE ((unsigned) 1);
 	    dot += TO_ADDR (size);
-	    output_section_statement->bfd_section->size
-	      = TO_SIZE (dot - output_section_statement->bfd_section->vma);
+	    if (!(output_section_statement->bfd_section->flags
+		  & SEC_FIXED_SIZE))
+	      output_section_statement->bfd_section->size
+		= TO_SIZE (dot - output_section_statement->bfd_section->vma);
 
 	  }
 	  break;
@@ -5395,8 +5402,10 @@ lang_size_sections_1
 	      output_section_statement->bfd_section;
 	    size = bfd_get_reloc_size (s->reloc_statement.howto);
 	    dot += TO_ADDR (size);
-	    output_section_statement->bfd_section->size
-	      = TO_SIZE (dot - output_section_statement->bfd_section->vma);
+	    if (!(output_section_statement->bfd_section->flags
+		  & SEC_FIXED_SIZE))
+	      output_section_statement->bfd_section->size
+		= TO_SIZE (dot - output_section_statement->bfd_section->vma);
 	  }
 	  break;
 
@@ -6764,7 +6773,8 @@ lang_reset_memory_regions (void)
     {
       /* Save the last size for possible use by bfd_relax_section.  */
       o->rawsize = o->size;
-      o->size = 0;
+      if (!(o->flags & SEC_FIXED_SIZE))
+	o->size = 0;
     }
 }



More information about the Binutils-cvs mailing list