Fix: Output section type does not been applied to section forced output by `. = ...
authorHsinyuan Xavier <TheLastLin@hotmail.com>
Wed, 27 Sep 2023 12:21:43 +0000 (13:21 +0100)
committerNick Clifton <nickc@redhat.com>
Wed, 27 Sep 2023 12:21:43 +0000 (13:21 +0100)
  PR 30875
  * ldlang.c (get_os_init_flag): New function. (exp_init_os, map_input_to_output_sections): Use it.

ld/ChangeLog
ld/ldlang.c

index 99029f1e18678670a81303edabeb076027828967..3e41bdc294effc4b06f51ced832d561392fe57c6 100644 (file)
@@ -1,3 +1,9 @@
+2023-09-27  Hsinyuan Xavier  <TheLastLin@hotmail.com>
+
+       PR 30875
+       * ldlang.c (get_os_init_flag): New function.
+       (exp_init_os, map_input_to_output_sections): Use it.
+
 2023-07-24  Johannes Schauer Marin Rodrigues  <josch@debian.org>
 
        * pe-dll.c (fill_edata): If inserting a timestamp, use the value
index f7760fed69bf2cf28d853f763bf976ffb54a9c02..b40b4a5a0ed3da83752de273452fa844bff85912 100644 (file)
@@ -2443,6 +2443,20 @@ init_os (lang_output_section_statement_type *s, flagword flags)
                                                     "section alignment");
 }
 
+static flagword
+get_os_init_flag (lang_output_section_statement_type * os)
+{
+  if (os != NULL)
+    switch (os->sectype)
+      {
+      case readonly_section: return SEC_READONLY;
+      case noload_section:   return SEC_NEVER_LOAD;
+      default: break;
+      }
+
+  return 0;
+}
+
 /* Make sure that all output sections mentioned in an expression are
    initialized.  */
 
@@ -2486,7 +2500,7 @@ exp_init_os (etree_type *exp)
 
            os = lang_output_section_find (exp->name.name);
            if (os != NULL && os->bfd_section == NULL)
-             init_os (os, 0);
+             init_os (os, get_os_init_flag (os));
          }
        }
       break;
@@ -4262,14 +4276,16 @@ map_input_to_output_sections
          if (os != NULL && os->bfd_section == NULL)
            init_os (os, 0);
          break;
+
        case lang_assignment_statement_enum:
          if (os != NULL && os->bfd_section == NULL)
-           init_os (os, 0);
+           init_os (os, get_os_init_flag (os));
 
          /* Make sure that any sections mentioned in the assignment
             are initialized.  */
          exp_init_os (s->assignment_statement.exp);
          break;
+
        case lang_address_statement_enum:
          /* Mark the specified section with the supplied address.
             If this section was actually a segment marker, then the