PR24786, wrong LMA if first section in overlay is empty

Message ID 20190713003538.GP822@bubble.grove.modra.org
State New
Headers show
Series
  • PR24786, wrong LMA if first section in overlay is empty
Related show

Commit Message

Alan Modra July 13, 2019, 12:35 a.m.
This stops the first overlay section being ignored when empty,
losing its LMA assignment

	PR 24786
	* ldlang.h (enum section_type): Add first_overlay_section.
	* ldlang.c (lang_add_section): Adjust switch statement.
	(map_input_to_output_sections): Likewise.
	(lang_size_sections_1): Always set last_os for first overlay section.
	(lang_leave_overlay): Set sectype to first_overlay_section.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/ld/ldlang.c b/ld/ldlang.c
index 898735efab..3f25b363d0 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -2579,6 +2579,7 @@  lang_add_section (lang_statement_list_type *ptr,
     {
     case normal_section:
     case overlay_section:
+    case first_overlay_section:
       break;
     case noalloc_section:
       flags &= ~SEC_ALLOC;
@@ -3846,6 +3847,7 @@  map_input_to_output_sections
 	    {
 	    case normal_section:
 	    case overlay_section:
+	    case first_overlay_section:
 	      break;
 	    case noalloc_section:
 	      flags = SEC_HAS_CONTENTS;
@@ -5493,13 +5495,14 @@  lang_size_sections_1
 	       important, if an orphan section is placed after an
 	       otherwise empty output section that has an explicit lma
 	       set, we want that lma reflected in the orphans lma.  */
-	    if (!IGNORE_SECTION (os->bfd_section)
-		&& (os->bfd_section->size != 0
-		    || (r->last_os == NULL
-			&& os->bfd_section->vma != os->bfd_section->lma)
-		    || (r->last_os != NULL
-			&& dot >= (r->last_os->output_section_statement
-				   .bfd_section->vma)))
+	    if (((!IGNORE_SECTION (os->bfd_section)
+		  && (os->bfd_section->size != 0
+		      || (r->last_os == NULL
+			  && os->bfd_section->vma != os->bfd_section->lma)
+		      || (r->last_os != NULL
+			  && dot >= (r->last_os->output_section_statement
+				     .bfd_section->vma))))
+		 || os->sectype == first_overlay_section)
 		&& os->lma_region == NULL
 		&& !bfd_link_relocatable (&link_info))
 	      r->last_os = s;
@@ -8292,7 +8295,7 @@  lang_leave_overlay (etree_type *lma_expr,
       if (l->next == 0)
 	{
 	  l->os->load_base = lma_expr;
-	  l->os->sectype = normal_section;
+	  l->os->sectype = first_overlay_section;
 	}
       if (phdrs != NULL && l->os->phdrs == NULL)
 	l->os->phdrs = phdrs;
diff --git a/ld/ldlang.h b/ld/ldlang.h
index 24edc0bcfb..4e96a20c15 100644
--- a/ld/ldlang.h
+++ b/ld/ldlang.h
@@ -116,6 +116,7 @@  typedef struct lang_output_statement_struct
 enum section_type
 {
   normal_section,
+  first_overlay_section,
   overlay_section,
   noload_section,
   noalloc_section