* elflink.c (elf_mark_used_section): Delete.
(bfd_elf_gc_sections): Call bfd_generic_gc_sections. * reloc.c (bfd_mark_used_section): New function. (bfd_generic_gc_sections): Call bfd_mark_used_section.
This commit is contained in:
parent
8f736feabd
commit
0e58fcf315
3 changed files with 36 additions and 32 deletions
|
@ -1,3 +1,10 @@
|
|||
2005-06-09 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* elflink.c (elf_mark_used_section): Delete.
|
||||
(bfd_elf_gc_sections): Call bfd_generic_gc_sections.
|
||||
* reloc.c (bfd_mark_used_section): New function.
|
||||
(bfd_generic_gc_sections): Call bfd_mark_used_section.
|
||||
|
||||
2005-06-08 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* opncls.c (bfd_fopen): Don't set bfd_error unconditionally.
|
||||
|
|
|
@ -9067,27 +9067,6 @@ elf_gc_mark_dynamic_ref_symbol (struct elf_link_hash_entry *h,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* Mark sections containing global symbols. This is called through
|
||||
elf_link_hash_traverse. */
|
||||
|
||||
static bfd_boolean
|
||||
elf_mark_used_section (struct elf_link_hash_entry *h,
|
||||
void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
if (h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
asection *s = h->root.u.def.section;
|
||||
if (s != NULL && s->output_section != NULL)
|
||||
s->output_section->flags |= SEC_KEEP;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Do mark and sweep of unused sections. */
|
||||
|
||||
bfd_boolean
|
||||
|
@ -9100,15 +9079,7 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
|
|||
struct elf_link_hash_entry *h, Elf_Internal_Sym *);
|
||||
|
||||
if (!info->gc_sections)
|
||||
{
|
||||
/* If we are called when info->gc_sections is 0, we will mark
|
||||
all sections containing global symbols for non-relocatable
|
||||
link. */
|
||||
if (!info->relocatable)
|
||||
elf_link_hash_traverse (elf_hash_table (info),
|
||||
elf_mark_used_section, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
return bfd_generic_gc_sections (abfd, info);
|
||||
|
||||
if (!get_elf_backend_data (abfd)->can_gc_sections
|
||||
|| info->relocatable
|
||||
|
|
30
bfd/reloc.c
30
bfd/reloc.c
|
@ -4516,6 +4516,27 @@ bfd_generic_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* Mark sections containing global symbols. This is called through
|
||||
bfd_link_hash_traverse. */
|
||||
|
||||
static bfd_boolean
|
||||
bfd_mark_used_section (struct bfd_link_hash_entry *h,
|
||||
void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
if (h->type == bfd_link_hash_warning)
|
||||
h = h->u.i.link;
|
||||
|
||||
if (h->type == bfd_link_hash_defined
|
||||
|| h->type == bfd_link_hash_defweak)
|
||||
{
|
||||
asection *s = h->u.def.section;
|
||||
if (s != NULL && s->output_section != NULL)
|
||||
s->output_section->flags |= SEC_KEEP;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
INTERNAL_FUNCTION
|
||||
bfd_generic_gc_sections
|
||||
|
@ -4526,13 +4547,18 @@ SYNOPSIS
|
|||
|
||||
DESCRIPTION
|
||||
Provides default handling for relaxing for back ends which
|
||||
don't do section gc -- i.e., does nothing.
|
||||
don't do section gc -- i.e., does nothing besides the special
|
||||
case for marking sections having global symbols.
|
||||
*/
|
||||
|
||||
bfd_boolean
|
||||
bfd_generic_gc_sections (bfd *abfd ATTRIBUTE_UNUSED,
|
||||
struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
|
||||
struct bfd_link_info *info)
|
||||
{
|
||||
/* If called when info->gc_sections is 0, then mark all sections
|
||||
containing global symbols with SEC_KEEP. */
|
||||
if (!info->gc_sections && !info->relocatable)
|
||||
bfd_link_hash_traverse (info->hash, bfd_mark_used_section, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue