| Index: bfd/coff-ppc.c
|
| diff --git a/bfd/coff-ppc.c b/bfd/coff-ppc.c
|
| index b37a2247bc86d6d5ace69dff5bcfb12feadf751f..fa04933faffe0395373be22260e1da2a2bbe5672 100644
|
| --- a/bfd/coff-ppc.c
|
| +++ b/bfd/coff-ppc.c
|
| @@ -1,7 +1,7 @@
|
| /* BFD back-end for PowerPC Microsoft Portable Executable files.
|
| Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
| - 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
| - Free Software Foundation, Inc.
|
| + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
|
| + 2012 Free Software Foundation, Inc.
|
|
|
| Original version pieced together by Kim Knuttila (krk@cygnus.com)
|
|
|
| @@ -52,9 +52,8 @@
|
|
|
| /* This file is compiled more than once, but we only compile the
|
| final_link routine once. */
|
| -extern bfd_boolean ppc_bfd_coff_final_link
|
| - PARAMS ((bfd *, struct bfd_link_info *));
|
| -extern void dump_toc PARAMS ((PTR));
|
| +extern bfd_boolean ppc_bfd_coff_final_link (bfd *, struct bfd_link_info *);
|
| +extern void dump_toc (void *);
|
|
|
| /* The toc is a set of bfd_vma fields. We use the fact that valid
|
| addresses are even (i.e. the bit representing "1" is off) to allow
|
| @@ -123,26 +122,12 @@ struct ppc_coff_link_hash_table
|
| struct coff_link_hash_table root; /* First entry, as required. */
|
| };
|
|
|
| -static struct bfd_hash_entry *ppc_coff_link_hash_newfunc
|
| - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *,
|
| - const char *));
|
| -static struct bfd_link_hash_table *ppc_coff_link_hash_table_create
|
| - PARAMS ((bfd *));
|
| -static bfd_boolean coff_ppc_relocate_section
|
| - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
|
| - struct internal_reloc *, struct internal_syment *, asection **));
|
| -static reloc_howto_type *coff_ppc_rtype_to_howto
|
| - PARAMS ((bfd *, asection *, struct internal_reloc *,
|
| - struct coff_link_hash_entry *, struct internal_syment *,
|
| - bfd_vma *));
|
| -
|
| /* Routine to create an entry in the link hash table. */
|
|
|
| static struct bfd_hash_entry *
|
| -ppc_coff_link_hash_newfunc (entry, table, string)
|
| - struct bfd_hash_entry *entry;
|
| - struct bfd_hash_table *table;
|
| - const char *string;
|
| +ppc_coff_link_hash_newfunc (struct bfd_hash_entry * entry,
|
| + struct bfd_hash_table * table,
|
| + const char * string)
|
| {
|
| struct ppc_coff_link_hash_entry *ret =
|
| (struct ppc_coff_link_hash_entry *) entry;
|
| @@ -180,9 +165,10 @@ ppc_coff_link_hash_newfunc (entry, table, string)
|
| static bfd_boolean
|
| ppc_coff_link_hash_table_init (struct ppc_coff_link_hash_table *table,
|
| bfd *abfd,
|
| - struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *,
|
| - struct bfd_hash_table *,
|
| - const char *),
|
| + struct bfd_hash_entry *(*newfunc)
|
| + (struct bfd_hash_entry *,
|
| + struct bfd_hash_table *,
|
| + const char *),
|
| unsigned int entsize)
|
| {
|
| return _bfd_coff_link_hash_table_init (&table->root, abfd, newfunc, entsize);
|
| @@ -191,8 +177,7 @@ ppc_coff_link_hash_table_init (struct ppc_coff_link_hash_table *table,
|
| /* Create a PE linker hash table. */
|
|
|
| static struct bfd_link_hash_table *
|
| -ppc_coff_link_hash_table_create (abfd)
|
| - bfd *abfd;
|
| +ppc_coff_link_hash_table_create (bfd *abfd)
|
| {
|
| struct ppc_coff_link_hash_table *ret;
|
| bfd_size_type amt = sizeof (struct ppc_coff_link_hash_table);
|
| @@ -314,55 +299,19 @@ ppc_coff_link_hash_table_create (abfd)
|
| /* Static helper functions to make relocation work. */
|
| /* (Work In Progress) */
|
|
|
| -static bfd_reloc_status_type ppc_refhi_reloc PARAMS ((bfd *abfd,
|
| - arelent *reloc,
|
| - asymbol *symbol,
|
| - PTR data,
|
| - asection *section,
|
| - bfd *output_bfd,
|
| - char **error));
|
| -static bfd_reloc_status_type ppc_pair_reloc PARAMS ((bfd *abfd,
|
| - arelent *reloc,
|
| - asymbol *symbol,
|
| - PTR data,
|
| - asection *section,
|
| - bfd *output_bfd,
|
| - char **error));
|
| -
|
| -static bfd_reloc_status_type ppc_toc16_reloc PARAMS ((bfd *abfd,
|
| - arelent *reloc,
|
| - asymbol *symbol,
|
| - PTR data,
|
| - asection *section,
|
| - bfd *output_bfd,
|
| - char **error));
|
| -
|
| -static bfd_reloc_status_type ppc_section_reloc PARAMS ((bfd *abfd,
|
| - arelent *reloc,
|
| - asymbol *symbol,
|
| - PTR data,
|
| - asection *section,
|
| - bfd *output_bfd,
|
| - char **error));
|
| -
|
| -static bfd_reloc_status_type ppc_secrel_reloc PARAMS ((bfd *abfd,
|
| - arelent *reloc,
|
| - asymbol *symbol,
|
| - PTR data,
|
| - asection *section,
|
| - bfd *output_bfd,
|
| - char **error));
|
| -
|
| -static bfd_reloc_status_type ppc_imglue_reloc PARAMS ((bfd *abfd,
|
| - arelent *reloc,
|
| - asymbol *symbol,
|
| - PTR data,
|
| - asection *section,
|
| - bfd *output_bfd,
|
| - char **error));
|
| -
|
| -static bfd_boolean in_reloc_p PARAMS((bfd *abfd, reloc_howto_type *howto));
|
| -
|
| +static bfd_reloc_status_type ppc_refhi_reloc
|
| + (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
|
| +static bfd_reloc_status_type ppc_pair_reloc
|
| + (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
|
| +static bfd_reloc_status_type ppc_toc16_reloc
|
| + (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
|
| +static bfd_reloc_status_type ppc_section_reloc
|
| + (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
|
| +static bfd_reloc_status_type ppc_secrel_reloc
|
| + (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
|
| +static bfd_reloc_status_type ppc_imglue_reloc
|
| + (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
|
| +
|
| /* FIXME: It'll take a while to get through all of these. I only need a few to
|
| get us started, so those I'll make sure work. Those marked FIXME are either
|
| completely unverified or have a specific unknown marked in the comment. */
|
| @@ -816,15 +765,11 @@ struct list_ele
|
| extern struct list_ele *head;
|
| extern struct list_ele *tail;
|
|
|
| -static void record_toc
|
| - PARAMS ((asection *, bfd_signed_vma, enum ref_category, const char *));
|
| -
|
| static void
|
| -record_toc (toc_section, our_toc_offset, cat, name)
|
| - asection *toc_section;
|
| - bfd_signed_vma our_toc_offset;
|
| - enum ref_category cat;
|
| - const char *name;
|
| +record_toc (asection *toc_section,
|
| + bfd_signed_vma our_toc_offset,
|
| + enum ref_category cat,
|
| + const char *name)
|
| {
|
| /* Add this entry to our toc addr-offset-name list. */
|
| bfd_size_type amt = sizeof (struct list_ele);
|
| @@ -852,19 +797,13 @@ record_toc (toc_section, our_toc_offset, cat, name)
|
|
|
| #ifdef COFF_IMAGE_WITH_PE
|
|
|
| -static bfd_boolean ppc_record_toc_entry
|
| - PARAMS ((bfd *, struct bfd_link_info *, asection *, int, enum toc_type));
|
| -static void ppc_mark_symbol_as_glue
|
| - PARAMS ((bfd *, int, struct internal_reloc *));
|
| -
|
| /* Record a toc offset against a symbol. */
|
| static bfd_boolean
|
| -ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
|
| - bfd *abfd;
|
| - struct bfd_link_info *info ATTRIBUTE_UNUSED;
|
| - asection *sec ATTRIBUTE_UNUSED;
|
| - int sym;
|
| - enum toc_type toc_kind ATTRIBUTE_UNUSED;
|
| +ppc_record_toc_entry (bfd *abfd,
|
| + struct bfd_link_info *info ATTRIBUTE_UNUSED,
|
| + asection *sec ATTRIBUTE_UNUSED,
|
| + int sym,
|
| + enum toc_type toc_kind ATTRIBUTE_UNUSED)
|
| {
|
| struct ppc_coff_link_hash_entry *h;
|
| int *local_syms;
|
| @@ -937,10 +876,9 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
|
|
|
| /* Record a toc offset against a symbol. */
|
| static void
|
| -ppc_mark_symbol_as_glue(abfd, sym, rel)
|
| - bfd *abfd;
|
| - int sym;
|
| - struct internal_reloc *rel;
|
| +ppc_mark_symbol_as_glue (bfd *abfd,
|
| + int sym,
|
| + struct internal_reloc *rel)
|
| {
|
| struct ppc_coff_link_hash_entry *h;
|
|
|
| @@ -959,9 +897,9 @@ ppc_mark_symbol_as_glue(abfd, sym, rel)
|
| /* Return TRUE if this relocation should
|
| appear in the output .reloc section. */
|
|
|
| -static bfd_boolean in_reloc_p(abfd, howto)
|
| - bfd * abfd ATTRIBUTE_UNUSED;
|
| - reloc_howto_type *howto;
|
| +static bfd_boolean
|
| +in_reloc_p (bfd * abfd ATTRIBUTE_UNUSED,
|
| + reloc_howto_type *howto)
|
| {
|
| return
|
| (! howto->pc_relative)
|
| @@ -993,16 +931,14 @@ write_base_file_entry (bfd *obfd, struct bfd_link_info *info, bfd_vma addr)
|
| /* The reloc processing routine for the optimized COFF linker. */
|
|
|
| static bfd_boolean
|
| -coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
|
| - contents, relocs, syms, sections)
|
| - bfd *output_bfd;
|
| - struct bfd_link_info *info;
|
| - bfd *input_bfd;
|
| - asection *input_section;
|
| - bfd_byte *contents;
|
| - struct internal_reloc *relocs;
|
| - struct internal_syment *syms;
|
| - asection **sections;
|
| +coff_ppc_relocate_section (bfd *output_bfd,
|
| + struct bfd_link_info *info,
|
| + bfd *input_bfd,
|
| + asection *input_section,
|
| + bfd_byte *contents,
|
| + struct internal_reloc *relocs,
|
| + struct internal_syment *syms,
|
| + asection **sections)
|
| {
|
| struct internal_reloc *rel;
|
| struct internal_reloc *relend;
|
| @@ -1523,8 +1459,7 @@ static char *
|
| h3 = N_(" Offset spelling (if present)\n");
|
|
|
| void
|
| -dump_toc (vfile)
|
| - PTR vfile;
|
| +dump_toc (void * vfile)
|
| {
|
| FILE *file = (FILE *) vfile;
|
| struct list_ele *t;
|
| @@ -1570,8 +1505,7 @@ dump_toc (vfile)
|
| }
|
|
|
| bfd_boolean
|
| -ppc_allocate_toc_section (info)
|
| - struct bfd_link_info *info ATTRIBUTE_UNUSED;
|
| +ppc_allocate_toc_section (struct bfd_link_info *info ATTRIBUTE_UNUSED)
|
| {
|
| asection *s;
|
| bfd_byte *foo;
|
| @@ -1601,9 +1535,8 @@ ppc_allocate_toc_section (info)
|
| }
|
|
|
| bfd_boolean
|
| -ppc_process_before_allocation (abfd, info)
|
| - bfd *abfd;
|
| - struct bfd_link_info *info;
|
| +ppc_process_before_allocation (bfd *abfd,
|
| + struct bfd_link_info *info)
|
| {
|
| asection *sec;
|
| struct internal_reloc *i, *rel;
|
| @@ -1664,15 +1597,13 @@ ppc_process_before_allocation (abfd, info)
|
| #endif
|
|
|
| static bfd_reloc_status_type
|
| -ppc_refhi_reloc (abfd, reloc_entry, symbol, data,
|
| - input_section, output_bfd, error_message)
|
| - bfd *abfd ATTRIBUTE_UNUSED;
|
| - arelent *reloc_entry ATTRIBUTE_UNUSED;
|
| - asymbol *symbol ATTRIBUTE_UNUSED;
|
| - PTR data ATTRIBUTE_UNUSED;
|
| - asection *input_section ATTRIBUTE_UNUSED;
|
| - bfd *output_bfd;
|
| - char **error_message ATTRIBUTE_UNUSED;
|
| +ppc_refhi_reloc (bfd *abfd ATTRIBUTE_UNUSED,
|
| + arelent *reloc_entry ATTRIBUTE_UNUSED,
|
| + asymbol *symbol ATTRIBUTE_UNUSED,
|
| + void * data ATTRIBUTE_UNUSED,
|
| + asection *input_section ATTRIBUTE_UNUSED,
|
| + bfd *output_bfd,
|
| + char **error_message ATTRIBUTE_UNUSED)
|
| {
|
| UN_IMPL("REFHI");
|
| DUMP_RELOC("REFHI",reloc_entry);
|
| @@ -1684,15 +1615,13 @@ ppc_refhi_reloc (abfd, reloc_entry, symbol, data,
|
| }
|
|
|
| static bfd_reloc_status_type
|
| -ppc_pair_reloc (abfd, reloc_entry, symbol, data,
|
| - input_section, output_bfd, error_message)
|
| - bfd *abfd ATTRIBUTE_UNUSED;
|
| - arelent *reloc_entry ATTRIBUTE_UNUSED;
|
| - asymbol *symbol ATTRIBUTE_UNUSED;
|
| - PTR data ATTRIBUTE_UNUSED;
|
| - asection *input_section ATTRIBUTE_UNUSED;
|
| - bfd *output_bfd;
|
| - char **error_message ATTRIBUTE_UNUSED;
|
| +ppc_pair_reloc (bfd *abfd ATTRIBUTE_UNUSED,
|
| + arelent *reloc_entry ATTRIBUTE_UNUSED,
|
| + asymbol *symbol ATTRIBUTE_UNUSED,
|
| + void * data ATTRIBUTE_UNUSED,
|
| + asection *input_section ATTRIBUTE_UNUSED,
|
| + bfd *output_bfd,
|
| + char **error_message ATTRIBUTE_UNUSED)
|
| {
|
| UN_IMPL("PAIR");
|
| DUMP_RELOC("PAIR",reloc_entry);
|
| @@ -1702,17 +1631,15 @@ ppc_pair_reloc (abfd, reloc_entry, symbol, data,
|
|
|
| return bfd_reloc_undefined;
|
| }
|
| -
|
| +
|
| static bfd_reloc_status_type
|
| -ppc_toc16_reloc (abfd, reloc_entry, symbol, data,
|
| - input_section, output_bfd, error_message)
|
| - bfd *abfd ATTRIBUTE_UNUSED;
|
| - arelent *reloc_entry ATTRIBUTE_UNUSED;
|
| - asymbol *symbol ATTRIBUTE_UNUSED;
|
| - PTR data ATTRIBUTE_UNUSED;
|
| - asection *input_section ATTRIBUTE_UNUSED;
|
| - bfd *output_bfd;
|
| - char **error_message ATTRIBUTE_UNUSED;
|
| +ppc_toc16_reloc (bfd *abfd ATTRIBUTE_UNUSED,
|
| + arelent *reloc_entry ATTRIBUTE_UNUSED,
|
| + asymbol *symbol ATTRIBUTE_UNUSED,
|
| + void * data ATTRIBUTE_UNUSED,
|
| + asection *input_section ATTRIBUTE_UNUSED,
|
| + bfd *output_bfd,
|
| + char **error_message ATTRIBUTE_UNUSED)
|
| {
|
| UN_IMPL ("TOCREL16");
|
| DUMP_RELOC ("TOCREL16",reloc_entry);
|
| @@ -1724,15 +1651,13 @@ ppc_toc16_reloc (abfd, reloc_entry, symbol, data,
|
| }
|
|
|
| static bfd_reloc_status_type
|
| -ppc_secrel_reloc (abfd, reloc_entry, symbol, data,
|
| - input_section, output_bfd, error_message)
|
| - bfd *abfd ATTRIBUTE_UNUSED;
|
| - arelent *reloc_entry ATTRIBUTE_UNUSED;
|
| - asymbol *symbol ATTRIBUTE_UNUSED;
|
| - PTR data ATTRIBUTE_UNUSED;
|
| - asection *input_section ATTRIBUTE_UNUSED;
|
| - bfd *output_bfd;
|
| - char **error_message ATTRIBUTE_UNUSED;
|
| +ppc_secrel_reloc (bfd *abfd ATTRIBUTE_UNUSED,
|
| + arelent *reloc_entry ATTRIBUTE_UNUSED,
|
| + asymbol *symbol ATTRIBUTE_UNUSED,
|
| + void * data ATTRIBUTE_UNUSED,
|
| + asection *input_section ATTRIBUTE_UNUSED,
|
| + bfd *output_bfd,
|
| + char **error_message ATTRIBUTE_UNUSED)
|
| {
|
| UN_IMPL("SECREL");
|
| DUMP_RELOC("SECREL",reloc_entry);
|
| @@ -1744,15 +1669,13 @@ ppc_secrel_reloc (abfd, reloc_entry, symbol, data,
|
| }
|
|
|
| static bfd_reloc_status_type
|
| -ppc_section_reloc (abfd, reloc_entry, symbol, data,
|
| - input_section, output_bfd, error_message)
|
| - bfd *abfd ATTRIBUTE_UNUSED;
|
| - arelent *reloc_entry ATTRIBUTE_UNUSED;
|
| - asymbol *symbol ATTRIBUTE_UNUSED;
|
| - PTR data ATTRIBUTE_UNUSED;
|
| - asection *input_section ATTRIBUTE_UNUSED;
|
| - bfd *output_bfd;
|
| - char **error_message ATTRIBUTE_UNUSED;
|
| +ppc_section_reloc (bfd *abfd ATTRIBUTE_UNUSED,
|
| + arelent *reloc_entry ATTRIBUTE_UNUSED,
|
| + asymbol *symbol ATTRIBUTE_UNUSED,
|
| + void * data ATTRIBUTE_UNUSED,
|
| + asection *input_section ATTRIBUTE_UNUSED,
|
| + bfd *output_bfd,
|
| + char **error_message ATTRIBUTE_UNUSED)
|
| {
|
| UN_IMPL("SECTION");
|
| DUMP_RELOC("SECTION",reloc_entry);
|
| @@ -1764,15 +1687,14 @@ ppc_section_reloc (abfd, reloc_entry, symbol, data,
|
| }
|
|
|
| static bfd_reloc_status_type
|
| -ppc_imglue_reloc (abfd, reloc_entry, symbol, data,
|
| - input_section, output_bfd, error_message)
|
| - bfd *abfd ATTRIBUTE_UNUSED;
|
| - arelent *reloc_entry ATTRIBUTE_UNUSED;
|
| - asymbol *symbol ATTRIBUTE_UNUSED;
|
| - PTR data ATTRIBUTE_UNUSED;
|
| - asection *input_section ATTRIBUTE_UNUSED;
|
| - bfd *output_bfd;
|
| - char **error_message ATTRIBUTE_UNUSED;
|
| +ppc_imglue_reloc (bfd *abfd ATTRIBUTE_UNUSED,
|
| + arelent *reloc_entry ATTRIBUTE_UNUSED,
|
| + asymbol *symbol ATTRIBUTE_UNUSED,
|
| + void * data ATTRIBUTE_UNUSED,
|
| + asection *input_section ATTRIBUTE_UNUSED,
|
| + bfd *output_bfd,
|
| + char **error_message ATTRIBUTE_UNUSED)
|
| +
|
| {
|
| UN_IMPL("IMGLUE");
|
| DUMP_RELOC("IMGLUE",reloc_entry);
|
| @@ -1789,12 +1711,9 @@ ppc_imglue_reloc (abfd, reloc_entry, symbol, data,
|
| /* FIXME: There is a possibility that when we read in a reloc from a file,
|
| that there are some bits encoded in the upper portion of the
|
| type field. Not yet implemented. */
|
| -static void ppc_coff_rtype2howto PARAMS ((arelent *, struct internal_reloc *));
|
|
|
| static void
|
| -ppc_coff_rtype2howto (relent, internal)
|
| - arelent *relent;
|
| - struct internal_reloc *internal;
|
| +ppc_coff_rtype2howto (arelent *relent, struct internal_reloc *internal)
|
| {
|
| /* We can encode one of three things in the type field, aside from the
|
| type:
|
| @@ -1854,13 +1773,12 @@ ppc_coff_rtype2howto (relent, internal)
|
| }
|
|
|
| static reloc_howto_type *
|
| -coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
|
| - bfd *abfd ATTRIBUTE_UNUSED;
|
| - asection *sec;
|
| - struct internal_reloc *rel;
|
| - struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
|
| - struct internal_syment *sym ATTRIBUTE_UNUSED;
|
| - bfd_vma *addendp;
|
| +coff_ppc_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
|
| + asection *sec,
|
| + struct internal_reloc *rel,
|
| + struct coff_link_hash_entry *h ATTRIBUTE_UNUSED,
|
| + struct internal_syment *sym ATTRIBUTE_UNUSED,
|
| + bfd_vma *addendp)
|
| {
|
| reloc_howto_type *howto;
|
|
|
| @@ -1929,13 +1847,9 @@ coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
|
| #define HOW2MAP(bfd_rtype,ppc_rtype) \
|
| case bfd_rtype: return &ppc_coff_howto_table[ppc_rtype]
|
|
|
| -static reloc_howto_type *ppc_coff_reloc_type_lookup
|
| -PARAMS ((bfd *, bfd_reloc_code_real_type));
|
| -
|
| static reloc_howto_type *
|
| -ppc_coff_reloc_type_lookup (abfd, code)
|
| - bfd *abfd ATTRIBUTE_UNUSED;
|
| - bfd_reloc_code_real_type code;
|
| +ppc_coff_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
| + bfd_reloc_code_real_type code)
|
| {
|
| switch (code)
|
| {
|
| @@ -2012,12 +1926,8 @@ ppc_coff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
|
|
| #ifndef COFF_IMAGE_WITH_PE
|
|
|
| -static bfd_boolean ppc_do_last PARAMS ((bfd *));
|
| -static bfd *ppc_get_last PARAMS ((void));
|
| -
|
| static bfd_boolean
|
| -ppc_do_last (abfd)
|
| - bfd *abfd;
|
| +ppc_do_last (bfd *abfd)
|
| {
|
| if (abfd == bfd_of_toc_owner)
|
| return TRUE;
|
| @@ -2026,7 +1936,7 @@ ppc_do_last (abfd)
|
| }
|
|
|
| static bfd *
|
| -ppc_get_last()
|
| +ppc_get_last (void)
|
| {
|
| return bfd_of_toc_owner;
|
| }
|
| @@ -2045,12 +1955,10 @@ ppc_get_last()
|
| /* Do the final link step. */
|
|
|
| bfd_boolean
|
| -ppc_bfd_coff_final_link (abfd, info)
|
| - bfd *abfd;
|
| - struct bfd_link_info *info;
|
| +ppc_bfd_coff_final_link (bfd *abfd, struct bfd_link_info *info)
|
| {
|
| bfd_size_type symesz;
|
| - struct coff_final_link_info finfo;
|
| + struct coff_final_link_info flaginfo;
|
| bfd_boolean debug_merge_allocated;
|
| asection *o;
|
| struct bfd_link_order *p;
|
| @@ -2070,29 +1978,29 @@ ppc_bfd_coff_final_link (abfd, info)
|
|
|
| symesz = bfd_coff_symesz (abfd);
|
|
|
| - finfo.info = info;
|
| - finfo.output_bfd = abfd;
|
| - finfo.strtab = NULL;
|
| - finfo.section_info = NULL;
|
| - finfo.last_file_index = -1;
|
| - finfo.last_bf_index = -1;
|
| - finfo.internal_syms = NULL;
|
| - finfo.sec_ptrs = NULL;
|
| - finfo.sym_indices = NULL;
|
| - finfo.outsyms = NULL;
|
| - finfo.linenos = NULL;
|
| - finfo.contents = NULL;
|
| - finfo.external_relocs = NULL;
|
| - finfo.internal_relocs = NULL;
|
| + flaginfo.info = info;
|
| + flaginfo.output_bfd = abfd;
|
| + flaginfo.strtab = NULL;
|
| + flaginfo.section_info = NULL;
|
| + flaginfo.last_file_index = -1;
|
| + flaginfo.last_bf_index = -1;
|
| + flaginfo.internal_syms = NULL;
|
| + flaginfo.sec_ptrs = NULL;
|
| + flaginfo.sym_indices = NULL;
|
| + flaginfo.outsyms = NULL;
|
| + flaginfo.linenos = NULL;
|
| + flaginfo.contents = NULL;
|
| + flaginfo.external_relocs = NULL;
|
| + flaginfo.internal_relocs = NULL;
|
| debug_merge_allocated = FALSE;
|
|
|
| coff_data (abfd)->link_info = info;
|
|
|
| - finfo.strtab = _bfd_stringtab_init ();
|
| - if (finfo.strtab == NULL)
|
| + flaginfo.strtab = _bfd_stringtab_init ();
|
| + if (flaginfo.strtab == NULL)
|
| goto error_return;
|
|
|
| - if (! coff_debug_merge_hash_table_init (&finfo.debug_merge))
|
| + if (! coff_debug_merge_hash_table_init (&flaginfo.debug_merge))
|
| goto error_return;
|
| debug_merge_allocated = TRUE;
|
|
|
| @@ -2171,15 +2079,15 @@ ppc_bfd_coff_final_link (abfd, info)
|
| the target_index fields are 1 based. */
|
| amt = abfd->section_count + 1;
|
| amt *= sizeof (struct coff_link_section_info);
|
| - finfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt);
|
| + flaginfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt);
|
|
|
| - if (finfo.section_info == NULL)
|
| + if (flaginfo.section_info == NULL)
|
| goto error_return;
|
|
|
| for (i = 0; i <= abfd->section_count; i++)
|
| {
|
| - finfo.section_info[i].relocs = NULL;
|
| - finfo.section_info[i].rel_hashes = NULL;
|
| + flaginfo.section_info[i].relocs = NULL;
|
| + flaginfo.section_info[i].rel_hashes = NULL;
|
| }
|
| }
|
|
|
| @@ -2217,14 +2125,14 @@ ppc_bfd_coff_final_link (abfd, info)
|
| BFD_ASSERT (info->relocatable);
|
| amt = o->reloc_count;
|
| amt *= sizeof (struct internal_reloc);
|
| - finfo.section_info[o->target_index].relocs =
|
| + flaginfo.section_info[o->target_index].relocs =
|
| (struct internal_reloc *) bfd_malloc (amt);
|
| amt = o->reloc_count;
|
| amt *= sizeof (struct coff_link_hash_entry *);
|
| - finfo.section_info[o->target_index].rel_hashes =
|
| + flaginfo.section_info[o->target_index].rel_hashes =
|
| (struct coff_link_hash_entry **) bfd_malloc (amt);
|
| - if (finfo.section_info[o->target_index].relocs == NULL
|
| - || finfo.section_info[o->target_index].rel_hashes == NULL)
|
| + if (flaginfo.section_info[o->target_index].relocs == NULL
|
| + || flaginfo.section_info[o->target_index].rel_hashes == NULL)
|
| goto error_return;
|
|
|
| if (o->reloc_count > max_output_reloc_count)
|
| @@ -2255,31 +2163,31 @@ ppc_bfd_coff_final_link (abfd, info)
|
|
|
| /* Allocate some buffers used while linking. */
|
| amt = max_sym_count * sizeof (struct internal_syment);
|
| - finfo.internal_syms = (struct internal_syment *) bfd_malloc (amt);
|
| + flaginfo.internal_syms = (struct internal_syment *) bfd_malloc (amt);
|
| amt = max_sym_count * sizeof (asection *);
|
| - finfo.sec_ptrs = (asection **) bfd_malloc (amt);
|
| + flaginfo.sec_ptrs = (asection **) bfd_malloc (amt);
|
| amt = max_sym_count * sizeof (long);
|
| - finfo.sym_indices = (long *) bfd_malloc (amt);
|
| + flaginfo.sym_indices = (long *) bfd_malloc (amt);
|
| amt = (max_sym_count + 1) * symesz;
|
| - finfo.outsyms = (bfd_byte *) bfd_malloc (amt);
|
| + flaginfo.outsyms = (bfd_byte *) bfd_malloc (amt);
|
| amt = max_lineno_count * bfd_coff_linesz (abfd);
|
| - finfo.linenos = (bfd_byte *) bfd_malloc (amt);
|
| - finfo.contents = (bfd_byte *) bfd_malloc (max_contents_size);
|
| - finfo.external_relocs = (bfd_byte *) bfd_malloc (max_reloc_count * relsz);
|
| + flaginfo.linenos = (bfd_byte *) bfd_malloc (amt);
|
| + flaginfo.contents = (bfd_byte *) bfd_malloc (max_contents_size);
|
| + flaginfo.external_relocs = (bfd_byte *) bfd_malloc (max_reloc_count * relsz);
|
| if (! info->relocatable)
|
| {
|
| amt = max_reloc_count * sizeof (struct internal_reloc);
|
| - finfo.internal_relocs = (struct internal_reloc *) bfd_malloc (amt);
|
| + flaginfo.internal_relocs = (struct internal_reloc *) bfd_malloc (amt);
|
| }
|
| - if ((finfo.internal_syms == NULL && max_sym_count > 0)
|
| - || (finfo.sec_ptrs == NULL && max_sym_count > 0)
|
| - || (finfo.sym_indices == NULL && max_sym_count > 0)
|
| - || finfo.outsyms == NULL
|
| - || (finfo.linenos == NULL && max_lineno_count > 0)
|
| - || (finfo.contents == NULL && max_contents_size > 0)
|
| - || (finfo.external_relocs == NULL && max_reloc_count > 0)
|
| + if ((flaginfo.internal_syms == NULL && max_sym_count > 0)
|
| + || (flaginfo.sec_ptrs == NULL && max_sym_count > 0)
|
| + || (flaginfo.sym_indices == NULL && max_sym_count > 0)
|
| + || flaginfo.outsyms == NULL
|
| + || (flaginfo.linenos == NULL && max_lineno_count > 0)
|
| + || (flaginfo.contents == NULL && max_contents_size > 0)
|
| + || (flaginfo.external_relocs == NULL && max_reloc_count > 0)
|
| || (! info->relocatable
|
| - && finfo.internal_relocs == NULL
|
| + && flaginfo.internal_relocs == NULL
|
| && max_reloc_count > 0))
|
| goto error_return;
|
|
|
| @@ -2311,7 +2219,7 @@ ppc_bfd_coff_final_link (abfd, info)
|
| if (! sub->output_has_begun)
|
| #endif
|
| {
|
| - if (! _bfd_coff_link_input_bfd (&finfo, sub))
|
| + if (! _bfd_coff_link_input_bfd (&flaginfo, sub))
|
| goto error_return;
|
| sub->output_has_begun = TRUE;
|
| }
|
| @@ -2319,7 +2227,7 @@ ppc_bfd_coff_final_link (abfd, info)
|
| else if (p->type == bfd_section_reloc_link_order
|
| || p->type == bfd_symbol_reloc_link_order)
|
| {
|
| - if (! _bfd_coff_reloc_link_order (abfd, &finfo, o, p))
|
| + if (! _bfd_coff_reloc_link_order (abfd, &flaginfo, o, p))
|
| goto error_return;
|
| }
|
| else
|
| @@ -2335,7 +2243,7 @@ ppc_bfd_coff_final_link (abfd, info)
|
| bfd* last_one = ppc_get_last();
|
| if (last_one)
|
| {
|
| - if (! _bfd_coff_link_input_bfd (&finfo, last_one))
|
| + if (! _bfd_coff_link_input_bfd (&flaginfo, last_one))
|
| goto error_return;
|
| }
|
| last_one->output_has_begun = TRUE;
|
| @@ -2343,73 +2251,73 @@ ppc_bfd_coff_final_link (abfd, info)
|
| #endif
|
|
|
| /* Free up the buffers used by _bfd_coff_link_input_bfd. */
|
| - coff_debug_merge_hash_table_free (&finfo.debug_merge);
|
| + coff_debug_merge_hash_table_free (&flaginfo.debug_merge);
|
| debug_merge_allocated = FALSE;
|
|
|
| - if (finfo.internal_syms != NULL)
|
| + if (flaginfo.internal_syms != NULL)
|
| {
|
| - free (finfo.internal_syms);
|
| - finfo.internal_syms = NULL;
|
| + free (flaginfo.internal_syms);
|
| + flaginfo.internal_syms = NULL;
|
| }
|
| - if (finfo.sec_ptrs != NULL)
|
| + if (flaginfo.sec_ptrs != NULL)
|
| {
|
| - free (finfo.sec_ptrs);
|
| - finfo.sec_ptrs = NULL;
|
| + free (flaginfo.sec_ptrs);
|
| + flaginfo.sec_ptrs = NULL;
|
| }
|
| - if (finfo.sym_indices != NULL)
|
| + if (flaginfo.sym_indices != NULL)
|
| {
|
| - free (finfo.sym_indices);
|
| - finfo.sym_indices = NULL;
|
| + free (flaginfo.sym_indices);
|
| + flaginfo.sym_indices = NULL;
|
| }
|
| - if (finfo.linenos != NULL)
|
| + if (flaginfo.linenos != NULL)
|
| {
|
| - free (finfo.linenos);
|
| - finfo.linenos = NULL;
|
| + free (flaginfo.linenos);
|
| + flaginfo.linenos = NULL;
|
| }
|
| - if (finfo.contents != NULL)
|
| + if (flaginfo.contents != NULL)
|
| {
|
| - free (finfo.contents);
|
| - finfo.contents = NULL;
|
| + free (flaginfo.contents);
|
| + flaginfo.contents = NULL;
|
| }
|
| - if (finfo.external_relocs != NULL)
|
| + if (flaginfo.external_relocs != NULL)
|
| {
|
| - free (finfo.external_relocs);
|
| - finfo.external_relocs = NULL;
|
| + free (flaginfo.external_relocs);
|
| + flaginfo.external_relocs = NULL;
|
| }
|
| - if (finfo.internal_relocs != NULL)
|
| + if (flaginfo.internal_relocs != NULL)
|
| {
|
| - free (finfo.internal_relocs);
|
| - finfo.internal_relocs = NULL;
|
| + free (flaginfo.internal_relocs);
|
| + flaginfo.internal_relocs = NULL;
|
| }
|
|
|
| /* The value of the last C_FILE symbol is supposed to be the symbol
|
| index of the first external symbol. Write it out again if
|
| necessary. */
|
| - if (finfo.last_file_index != -1
|
| - && (unsigned int) finfo.last_file.n_value != obj_raw_syment_count (abfd))
|
| + if (flaginfo.last_file_index != -1
|
| + && (unsigned int) flaginfo.last_file.n_value != obj_raw_syment_count (abfd))
|
| {
|
| file_ptr pos;
|
|
|
| - finfo.last_file.n_value = obj_raw_syment_count (abfd);
|
| - bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file,
|
| - (PTR) finfo.outsyms);
|
| - pos = obj_sym_filepos (abfd) + finfo.last_file_index * symesz;
|
| + flaginfo.last_file.n_value = obj_raw_syment_count (abfd);
|
| + bfd_coff_swap_sym_out (abfd, &flaginfo.last_file,
|
| + flaginfo.outsyms);
|
| + pos = obj_sym_filepos (abfd) + flaginfo.last_file_index * symesz;
|
| if (bfd_seek (abfd, pos, SEEK_SET) != 0
|
| - || bfd_bwrite (finfo.outsyms, symesz, abfd) != symesz)
|
| + || bfd_bwrite (flaginfo.outsyms, symesz, abfd) != symesz)
|
| return FALSE;
|
| }
|
|
|
| /* Write out the global symbols. */
|
| - finfo.failed = FALSE;
|
| - bfd_hash_traverse (&info->hash->table, _bfd_coff_write_global_sym, &finfo);
|
| - if (finfo.failed)
|
| + flaginfo.failed = FALSE;
|
| + bfd_hash_traverse (&info->hash->table, _bfd_coff_write_global_sym, &flaginfo);
|
| + if (flaginfo.failed)
|
| goto error_return;
|
|
|
| /* The outsyms buffer is used by _bfd_coff_write_global_sym. */
|
| - if (finfo.outsyms != NULL)
|
| + if (flaginfo.outsyms != NULL)
|
| {
|
| - free (finfo.outsyms);
|
| - finfo.outsyms = NULL;
|
| + free (flaginfo.outsyms);
|
| + flaginfo.outsyms = NULL;
|
| }
|
|
|
| if (info->relocatable)
|
| @@ -2432,9 +2340,9 @@ ppc_bfd_coff_final_link (abfd, info)
|
| if (o->reloc_count == 0)
|
| continue;
|
|
|
| - irel = finfo.section_info[o->target_index].relocs;
|
| + irel = flaginfo.section_info[o->target_index].relocs;
|
| irelend = irel + o->reloc_count;
|
| - rel_hash = finfo.section_info[o->target_index].rel_hashes;
|
| + rel_hash = flaginfo.section_info[o->target_index].rel_hashes;
|
| erel = external_relocs;
|
| for (; irel < irelend; irel++, rel_hash++, erel += relsz)
|
| {
|
| @@ -2443,12 +2351,12 @@ ppc_bfd_coff_final_link (abfd, info)
|
| BFD_ASSERT ((*rel_hash)->indx >= 0);
|
| irel->r_symndx = (*rel_hash)->indx;
|
| }
|
| - bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel);
|
| + bfd_coff_swap_reloc_out (abfd, irel, erel);
|
| }
|
|
|
| amt = relsz * o->reloc_count;
|
| if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
|
| - || bfd_bwrite ((PTR) external_relocs, amt, abfd) != amt)
|
| + || bfd_bwrite (external_relocs, amt, abfd) != amt)
|
| goto error_return;
|
| }
|
|
|
| @@ -2457,19 +2365,19 @@ ppc_bfd_coff_final_link (abfd, info)
|
| }
|
|
|
| /* Free up the section information. */
|
| - if (finfo.section_info != NULL)
|
| + if (flaginfo.section_info != NULL)
|
| {
|
| unsigned int i;
|
|
|
| for (i = 0; i < abfd->section_count; i++)
|
| {
|
| - if (finfo.section_info[i].relocs != NULL)
|
| - free (finfo.section_info[i].relocs);
|
| - if (finfo.section_info[i].rel_hashes != NULL)
|
| - free (finfo.section_info[i].rel_hashes);
|
| + if (flaginfo.section_info[i].relocs != NULL)
|
| + free (flaginfo.section_info[i].relocs);
|
| + if (flaginfo.section_info[i].rel_hashes != NULL)
|
| + free (flaginfo.section_info[i].rel_hashes);
|
| }
|
| - free (finfo.section_info);
|
| - finfo.section_info = NULL;
|
| + free (flaginfo.section_info);
|
| + flaginfo.section_info = NULL;
|
| }
|
|
|
| /* If we have optimized stabs strings, output them. */
|
| @@ -2490,7 +2398,7 @@ ppc_bfd_coff_final_link (abfd, info)
|
|
|
| #if STRING_SIZE_SIZE == 4
|
| H_PUT_32 (abfd,
|
| - _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE,
|
| + _bfd_stringtab_size (flaginfo.strtab) + STRING_SIZE_SIZE,
|
| strbuf);
|
| #else
|
| #error Change H_PUT_32 above
|
| @@ -2500,11 +2408,11 @@ ppc_bfd_coff_final_link (abfd, info)
|
| != STRING_SIZE_SIZE)
|
| return FALSE;
|
|
|
| - if (! _bfd_stringtab_emit (abfd, finfo.strtab))
|
| + if (! _bfd_stringtab_emit (abfd, flaginfo.strtab))
|
| return FALSE;
|
| }
|
|
|
| - _bfd_stringtab_free (finfo.strtab);
|
| + _bfd_stringtab_free (flaginfo.strtab);
|
|
|
| /* Setting bfd_get_symcount to 0 will cause write_object_contents to
|
| not try to write out the symbols. */
|
| @@ -2514,38 +2422,38 @@ ppc_bfd_coff_final_link (abfd, info)
|
|
|
| error_return:
|
| if (debug_merge_allocated)
|
| - coff_debug_merge_hash_table_free (&finfo.debug_merge);
|
| - if (finfo.strtab != NULL)
|
| - _bfd_stringtab_free (finfo.strtab);
|
| - if (finfo.section_info != NULL)
|
| + coff_debug_merge_hash_table_free (&flaginfo.debug_merge);
|
| + if (flaginfo.strtab != NULL)
|
| + _bfd_stringtab_free (flaginfo.strtab);
|
| + if (flaginfo.section_info != NULL)
|
| {
|
| unsigned int i;
|
|
|
| for (i = 0; i < abfd->section_count; i++)
|
| {
|
| - if (finfo.section_info[i].relocs != NULL)
|
| - free (finfo.section_info[i].relocs);
|
| - if (finfo.section_info[i].rel_hashes != NULL)
|
| - free (finfo.section_info[i].rel_hashes);
|
| + if (flaginfo.section_info[i].relocs != NULL)
|
| + free (flaginfo.section_info[i].relocs);
|
| + if (flaginfo.section_info[i].rel_hashes != NULL)
|
| + free (flaginfo.section_info[i].rel_hashes);
|
| }
|
| - free (finfo.section_info);
|
| + free (flaginfo.section_info);
|
| }
|
| - if (finfo.internal_syms != NULL)
|
| - free (finfo.internal_syms);
|
| - if (finfo.sec_ptrs != NULL)
|
| - free (finfo.sec_ptrs);
|
| - if (finfo.sym_indices != NULL)
|
| - free (finfo.sym_indices);
|
| - if (finfo.outsyms != NULL)
|
| - free (finfo.outsyms);
|
| - if (finfo.linenos != NULL)
|
| - free (finfo.linenos);
|
| - if (finfo.contents != NULL)
|
| - free (finfo.contents);
|
| - if (finfo.external_relocs != NULL)
|
| - free (finfo.external_relocs);
|
| - if (finfo.internal_relocs != NULL)
|
| - free (finfo.internal_relocs);
|
| + if (flaginfo.internal_syms != NULL)
|
| + free (flaginfo.internal_syms);
|
| + if (flaginfo.sec_ptrs != NULL)
|
| + free (flaginfo.sec_ptrs);
|
| + if (flaginfo.sym_indices != NULL)
|
| + free (flaginfo.sym_indices);
|
| + if (flaginfo.outsyms != NULL)
|
| + free (flaginfo.outsyms);
|
| + if (flaginfo.linenos != NULL)
|
| + free (flaginfo.linenos);
|
| + if (flaginfo.contents != NULL)
|
| + free (flaginfo.contents);
|
| + if (flaginfo.external_relocs != NULL)
|
| + free (flaginfo.external_relocs);
|
| + if (flaginfo.internal_relocs != NULL)
|
| + free (flaginfo.internal_relocs);
|
| if (external_relocs != NULL)
|
| free (external_relocs);
|
| return FALSE;
|
|
|