Add experimental support for --gc-sections with COFF and PE based targets.

PR ld/11539
bfd	* coffcode.h (coff_bfd_gc_sections): Define default
	to bfd_coff_gc_sections function.
	* cofflink.c (init_reloc_cookie): Copy and adjust coff
	related code about gc-sections from elflink.c to here.
	(fini_reloc_cookie): Likewise.
	(init_reloc_cookie_rels): Likewise.
	(fini_reloc_cookie_rels): Likewise.
	(init_reloc_cookie_for_section): Likewise.
	(fini_reloc_cookie_for_section): Likewise.
	(_bfd_coff_gc_mark_hook): Likewise.
	(_bfd_coff_gc_mark_rsec): Likewise.
	(_bfd_coff_gc_mark_reloc): Likewise.
	(_bfd_coff_gc_mark): Likewise.
	(_bfd_coff_gc_mark_extra_sections): Likewise.
	(coff_gc_sweep_symbol_info): Likewise.
	(coff_gc_sweep_symbol): Likewise.
	(gc_sweep_hook_fn): Likewise.
	(coff_gc_sweep): Likewise.
	(bfd_coff_gc_sections): Likewise.
	(_bfd_coff_gc_keep): Likewise.
	* libcoff.h (coff_reloc_cookie): New struct.
	(bfd_coff_gc_sections): New prototype.
	(coff_gc_mark_hook_fn): New type.

ld	* scripttempl/pep.sc: Mark .idata*, .CRT*, .tls*,
	.rsrc*, .init, .ctor*, .dtor*, .fini, .jcr,
	.eh_frame, .pdata. .xdata, and .gcc_except_table sections
	as KEEP.
	* scripttempl/pe.sc: Likewise.
This commit is contained in:
Kai Tietz
2015-07-03 15:50:29 +01:00
committed by Nick Clifton
parent b6b3dd8f31
commit 0f088b2a94
12 changed files with 572 additions and 53 deletions

View File

@@ -269,6 +269,16 @@ struct coff_link_hash_table
struct stab_info stab_info;
};
struct coff_reloc_cookie
{
struct internal_reloc * rels;
struct internal_reloc * rel;
struct internal_reloc * relend;
struct coff_symbol_struct * symbols; /* Symtab for input bfd. */
bfd * abfd;
struct coff_link_hash_entry ** sym_hashes;
};
/* Look up an entry in a COFF linker hash table. */
#define coff_link_hash_lookup(table, string, create, copy, follow) \
@@ -566,6 +576,8 @@ extern bfd_boolean _bfd_coff_link_input_bfd
extern bfd_boolean _bfd_coff_reloc_link_order
(bfd *, struct coff_final_link_info *, asection *,
struct bfd_link_order *);
extern bfd_boolean bfd_coff_gc_sections
(bfd *, struct bfd_link_info *);
#define coff_get_section_contents_in_window \
@@ -673,6 +685,10 @@ enum coff_symbol_classification
COFF_SYMBOL_PE_SECTION
};
typedef asection * (*coff_gc_mark_hook_fn)
(asection *, struct bfd_link_info *, struct internal_reloc *,
struct coff_link_hash_entry *, struct internal_syment *);
typedef struct
{
void (*_bfd_coff_swap_aux_in)