mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-27 09:38:57 +00:00
* ldlang.c: (strip_excluded_output_sections): New function.
(lang_process): Call it. (lang_size_sections_1): Revert 2002-06-10 change.
This commit is contained in:
47
ld/ldlang.c
47
ld/ldlang.c
@@ -97,6 +97,7 @@ static void lang_place_undefineds PARAMS ((void));
|
||||
static void map_input_to_output_sections
|
||||
PARAMS ((lang_statement_union_type *, const char *,
|
||||
lang_output_section_statement_type *));
|
||||
static void strip_excluded_output_sections PARAMS ((void));
|
||||
static void print_output_section_statement
|
||||
PARAMS ((lang_output_section_statement_type *));
|
||||
static void print_assignment
|
||||
@@ -2161,6 +2162,41 @@ map_input_to_output_sections (s, target, output_section_statement)
|
||||
}
|
||||
}
|
||||
|
||||
/* An output section might have been removed after its statement was
|
||||
added. For example, ldemul_before_allocation can remove dynamic
|
||||
sections if they turn out to be not needed. Clean them up here. */
|
||||
|
||||
static void
|
||||
strip_excluded_output_sections ()
|
||||
{
|
||||
lang_statement_union_type *u;
|
||||
|
||||
for (u = lang_output_section_statement.head;
|
||||
u != NULL;
|
||||
u = u->output_section_statement.next)
|
||||
{
|
||||
lang_output_section_statement_type *os;
|
||||
asection *s;
|
||||
|
||||
os = &u->output_section_statement;
|
||||
s = os->bfd_section;
|
||||
if (s != NULL && (s->flags & SEC_EXCLUDE) != 0)
|
||||
{
|
||||
asection **p;
|
||||
|
||||
os->bfd_section = NULL;
|
||||
|
||||
for (p = &output_bfd->sections; *p; p = &(*p)->next)
|
||||
if (*p == s)
|
||||
{
|
||||
bfd_section_list_remove (output_bfd, p);
|
||||
output_bfd->section_count--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_output_section_statement (output_section_statement)
|
||||
lang_output_section_statement_type *output_section_statement;
|
||||
@@ -2903,14 +2939,6 @@ lang_size_sections_1 (s, output_section_statement, prev, fill, dot, relax)
|
||||
/* This section was never actually created. */
|
||||
break;
|
||||
|
||||
/* The section might have been removed after its statement was
|
||||
added. For example, ldemul_before_allocation can remove
|
||||
dynamic sections if they turn out not to be needed. */
|
||||
if (!link_info.relocateable
|
||||
&& (bfd_get_section_flags (output_bfd, os->bfd_section)
|
||||
& SEC_EXCLUDE) != 0)
|
||||
break;
|
||||
|
||||
/* If this is a COFF shared library section, use the size and
|
||||
address from the input section. FIXME: This is COFF
|
||||
specific; it would be cleaner if there were some other way
|
||||
@@ -4252,6 +4280,9 @@ lang_process ()
|
||||
and other back-ends size dynamic sections. */
|
||||
ldemul_before_allocation ();
|
||||
|
||||
if (!link_info.relocateable)
|
||||
strip_excluded_output_sections ();
|
||||
|
||||
/* We must record the program headers before we try to fix the
|
||||
section positions, since they will affect SIZEOF_HEADERS. */
|
||||
lang_record_phdrs ();
|
||||
|
||||
Reference in New Issue
Block a user