mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-10 12:22:20 +08:00
* elf-bfd.h (struct elf_backend_data): Add gc_mark_dynamic_ref.
(bfd_elf_gc_mark_dynamic_ref_symbol): Declare. * elflink.c (bfd_elf_gc_mark_dynamic_ref_symbol): Rename from elf_gc_mark_dynamic_ref_symbol. Make global. (bfd_elf_gc_sections): Call bed->gc_mark_dynamic_ref. * elfxx-target.h (elf_backend_gc_mark_dynamic_ref): Define. (elfNN_bed): Init new field. * elf64-ppc.c (elf_backend_gc_mark_dynamic_ref): Define. (ppc64_elf_gc_mark_dynamic_ref): New function.
This commit is contained in:
@ -1,3 +1,15 @@
|
|||||||
|
2006-01-18 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
* elf-bfd.h (struct elf_backend_data): Add gc_mark_dynamic_ref.
|
||||||
|
(bfd_elf_gc_mark_dynamic_ref_symbol): Declare.
|
||||||
|
* elflink.c (bfd_elf_gc_mark_dynamic_ref_symbol): Rename from
|
||||||
|
elf_gc_mark_dynamic_ref_symbol. Make global.
|
||||||
|
(bfd_elf_gc_sections): Call bed->gc_mark_dynamic_ref.
|
||||||
|
* elfxx-target.h (elf_backend_gc_mark_dynamic_ref): Define.
|
||||||
|
(elfNN_bed): Init new field.
|
||||||
|
* elf64-ppc.c (elf_backend_gc_mark_dynamic_ref): Define.
|
||||||
|
(ppc64_elf_gc_mark_dynamic_ref): New function.
|
||||||
|
|
||||||
2006-01-17 Alan Modra <amodra@bigpond.net.au>
|
2006-01-17 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
* elf64-ppc.c (ppc64_elf_gc_mark_hook): Don't hang forever in loop.
|
* elf64-ppc.c (ppc64_elf_gc_mark_hook): Don't hang forever in loop.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* BFD back-end data structures for ELF files.
|
/* BFD back-end data structures for ELF files.
|
||||||
Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||||
2002, 2003, 2004, 2005 Free Software Foundation, Inc.
|
2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||||
Written by Cygnus Support.
|
Written by Cygnus Support.
|
||||||
|
|
||||||
This file is part of BFD, the Binary File Descriptor library.
|
This file is part of BFD, the Binary File Descriptor library.
|
||||||
@ -830,6 +830,11 @@ struct elf_backend_data
|
|||||||
bfd_boolean (*elf_backend_modify_segment_map)
|
bfd_boolean (*elf_backend_modify_segment_map)
|
||||||
(bfd *, struct bfd_link_info *);
|
(bfd *, struct bfd_link_info *);
|
||||||
|
|
||||||
|
/* This function is called during section garbage collection to
|
||||||
|
mark sections that define global symbols. */
|
||||||
|
bfd_boolean (*gc_mark_dynamic_ref)
|
||||||
|
(struct elf_link_hash_entry *h, void *inf);
|
||||||
|
|
||||||
/* This function is called during section gc to discover the section a
|
/* This function is called during section gc to discover the section a
|
||||||
particular relocation refers to. */
|
particular relocation refers to. */
|
||||||
asection * (*gc_mark_hook)
|
asection * (*gc_mark_hook)
|
||||||
@ -1808,6 +1813,9 @@ extern bfd_reloc_status_type _bfd_elf_rel_vtable_reloc_fn
|
|||||||
extern bfd_boolean bfd_elf_final_link
|
extern bfd_boolean bfd_elf_final_link
|
||||||
(bfd *, struct bfd_link_info *);
|
(bfd *, struct bfd_link_info *);
|
||||||
|
|
||||||
|
extern bfd_boolean bfd_elf_gc_mark_dynamic_ref_symbol
|
||||||
|
(struct elf_link_hash_entry *h, void *inf);
|
||||||
|
|
||||||
extern bfd_boolean bfd_elf_gc_sections
|
extern bfd_boolean bfd_elf_gc_sections
|
||||||
(bfd *, struct bfd_link_info *);
|
(bfd *, struct bfd_link_info *);
|
||||||
|
|
||||||
|
@ -89,6 +89,7 @@ static bfd_vma opd_entry_value
|
|||||||
#define elf_backend_check_directives ppc64_elf_check_directives
|
#define elf_backend_check_directives ppc64_elf_check_directives
|
||||||
#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
|
#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
|
||||||
#define elf_backend_check_relocs ppc64_elf_check_relocs
|
#define elf_backend_check_relocs ppc64_elf_check_relocs
|
||||||
|
#define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
|
||||||
#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
|
#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
|
||||||
#define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
|
#define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
|
||||||
#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
|
#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
|
||||||
@ -4939,6 +4940,54 @@ opd_entry_value (asection *opd_sec,
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Mark sections containing dynamically referenced symbols. When
|
||||||
|
building shared libraries, we must assume that any visible symbol is
|
||||||
|
referenced. */
|
||||||
|
|
||||||
|
static bfd_boolean
|
||||||
|
ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
|
||||||
|
{
|
||||||
|
struct bfd_link_info *info = (struct bfd_link_info *) inf;
|
||||||
|
struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
|
||||||
|
|
||||||
|
if (eh->elf.root.type == bfd_link_hash_warning)
|
||||||
|
eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
|
||||||
|
|
||||||
|
/* Dynamic linking info is on the func descriptor sym. */
|
||||||
|
if (eh->oh != NULL
|
||||||
|
&& eh->oh->is_func_descriptor
|
||||||
|
&& (eh->oh->elf.root.type == bfd_link_hash_defined
|
||||||
|
|| eh->oh->elf.root.type == bfd_link_hash_defweak))
|
||||||
|
eh = eh->oh;
|
||||||
|
|
||||||
|
if ((eh->elf.root.type == bfd_link_hash_defined
|
||||||
|
|| eh->elf.root.type == bfd_link_hash_defweak)
|
||||||
|
&& (eh->elf.ref_dynamic
|
||||||
|
|| (!info->executable
|
||||||
|
&& eh->elf.def_regular
|
||||||
|
&& ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
|
||||||
|
&& ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN)))
|
||||||
|
{
|
||||||
|
asection *code_sec;
|
||||||
|
|
||||||
|
eh->elf.root.u.def.section->flags |= SEC_KEEP;
|
||||||
|
|
||||||
|
/* Function descriptor syms cause the associated
|
||||||
|
function code sym section to be marked. */
|
||||||
|
if (eh->is_func_descriptor
|
||||||
|
&& (eh->oh->elf.root.type == bfd_link_hash_defined
|
||||||
|
|| eh->oh->elf.root.type == bfd_link_hash_defweak))
|
||||||
|
eh->oh->elf.root.u.def.section->flags |= SEC_KEEP;
|
||||||
|
else if (get_opd_info (eh->elf.root.u.def.section) != NULL
|
||||||
|
&& opd_entry_value (eh->elf.root.u.def.section,
|
||||||
|
eh->elf.root.u.def.value,
|
||||||
|
&code_sec, NULL) != (bfd_vma) -1)
|
||||||
|
code_sec->flags |= SEC_KEEP;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Return the section that should be marked against GC for a given
|
/* Return the section that should be marked against GC for a given
|
||||||
relocation. */
|
relocation. */
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* ELF linking support for BFD.
|
/* ELF linking support for BFD.
|
||||||
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
|
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||||
Free Software Foundation, Inc.
|
2005, 2006 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of BFD, the Binary File Descriptor library.
|
This file is part of BFD, the Binary File Descriptor library.
|
||||||
|
|
||||||
@ -9067,8 +9067,8 @@ elf_gc_smash_unused_vtentry_relocs (struct elf_link_hash_entry *h, void *okp)
|
|||||||
building shared libraries, we must assume that any visible symbol is
|
building shared libraries, we must assume that any visible symbol is
|
||||||
referenced. */
|
referenced. */
|
||||||
|
|
||||||
static bfd_boolean
|
bfd_boolean
|
||||||
elf_gc_mark_dynamic_ref_symbol (struct elf_link_hash_entry *h, void *inf)
|
bfd_elf_gc_mark_dynamic_ref_symbol (struct elf_link_hash_entry *h, void *inf)
|
||||||
{
|
{
|
||||||
struct bfd_link_info *info = (struct bfd_link_info *) inf;
|
struct bfd_link_info *info = (struct bfd_link_info *) inf;
|
||||||
|
|
||||||
@ -9097,8 +9097,9 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
|
|||||||
asection * (*gc_mark_hook)
|
asection * (*gc_mark_hook)
|
||||||
(asection *, struct bfd_link_info *, Elf_Internal_Rela *,
|
(asection *, struct bfd_link_info *, Elf_Internal_Rela *,
|
||||||
struct elf_link_hash_entry *h, Elf_Internal_Sym *);
|
struct elf_link_hash_entry *h, Elf_Internal_Sym *);
|
||||||
|
const struct elf_backend_data *bed = get_elf_backend_data (abfd);
|
||||||
|
|
||||||
if (!get_elf_backend_data (abfd)->can_gc_sections
|
if (!bed->can_gc_sections
|
||||||
|| info->relocatable
|
|| info->relocatable
|
||||||
|| info->emitrelocations
|
|| info->emitrelocations
|
||||||
|| !is_elf_hash_table (info->hash))
|
|| !is_elf_hash_table (info->hash))
|
||||||
@ -9124,11 +9125,11 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
|
|||||||
/* Mark dynamically referenced symbols. */
|
/* Mark dynamically referenced symbols. */
|
||||||
if (elf_hash_table (info)->dynamic_sections_created)
|
if (elf_hash_table (info)->dynamic_sections_created)
|
||||||
elf_link_hash_traverse (elf_hash_table (info),
|
elf_link_hash_traverse (elf_hash_table (info),
|
||||||
elf_gc_mark_dynamic_ref_symbol,
|
bed->gc_mark_dynamic_ref,
|
||||||
info);
|
info);
|
||||||
|
|
||||||
/* Grovel through relocs to find out who stays ... */
|
/* Grovel through relocs to find out who stays ... */
|
||||||
gc_mark_hook = get_elf_backend_data (abfd)->gc_mark_hook;
|
gc_mark_hook = bed->gc_mark_hook;
|
||||||
for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
|
for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
|
||||||
{
|
{
|
||||||
asection *o;
|
asection *o;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Target definitions for NN-bit ELF
|
/* Target definitions for NN-bit ELF
|
||||||
Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
2003, 2004, 2005 Free Software Foundation, Inc.
|
2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of BFD, the Binary File Descriptor library.
|
This file is part of BFD, the Binary File Descriptor library.
|
||||||
|
|
||||||
@ -125,6 +125,9 @@
|
|||||||
#ifndef elf_backend_want_got_sym
|
#ifndef elf_backend_want_got_sym
|
||||||
#define elf_backend_want_got_sym 1
|
#define elf_backend_want_got_sym 1
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef elf_backend_gc_mark_dynamic_ref
|
||||||
|
#define elf_backend_gc_mark_dynamic_ref bfd_elf_gc_mark_dynamic_ref_symbol
|
||||||
|
#endif
|
||||||
#ifndef elf_backend_gc_mark_hook
|
#ifndef elf_backend_gc_mark_hook
|
||||||
#define elf_backend_gc_mark_hook NULL
|
#define elf_backend_gc_mark_hook NULL
|
||||||
#endif
|
#endif
|
||||||
@ -587,6 +590,7 @@ static const struct elf_backend_data elfNN_bed =
|
|||||||
elf_backend_final_write_processing,
|
elf_backend_final_write_processing,
|
||||||
elf_backend_additional_program_headers,
|
elf_backend_additional_program_headers,
|
||||||
elf_backend_modify_segment_map,
|
elf_backend_modify_segment_map,
|
||||||
|
elf_backend_gc_mark_dynamic_ref,
|
||||||
elf_backend_gc_mark_hook,
|
elf_backend_gc_mark_hook,
|
||||||
elf_backend_gc_sweep_hook,
|
elf_backend_gc_sweep_hook,
|
||||||
elf_backend_post_process_headers,
|
elf_backend_post_process_headers,
|
||||||
|
Reference in New Issue
Block a user