mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-25 19:14:52 +08:00
* ldlang.c (lang_add_section): Don't twidlle SEC_EXCLUDE here.
(output_section_callback): Nor SEC_KEEP here. (gc_section_callback): Twiddle SEC_EXCLUDE here. (lang_gc_wild): Delete. Fold into.. (lang_gc_sections_1): ..here. Only call bfd_gc_sections when garbage collecting. (lang_process): Always call lang_gc_sections. (lang_place_orphans): Handle SEC_EXCLUDE sections. * emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Remove SEC_EXCLUDE code.
This commit is contained in:
parent
652ca075fb
commit
164e712d71
13
ld/ChangeLog
13
ld/ChangeLog
@ -1,3 +1,16 @@
|
|||||||
|
2004-05-28 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
* ldlang.c (lang_add_section): Don't twidlle SEC_EXCLUDE here.
|
||||||
|
(output_section_callback): Nor SEC_KEEP here.
|
||||||
|
(gc_section_callback): Twiddle SEC_EXCLUDE here.
|
||||||
|
(lang_gc_wild): Delete. Fold into..
|
||||||
|
(lang_gc_sections_1): ..here. Only call bfd_gc_sections when garbage
|
||||||
|
collecting.
|
||||||
|
(lang_process): Always call lang_gc_sections.
|
||||||
|
(lang_place_orphans): Handle SEC_EXCLUDE sections.
|
||||||
|
* emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Remove
|
||||||
|
SEC_EXCLUDE code.
|
||||||
|
|
||||||
2004-05-26 H.J. Lu <hongjiu.lu@intel.com>
|
2004-05-26 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Clear
|
* emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Clear
|
||||||
|
@ -1182,16 +1182,6 @@ gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s)
|
|||||||
#define HAVE_SECTION(hold, name) \
|
#define HAVE_SECTION(hold, name) \
|
||||||
(hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
|
(hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
|
||||||
|
|
||||||
if (link_info.relocatable && (s->flags & SEC_DEBUGGING) == 0)
|
|
||||||
s->flags &= ~SEC_EXCLUDE;
|
|
||||||
|
|
||||||
if ((s->flags & SEC_EXCLUDE) != 0)
|
|
||||||
{
|
|
||||||
if (s->output_section == NULL)
|
|
||||||
s->output_section = bfd_abs_section_ptr;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
place = NULL;
|
place = NULL;
|
||||||
if ((s->flags & SEC_ALLOC) == 0)
|
if ((s->flags & SEC_ALLOC) == 0)
|
||||||
;
|
;
|
||||||
|
55
ld/ldlang.c
55
ld/ldlang.c
@ -1089,23 +1089,9 @@ lang_add_section (lang_statement_list_type *ptr,
|
|||||||
lang_output_section_statement_type *output,
|
lang_output_section_statement_type *output,
|
||||||
lang_input_statement_type *file)
|
lang_input_statement_type *file)
|
||||||
{
|
{
|
||||||
flagword flags;
|
flagword flags = section->flags;
|
||||||
bfd_boolean discard;
|
bfd_boolean discard;
|
||||||
|
|
||||||
flags = bfd_get_section_flags (section->owner, section);
|
|
||||||
|
|
||||||
/* SEC_EXCLUDE is ignored when doing a relocatable link, except in
|
|
||||||
the special case of debug info. (See bfd/stabs.c) */
|
|
||||||
if (link_info.relocatable && (flags & SEC_DEBUGGING) == 0)
|
|
||||||
{
|
|
||||||
flags &= ~SEC_EXCLUDE;
|
|
||||||
|
|
||||||
/* Write the modified flag back, to simplify later linker
|
|
||||||
code. */
|
|
||||||
if (section->owner != NULL)
|
|
||||||
bfd_set_section_flags (section->owner, section, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Discard sections marked with SEC_EXCLUDE. */
|
/* Discard sections marked with SEC_EXCLUDE. */
|
||||||
discard = (flags & SEC_EXCLUDE) != 0;
|
discard = (flags & SEC_EXCLUDE) != 0;
|
||||||
|
|
||||||
@ -1349,11 +1335,6 @@ output_section_callback (lang_wild_statement_type *ptr,
|
|||||||
if (unique_section_p (section))
|
if (unique_section_p (section))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* If the wild pattern was marked KEEP, the member sections
|
|
||||||
should be as well. */
|
|
||||||
if (ptr->keep_sections)
|
|
||||||
section->flags |= SEC_KEEP;
|
|
||||||
|
|
||||||
before = wild_sort (ptr, sec, file, section);
|
before = wild_sort (ptr, sec, file, section);
|
||||||
|
|
||||||
/* Here BEFORE points to the lang_input_section which
|
/* Here BEFORE points to the lang_input_section which
|
||||||
@ -4029,9 +4010,10 @@ lang_place_orphans (void)
|
|||||||
around for a sensible place for it to go. */
|
around for a sensible place for it to go. */
|
||||||
|
|
||||||
if (file->just_syms_flag)
|
if (file->just_syms_flag)
|
||||||
{
|
abort ();
|
||||||
abort ();
|
|
||||||
}
|
if ((s->flags & SEC_EXCLUDE) != 0)
|
||||||
|
s->output_section = bfd_abs_section_ptr;
|
||||||
else if (strcmp (s->name, "COMMON") == 0)
|
else if (strcmp (s->name, "COMMON") == 0)
|
||||||
{
|
{
|
||||||
/* This is a lonely common section which must have
|
/* This is a lonely common section which must have
|
||||||
@ -4271,8 +4253,7 @@ lang_reset_memory_regions (void)
|
|||||||
o->_raw_size = 0;
|
o->_raw_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the wild pattern was marked KEEP, the member sections
|
/* Worker for lang_gc_sections_1. */
|
||||||
should be as well. */
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gc_section_callback (lang_wild_statement_type *ptr,
|
gc_section_callback (lang_wild_statement_type *ptr,
|
||||||
@ -4281,18 +4262,18 @@ gc_section_callback (lang_wild_statement_type *ptr,
|
|||||||
lang_input_statement_type *file ATTRIBUTE_UNUSED,
|
lang_input_statement_type *file ATTRIBUTE_UNUSED,
|
||||||
void *data ATTRIBUTE_UNUSED)
|
void *data ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
|
/* SEC_EXCLUDE is ignored when doing a relocatable link, except in
|
||||||
|
the special case of debug info. (See bfd/stabs.c)
|
||||||
|
Twiddle the flag here, to simplify later linker code. */
|
||||||
|
if (link_info.relocatable && (section->flags & SEC_DEBUGGING) == 0)
|
||||||
|
section->flags &= ~SEC_EXCLUDE;
|
||||||
|
|
||||||
|
/* If the wild pattern was marked KEEP, the member sections
|
||||||
|
should be as well. */
|
||||||
if (ptr->keep_sections)
|
if (ptr->keep_sections)
|
||||||
section->flags |= SEC_KEEP;
|
section->flags |= SEC_KEEP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle a wild statement, marking it against GC. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
lang_gc_wild (lang_wild_statement_type *s)
|
|
||||||
{
|
|
||||||
walk_wild (s, gc_section_callback, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Iterate over sections marking them against GC. */
|
/* Iterate over sections marking them against GC. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -4303,7 +4284,7 @@ lang_gc_sections_1 (lang_statement_union_type *s)
|
|||||||
switch (s->header.type)
|
switch (s->header.type)
|
||||||
{
|
{
|
||||||
case lang_wild_statement_enum:
|
case lang_wild_statement_enum:
|
||||||
lang_gc_wild (&s->wild_statement);
|
walk_wild (&s->wild_statement, gc_section_callback, NULL);
|
||||||
break;
|
break;
|
||||||
case lang_constructors_statement_enum:
|
case lang_constructors_statement_enum:
|
||||||
lang_gc_sections_1 (constructor_list.head);
|
lang_gc_sections_1 (constructor_list.head);
|
||||||
@ -4347,7 +4328,8 @@ lang_gc_sections (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bfd_gc_sections (output_bfd, &link_info);
|
if (command_line.gc_sections)
|
||||||
|
bfd_gc_sections (output_bfd, &link_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -4395,8 +4377,7 @@ lang_process (void)
|
|||||||
ldctor_build_sets ();
|
ldctor_build_sets ();
|
||||||
|
|
||||||
/* Remove unreferenced sections if asked to. */
|
/* Remove unreferenced sections if asked to. */
|
||||||
if (command_line.gc_sections)
|
lang_gc_sections ();
|
||||||
lang_gc_sections ();
|
|
||||||
|
|
||||||
/* Size up the common data. */
|
/* Size up the common data. */
|
||||||
lang_common ();
|
lang_common ();
|
||||||
|
Loading…
Reference in New Issue
Block a user