PR24786, wrong LMA if first section in overlay is empty
authorAlan Modra <amodra@gmail.com>
Wed, 10 Jul 2019 14:05:18 +0000 (23:35 +0930)
committerAlan Modra <amodra@gmail.com>
Sat, 13 Jul 2019 00:27:50 +0000 (09:57 +0930)
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.

ld/ChangeLog
ld/ldlang.c
ld/ldlang.h

index cb72592..8617750 100644 (file)
@@ -1,3 +1,12 @@
+2019-07-13  Alan Modra  <amodra@gmail.com>
+
+       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.
+
 2019-07-08  Alan Modra  <amodra@gmail.com>
 
        * testsuite/ld-powerpc/callstub-1.d: Pass -melf64ppc to ld.
index 898735e..3f25b36 100644 (file)
@@ -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;
index 24edc0b..4e96a20 100644 (file)
@@ -116,6 +116,7 @@ typedef struct lang_output_statement_struct
 enum section_type
 {
   normal_section,
+  first_overlay_section,
   overlay_section,
   noload_section,
   noalloc_section