Fix: Output section type does not been applied to section forced output by . = . assignment

PR 30875
  * ldlang.c (get_os_init_flag): New function. (exp_init_os, map_input_to_output_sections): Use it.
This commit is contained in:
Hsinyuan Xavier
2023-09-27 13:21:43 +01:00
committed by Nick Clifton
parent da0784f961
commit 193327db9f
2 changed files with 24 additions and 2 deletions

View 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