ASSERT in empty output section with address
authorAlan Modra <amodra@gmail.com>
Wed, 27 Oct 2021 22:33:00 +0000 (09:03 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 28 Oct 2021 00:21:03 +0000 (10:51 +1030)
* ldlang.c (lang_do_assignments_1): Correct "dot" inside ignored
sections.
* testsuite/ld-scripts/empty-address-4.d,
* testsuite/ld-scripts/empty-address-4.s,
* testsuite/ld-scripts/empty-address-4.t: New test.
* testsuite/ld-scripts/empty-address.exp: Run it.

ld/ldlang.c
ld/testsuite/ld-scripts/empty-address-4.d [new file with mode: 0644]
ld/testsuite/ld-scripts/empty-address-4.s [new file with mode: 0644]
ld/testsuite/ld-scripts/empty-address-4.t [new file with mode: 0644]
ld/testsuite/ld-scripts/empty-address.exp

index bc3f8b76d355e952a1036c3ff712e5f51863839e..acd90fa8f4227587feb2fea30743111fd03dc69b 100644 (file)
@@ -6481,32 +6481,34 @@ lang_do_assignments_1 (lang_statement_union_type *s,
            os = &(s->output_section_statement);
            os->after_end = *found_end;
            init_opb (os->bfd_section);
-           if (os->bfd_section != NULL && !os->ignored)
+           newdot = dot;
+           if (os->bfd_section != NULL)
              {
-               if ((os->bfd_section->flags & SEC_ALLOC) != 0)
+               if (!os->ignored && (os->bfd_section->flags & SEC_ALLOC) != 0)
                  {
                    current_section = os;
                    prefer_next_section = false;
                  }
-               dot = os->bfd_section->vma;
+               newdot = os->bfd_section->vma;
              }
            newdot = lang_do_assignments_1 (os->children.head,
-                                           os, os->fill, dot, found_end);
+                                           os, os->fill, newdot, found_end);
            if (!os->ignored)
              {
                if (os->bfd_section != NULL)
                  {
+                   newdot = os->bfd_section->vma;
+
                    /* .tbss sections effectively have zero size.  */
                    if (!IS_TBSS (os->bfd_section)
                        || bfd_link_relocatable (&link_info))
-                     dot += TO_ADDR (os->bfd_section->size);
+                     newdot += TO_ADDR (os->bfd_section->size);
 
                    if (os->update_dot_tree != NULL)
                      exp_fold_tree (os->update_dot_tree,
-                                    bfd_abs_section_ptr, &dot);
+                                    bfd_abs_section_ptr, &newdot);
                  }
-               else
-                 dot = newdot;
+               dot = newdot;
              }
          }
          break;
diff --git a/ld/testsuite/ld-scripts/empty-address-4.d b/ld/testsuite/ld-scripts/empty-address-4.d
new file mode 100644 (file)
index 0000000..26b058b
--- /dev/null
@@ -0,0 +1,6 @@
+#ld: -T empty-address-4.t
+#nm: -n
+
+#...
+0+0 [AT] _start
+#pass
diff --git a/ld/testsuite/ld-scripts/empty-address-4.s b/ld/testsuite/ld-scripts/empty-address-4.s
new file mode 100644 (file)
index 0000000..602a02f
--- /dev/null
@@ -0,0 +1,4 @@
+       .text
+       .global _start
+_start:
+       .dc.a 0, 0
diff --git a/ld/testsuite/ld-scripts/empty-address-4.t b/ld/testsuite/ld-scripts/empty-address-4.t
new file mode 100644 (file)
index 0000000..f25bbfe
--- /dev/null
@@ -0,0 +1,11 @@
+SECTIONS
+{
+  .text 0: { *(.text .pr) }
+  .data 0x200:
+  {
+    *(.data)
+    ASSERT (. < 0x400, oops);
+  }
+  .bss : { *(.bss) }
+  /DISCARD/ : { *(.*) }
+}
index 1f62372d3d7321eeb37852b918c367a6f75017b9..060c72d034a8156b6f2ee3559ae512f1c374cbbf 100644 (file)
@@ -32,5 +32,6 @@ run_dump_test empty-address-2b
 run_dump_test empty-address-3a
 run_dump_test empty-address-3b
 run_dump_test empty-address-3c
+run_dump_test empty-address-4
 
 set LDFLAGS $old_LDFLAGS