PR24786, wrong LMA if first section in overlay is empty

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

PR24786, wrong LMA if first section in overlay is empty

Alan Modra-3
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.

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

--
Alan Modra
Australia Development Lab, IBM