diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2b415efc47..d629360e93 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,24 @@ +2008-02-15 Alan Modra + + * elflink.c: Replace all accesses to hash->creator field with + output_bfd->xvec. + * cofflink.c: Likewise. + * coff-h8300.c: Likewise. + * ecoff.c: Likewise. + * elf32-m68hc1x.c: Likewise. + * elf32-ppc.c: Likewise. + * elf64-alpha.c: Likewise. + * elf64-ppc.c: Likewise. + * elf64-sparc.c: Likewise. + * elfxx-mips.c: Likewise. + * i386linux.c: Likewise. + * m68klinux.c: Likewise. + * sparclinux.c: Likewise. + * sunos.c: Likewise. + * xcofflink.c: Likewise. + * linker.c: Likewise. + (_bfd_link_hash_table_init): Don't store creator. + 2008-02-14 Peter Jones * efi-rtdrv-ia32.c: New file. diff --git a/bfd/coff-h8300.c b/bfd/coff-h8300.c index 0f8dbda1ea..5ff87aec8f 100644 --- a/bfd/coff-h8300.c +++ b/bfd/coff-h8300.c @@ -1,6 +1,6 @@ /* BFD back-end for Renesas H8/300 COFF binaries. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Written by Steve Chamberlain, . @@ -1116,11 +1116,11 @@ h8300_reloc16_extra_cases (bfd *abfd, struct bfd_link_info *link_info, struct h8300_coff_link_hash_table *htab; asection *vectors_sec; - if (link_info->hash->creator != abfd->xvec) + if (link_info->output_bfd->xvec != abfd->xvec) { (*_bfd_error_handler) (_("cannot handle R_MEM_INDIRECT reloc when using %s output"), - link_info->hash->creator->name); + link_info->output_bfd->xvec->name); /* What else can we do? This function doesn't allow return of an error, and we don't want to call abort as that @@ -1264,7 +1264,7 @@ h8300_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info) /* Add the symbols using the generic code. */ _bfd_generic_link_add_symbols (abfd, info); - if (info->hash->creator != abfd->xvec) + if (info->output_bfd->xvec != abfd->xvec) return TRUE; htab = h8300_coff_hash_table (info); diff --git a/bfd/cofflink.c b/bfd/cofflink.c index c6ca5595fc..19a7dd2b69 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -1,6 +1,6 @@ /* COFF specific linker code. Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Written by Ian Lance Taylor, Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -482,7 +482,7 @@ coff_link_add_symbols (bfd *abfd, (*sym_hash)->root.u.c.p->alignment_power = bfd_coff_default_section_alignment_power (abfd); - if (info->hash->creator->flavour == bfd_get_flavour (abfd)) + if (bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd)) { /* If we don't have any symbol information currently in the hash table, or if we are looking at a symbol @@ -574,7 +574,7 @@ coff_link_add_symbols (bfd *abfd, optimize the handling of any .stab/.stabstr sections. */ if (! info->relocatable && ! info->traditional_format - && info->hash->creator->flavour == bfd_get_flavour (abfd) + && bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd) && (info->strip != strip_all && info->strip != strip_debugger)) { asection *stabstr; diff --git a/bfd/ecoff.c b/bfd/ecoff.c index ead1f9bb2a..9b2a1c933d 100644 --- a/bfd/ecoff.c +++ b/bfd/ecoff.c @@ -3402,7 +3402,7 @@ ecoff_link_add_externals (bfd *abfd, /* If we are building an ECOFF hash table, save the external symbol information. */ - if (info->hash->creator->flavour == bfd_get_flavour (abfd)) + if (bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd)) { if (h->abfd == NULL || (! bfd_is_und_section (section) diff --git a/bfd/elf32-m68hc1x.c b/bfd/elf32-m68hc1x.c index 6fb5129926..9ad82b6e19 100644 --- a/bfd/elf32-m68hc1x.c +++ b/bfd/elf32-m68hc1x.c @@ -1,5 +1,5 @@ /* Motorola 68HC11/HC12-specific support for 32-bit ELF - Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 + Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Contributed by Stephane Carrez (stcarrez@nerim.fr) @@ -232,7 +232,7 @@ elf32_m68hc11_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info) htab = m68hc11_elf_hash_table (info); - if (htab->root.root.creator->flavour != bfd_target_elf_flavour) + if (bfd_get_flavour (info->output_bfd) != bfd_target_elf_flavour) return 0; /* Count the number of input BFDs and find the top input section id. diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 520f991162..2dedefdb2d 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -2772,7 +2772,7 @@ ppc_elf_add_symbol_hook (bfd *abfd, if (sym->st_shndx == SHN_COMMON && !info->relocatable && sym->st_size <= elf_gp_size (abfd) - && is_ppc_elf_target (info->hash->creator)) + && is_ppc_elf_target (info->output_bfd->xvec)) { /* Common symbols less than or equal to -G nn bytes are automatically put into .sbss. */ diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c index 94a7ed010a..308b4e9c70 100644 --- a/bfd/elf64-alpha.c +++ b/bfd/elf64-alpha.c @@ -3104,7 +3104,7 @@ elf64_alpha_relax_opt_call (struct alpha_relax_info *info, bfd_vma symval) /* We've now determined that we can skip an initial gp load. Verify that the call and the target use the same gp. */ - if (info->link_info->hash->creator != info->tsec->owner->xvec + if (info->link_info->output_bfd->xvec != info->tsec->owner->xvec || info->gotobj != alpha_elf_tdata (info->tsec->owner)->gotobj) return 0; diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 0dae3d75e5..35d6b64001 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -4275,7 +4275,7 @@ ppc64_elf_check_directives (bfd *ibfd, struct bfd_link_info *info) struct ppc_link_hash_entry **p, *eh; htab = ppc_hash_table (info); - if (!is_ppc64_elf_target (htab->elf.root.creator)) + if (!is_ppc64_elf_target (info->output_bfd->xvec)) return TRUE; if (is_ppc64_elf_target (ibfd->xvec)) diff --git a/bfd/elf64-sparc.c b/bfd/elf64-sparc.c index a93097f002..df3fb8bb80 100644 --- a/bfd/elf64-sparc.c +++ b/bfd/elf64-sparc.c @@ -1,6 +1,6 @@ /* SPARC-specific support for 64-bit ELF Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2007 Free Software Foundation, Inc. + 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -441,7 +441,7 @@ elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, return FALSE; } - if (info->hash->creator != abfd->xvec + if (info->output_bfd->xvec != abfd->xvec || (abfd->flags & DYNAMIC) != 0) { /* STT_REGISTER only works when linking an elf64_sparc object. @@ -510,7 +510,7 @@ elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, return TRUE; } else if (*namep && **namep - && info->hash->creator == abfd->xvec) + && info->output_bfd->xvec == abfd->xvec) { int i; struct _bfd_sparc_elf_app_reg *p; diff --git a/bfd/elflink.c b/bfd/elflink.c index a0bd0df41a..a00634be52 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -884,7 +884,7 @@ _bfd_elf_merge_symbol (bfd *abfd, /* This code is for coping with dynamic objects, and is only useful if we are doing an ELF link. */ - if (info->hash->creator != abfd->xvec) + if (info->output_bfd->xvec != abfd->xvec) return TRUE; /* For merging, we only care about real symbols. */ @@ -3336,7 +3336,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) the format of the output file. */ if (info->relocatable || !is_elf_hash_table (htab) - || htab->root.creator != abfd->xvec) + || info->output_bfd->xvec != abfd->xvec) { if (info->relocatable) bfd_set_error (bfd_error_invalid_operation); @@ -3433,7 +3433,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) format as the output, we can't make a shared library. */ if (info->shared && is_elf_hash_table (htab) - && htab->root.creator == abfd->xvec + && info->output_bfd->xvec == abfd->xvec && !htab->dynamic_sections_created) { if (! _bfd_elf_link_create_dynamic_sections (abfd, info)) @@ -4674,7 +4674,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) if (! dynamic && is_elf_hash_table (htab) && bed->check_relocs != NULL - && (*bed->relocs_compatible) (abfd->xvec, htab->root.creator)) + && (*bed->relocs_compatible) (abfd->xvec, info->output_bfd->xvec)) { asection *o; diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 1b24ee5d45..514b14cfe7 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -6083,7 +6083,7 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, if (SGI_COMPAT (abfd) && ! info->shared - && info->hash->creator == abfd->xvec + && info->output_bfd->xvec == abfd->xvec && strcmp (*namep, "__rld_obj_head") == 0) { struct elf_link_hash_entry *h; diff --git a/bfd/i386linux.c b/bfd/i386linux.c index 52cc36eea8..0f18789ddd 100644 --- a/bfd/i386linux.c +++ b/bfd/i386linux.c @@ -1,6 +1,6 @@ /* BFD back-end for linux flavored i386 a.out binaries. Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2001, 2002, 2003, - 2004, 2006, 2007 Free Software Foundation, Inc. + 2004, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -346,9 +346,9 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, If we do, and the defining entry is from a shared library, we need to create the dynamic sections. - FIXME: What if abfd->xvec != info->hash->creator? We may want to - be able to link Linux a.out and ELF objects together, but serious - confusion is possible. */ + FIXME: What if abfd->xvec != info->output_bfd->xvec? We may + want to be able to link Linux a.out and ELF objects together, + but serious confusion is possible. */ insert = FALSE; @@ -356,7 +356,7 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, && linux_hash_table (info)->dynobj == NULL && strcmp (name, SHARABLE_CONFLICTS) == 0 && (flags & BSF_CONSTRUCTOR) != 0 - && abfd->xvec == info->hash->creator) + && abfd->xvec == info->output_bfd->xvec) { if (! linux_link_create_dynamic_sections (abfd, info)) return FALSE; @@ -365,7 +365,7 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, } if (bfd_is_abs_section (section) - && abfd->xvec == info->hash->creator) + && abfd->xvec == info->output_bfd->xvec) { h = linux_link_hash_lookup (linux_hash_table (info), name, FALSE, FALSE, FALSE); diff --git a/bfd/linker.c b/bfd/linker.c index fb293cca71..327426e3c5 100644 --- a/bfd/linker.c +++ b/bfd/linker.c @@ -1,6 +1,6 @@ /* linker.c -- BFD linker routines Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2006, 2007 + 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support @@ -151,9 +151,9 @@ SUBSUBSECTION Sometimes the <<_bfd_link_add_symbols>> function must store some information in the hash table entry to be used by the - <<_bfd_final_link>> function. In such a case the <> - field of the hash table must be checked to make sure that the - hash table was created by an object file of the same format. + <<_bfd_final_link>> function. In such a case the output bfd + xvec must be checked to make sure that the hash table was + created by an object file of the same format. The <<_bfd_final_link>> routine must be prepared to handle a hash entry without any extra information added by the @@ -165,7 +165,7 @@ SUBSUBSECTION initialization function. See <> for an example of how to - check the <> field before saving information (in this + check the output bfd before saving information (in this case, the ECOFF external symbol debugging information) in a hash table entry. @@ -471,13 +471,12 @@ _bfd_link_hash_newfunc (struct bfd_hash_entry *entry, bfd_boolean _bfd_link_hash_table_init (struct bfd_link_hash_table *table, - bfd *abfd, + bfd *abfd ATTRIBUTE_UNUSED, struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *, struct bfd_hash_table *, const char *), unsigned int entsize) { - table->creator = abfd->xvec; table->undefs = NULL; table->undefs_tail = NULL; table->type = bfd_link_generic_hash_table; @@ -1359,7 +1358,7 @@ generic_link_add_symbol_list (bfd *abfd, hash table other than the generic hash table, so we only do this if we are certain that the hash table is a generic one. */ - if (info->hash->creator == abfd->xvec) + if (info->output_bfd->xvec == abfd->xvec) { if (h->sym == NULL || (! bfd_is_und_section (bfd_get_section (p)) @@ -2243,7 +2242,7 @@ _bfd_generic_link_output_symbols (bfd *output_bfd, this routine will be called with a hash table other than a generic hash table, so we double check that. */ - if (info->hash->creator == input_bfd->xvec) + if (info->output_bfd->xvec == input_bfd->xvec) { if (h->sym != NULL) *sym_ptr = sym = h->sym; diff --git a/bfd/m68klinux.c b/bfd/m68klinux.c index 61445d0dc1..d56c431f78 100644 --- a/bfd/m68klinux.c +++ b/bfd/m68klinux.c @@ -1,6 +1,6 @@ /* BFD back-end for linux flavored m68k a.out binaries. Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, - 2003, 2004, 2006, 2007 Free Software Foundation, Inc. + 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -350,9 +350,9 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, If we do, and the defining entry is from a shared library, we need to create the dynamic sections. - FIXME: What if abfd->xvec != info->hash->creator? We may want to - be able to link Linux a.out and ELF objects together, but serious - confusion is possible. */ + FIXME: What if abfd->xvec != info->output_bfd->xvec? We may + want to be able to link Linux a.out and ELF objects together, + but serious confusion is possible. */ insert = FALSE; @@ -360,7 +360,7 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, && linux_hash_table (info)->dynobj == NULL && strcmp (name, SHARABLE_CONFLICTS) == 0 && (flags & BSF_CONSTRUCTOR) != 0 - && abfd->xvec == info->hash->creator) + && abfd->xvec == info->output_bfd->xvec) { if (! linux_link_create_dynamic_sections (abfd, info)) return FALSE; @@ -369,7 +369,7 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, } if (bfd_is_abs_section (section) - && abfd->xvec == info->hash->creator) + && abfd->xvec == info->output_bfd->xvec) { h = linux_link_hash_lookup (linux_hash_table (info), name, FALSE, FALSE, FALSE); diff --git a/bfd/sparclinux.c b/bfd/sparclinux.c index 4144ce75ac..c7e0299523 100644 --- a/bfd/sparclinux.c +++ b/bfd/sparclinux.c @@ -1,6 +1,6 @@ /* BFD back-end for linux flavored sparc a.out binaries. Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, - 2003, 2004, 2006, 2007 Free Software Foundation, Inc. + 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -346,9 +346,9 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, If we do, and the defining entry is from a shared library, we need to create the dynamic sections. - FIXME: What if abfd->xvec != info->hash->creator? We may want to - be able to link Linux a.out and ELF objects together, but serious - confusion is possible. */ + FIXME: What if abfd->xvec != info->output_bfd->xvec? We may + want to be able to link Linux a.out and ELF objects together, + but serious confusion is possible. */ insert = FALSE; @@ -356,7 +356,7 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, && linux_hash_table (info)->dynobj == NULL && strcmp (name, SHARABLE_CONFLICTS) == 0 && (flags & BSF_CONSTRUCTOR) != 0 - && abfd->xvec == info->hash->creator) + && abfd->xvec == info->output_bfd->xvec) { if (! linux_link_create_dynamic_sections (abfd, info)) return FALSE; @@ -365,7 +365,7 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, } if (bfd_is_abs_section (section) - && abfd->xvec == info->hash->creator) + && abfd->xvec == info->output_bfd->xvec) { h = linux_link_hash_lookup (linux_hash_table (info), name, FALSE, FALSE, FALSE); diff --git a/bfd/sunos.c b/bfd/sunos.c index 1c17dce275..67880b2ce6 100644 --- a/bfd/sunos.c +++ b/bfd/sunos.c @@ -1,6 +1,7 @@ /* BFD backend for SunOS binaries. Copyright 1990, 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -829,7 +830,7 @@ sunos_add_dynamic_symbols (bfd *abfd, unsigned long need; /* Make sure we have all the required sections. */ - if (info->hash->creator == abfd->xvec) + if (info->output_bfd->xvec == abfd->xvec) { if (! sunos_create_dynamic_sections (abfd, info, ((abfd->flags & DYNAMIC) != 0 @@ -870,7 +871,7 @@ sunos_add_dynamic_symbols (bfd *abfd, /* There's no hope of using a dynamic object which does not exactly match the format of the output file. */ - if (info->hash->creator != abfd->xvec) + if (info->output_bfd->xvec != abfd->xvec) { bfd_set_error (bfd_error_invalid_operation); return FALSE; @@ -1121,7 +1122,7 @@ sunos_add_one_symbol (struct bfd_link_info *info, } if ((abfd->flags & DYNAMIC) != 0 - && abfd->xvec == info->hash->creator + && abfd->xvec == info->output_bfd->xvec && (h->flags & SUNOS_CONSTRUCTOR) != 0) /* The existing symbol is a constructor symbol, and this symbol is from a dynamic object. A constructor symbol is actually a @@ -1145,7 +1146,7 @@ sunos_add_one_symbol (struct bfd_link_info *info, hashp)) return FALSE; - if (abfd->xvec == info->hash->creator) + if (abfd->xvec == info->output_bfd->xvec) { /* Set a flag in the hash table entry indicating the type of reference or definition we just found. Keep a count of the @@ -1191,7 +1192,7 @@ struct bfd_link_needed_list * bfd_sunos_get_needed_list (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) { - if (info->hash->creator != &MY (vec)) + if (info->output_bfd->xvec != &MY (vec)) return NULL; return sunos_hash_table (info)->needed; } diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c index f14c62b284..21d9a2d944 100644 --- a/bfd/xcofflink.c +++ b/bfd/xcofflink.c @@ -1,6 +1,6 @@ /* POWER/PowerPC XCOFF linker support. Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Written by Ian Lance Taylor , Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -560,7 +560,7 @@ xcoff_link_add_dynamic_symbols (bfd *abfd, struct bfd_link_info *info) /* We can only handle a dynamic object if we are generating an XCOFF output file. */ - if (info->hash->creator != abfd->xvec) + if (info->output_bfd->xvec != abfd->xvec) { (*_bfd_error_handler) (_("%s: XCOFF shared object when not producing XCOFF output"), @@ -786,7 +786,7 @@ xcoff_link_create_extra_sections (bfd * abfd, struct bfd_link_info *info) { bfd_boolean return_value = FALSE; - if (info->hash->creator == abfd->xvec) + if (info->output_bfd->xvec == abfd->xvec) { /* We need to build a .loader section, so we do it here. This won't work if we're producing an XCOFF output file with no @@ -1294,7 +1294,7 @@ xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info) place. */ if (aux.x_csect.x_smclas == XMC_TC && sym.n_sclass == C_HIDEXT - && info->hash->creator == abfd->xvec + && info->output_bfd->xvec == abfd->xvec && ((bfd_xcoff_is_xcoff32 (abfd) && aux.x_csect.x_scnlen.l == 4) || (bfd_xcoff_is_xcoff64 (abfd) @@ -1664,7 +1664,7 @@ xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info) shared object, which will cause symbol redefinitions, although this is an easier case to detect. */ - if (info->hash->creator == abfd->xvec) + if (info->output_bfd->xvec == abfd->xvec) { if (! bfd_is_und_section (section)) *sym_hash = xcoff_link_hash_lookup (xcoff_hash_table (info), @@ -1789,7 +1789,7 @@ xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info) = csect->alignment_power; } - if (info->hash->creator == abfd->xvec) + if (info->output_bfd->xvec == abfd->xvec) { int flag; @@ -1848,7 +1848,7 @@ xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info) /* We identify all symbols which are called, so that we can create glue code for calls to functions imported from dynamic objects. */ - if (info->hash->creator == abfd->xvec + if (info->output_bfd->xvec == abfd->xvec && *rel_csect != bfd_und_section_ptr && (rel->r_type == R_BR || rel->r_type == R_RBR) @@ -2066,7 +2066,7 @@ xcoff_link_check_ar_symbols (bfd *abfd, if ((abfd->flags & DYNAMIC) != 0 && ! info->static_link - && info->hash->creator == abfd->xvec) + && info->output_bfd->xvec == abfd->xvec) return xcoff_link_check_dynamic_ar_symbols (abfd, info, pneeded); symesz = bfd_coff_symesz (abfd); @@ -2099,7 +2099,7 @@ xcoff_link_check_ar_symbols (bfd *abfd, undefined references in shared objects. */ if (h != NULL && h->type == bfd_link_hash_undefined - && (info->hash->creator != abfd->xvec + && (info->output_bfd->xvec != abfd->xvec || (((struct xcoff_link_hash_entry *) h)->flags & XCOFF_DEF_DYNAMIC) == 0)) { @@ -2180,7 +2180,7 @@ _bfd_xcoff_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info) while (member != NULL) { if (bfd_check_format (member, bfd_object) - && (info->hash->creator == member->xvec) + && (info->output_bfd->xvec == member->xvec) && (! bfd_has_map (abfd) || (member->flags & DYNAMIC) != 0)) { bfd_boolean needed; @@ -2252,7 +2252,7 @@ xcoff_mark (struct bfd_link_info *info, asection *sec) sec->flags |= SEC_MARK; - if (sec->owner->xvec == info->hash->creator + if (sec->owner->xvec == info->output_bfd->xvec && coff_section_data (sec->owner, sec) != NULL && xcoff_section_data (sec->owner, sec) != NULL) { @@ -2386,7 +2386,7 @@ xcoff_sweep (struct bfd_link_info *info) /* Keep all sections from non-XCOFF input files. Keep special sections. Keep .debug sections for the moment. */ - if (sub->xvec != info->hash->creator + if (sub->xvec != info->output_bfd->xvec || o == xcoff_hash_table (info)->debug_section || o == xcoff_hash_table (info)->loader_section || o == xcoff_hash_table (info)->linkage_section @@ -2759,7 +2759,7 @@ xcoff_build_ldsyms (struct xcoff_link_hash_entry *h, void * p) || h->root.type == bfd_link_hash_defweak) && (h->root.u.def.section->owner == NULL || (h->root.u.def.section->owner->xvec - != ldinfo->info->hash->creator))) + != ldinfo->info->output_bfd->xvec))) h->flags |= XCOFF_MARK; /* If this symbol is called and defined in a dynamic object, or it @@ -3257,7 +3257,7 @@ bfd_xcoff_size_dynamic_sections (bfd *output_bfd, bfd_byte *esym, *esymend; bfd_size_type symesz; - if (sub->xvec != info->hash->creator) + if (sub->xvec != info->output_bfd->xvec) continue; subdeb = bfd_get_section_by_name (sub, ".debug"); if (subdeb == NULL || subdeb->size == 0) diff --git a/include/ChangeLog b/include/ChangeLog index 6a8cac152a..fd6c3d232e 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2008-02-15 Alan Modra + + * bfdlink.h (struct bfd_link_hash_table): Delete creator field. + (struct bfd_link_info): Add output_bfd. + 2008-02-11 Bob Wilson * xtensa-config.h (XCHAL_HAVE_THREADPTR): Redefine to zero. diff --git a/include/bfdlink.h b/include/bfdlink.h index 66cec0189a..bcd4b4fc3e 100644 --- a/include/bfdlink.h +++ b/include/bfdlink.h @@ -1,6 +1,6 @@ /* bfdlink.h -- header file for BFD link routines Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -160,11 +160,6 @@ struct bfd_link_hash_table { /* The hash table itself. */ struct bfd_hash_table table; - /* The back end which created this hash table. This indicates the - type of the entries in the hash table, which is sometimes - important information when linking object files of different - types together. */ - const bfd_target *creator; /* A linked list of undefined and common symbols, linked through the next field in the bfd_link_hash_entry structure. */ struct bfd_link_hash_entry *undefs; @@ -396,6 +391,9 @@ struct bfd_link_info option). If this is NULL, no symbols are being wrapped. */ struct bfd_hash_table *wrap_hash; + /* The output BFD. */ + bfd *output_bfd; + /* The list of input BFD's involved in the link. These are chained together via the link_next field. */ bfd *input_bfds; diff --git a/ld/ChangeLog b/ld/ChangeLog index 9f2557395d..ec63420c02 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,54 @@ +2008-02-15 Alan Modra + + * ldmain.h (output_bfd): Delete. + * ldmain.c (output_bfd): Delete. + Replace all occurrences of output_bfd with link_info.output_bfd. + * ldcref.c: Likewise. + * ldctor.c: Likewise. + * ldemul.c: Likewise. + * ldexp.c: Likewise. + * ldfile.c: Likewise. + * ldlang.c: Likewise. + * ldmisc.c: Likewise. + * ldwrite.c: Likewise. + * pe-dll.c: Likewise. + * emultempl/aix.em: Likewise. + * emultempl/alphaelf.em: Likewise. + * emultempl/armcoff.em: Likewise. + * emultempl/armelf.em: Likewise. + * emultempl/avrelf.em: Likewise. + * emultempl/beos.em: Likewise. + * emultempl/elf-generic.em: Likewise. + * emultempl/elf32.em: Likewise. + * emultempl/gld960.em: Likewise. + * emultempl/hppaelf.em: Likewise. + * emultempl/irix.em: Likewise. + * emultempl/linux.em: Likewise. + * emultempl/lnk960.em: Likewise. + * emultempl/m68hc1xelf.em: Likewise. + * emultempl/mmix-elfnmmo.em: Likewise. + * emultempl/mmo.em: Likewise. + * emultempl/pe.em: Likewise. + * emultempl/pep.em: Likewise. + * emultempl/ppc32elf.em: Likewise. + * emultempl/ppc64elf.em: Likewise. + * emultempl/scoreelf.em: Likewise. + * emultempl/sh64elf.em: Likewise. + * emultempl/spuelf.em: Likewise. + * emultempl/sunos.em: Likewise. + * emultempl/vanilla.em: Likewise. + * emultempl/vxworks.em: Likewise. + * emultempl/xtensaelf.em: Likewise. + * emultempl/z80.em: Likewise. + * ldlang.c (open_output): Don't return output, instead write + link_info_output_bfd directly. + * emultempl/alphaelf.em: Replace occurrences of link_info.hash->creator + with link_info.output_bfd->xvec. + * emultempl/hppaelf.em: Likewise. + * emultempl/ppc32elf.em: Likewise. + * emultempl/ppc64elf.em: Likewise. + * emultempl/spuelf.em: Likewise. + 2008-02-07 Alan Modra * ldlang.c (new_afile): Don't pass unadorned NULL to concat. diff --git a/ld/emultempl/aix.em b/ld/emultempl/aix.em index 9aa0d500ae..ecb6645cf0 100644 --- a/ld/emultempl/aix.em +++ b/ld/emultempl/aix.em @@ -10,7 +10,7 @@ fragment < AIX support by Ian Lance Taylor @@ -575,7 +575,7 @@ gld${EMULATION_NAME}_after_open (void) executable. Of course, we only want to do this if we are producing an XCOFF output file. */ r = link_info.relocatable; - if (strstr (bfd_get_target (output_bfd), "xcoff") != NULL) + if (strstr (bfd_get_target (link_info.output_bfd), "xcoff") != NULL) link_info.relocatable = TRUE; ldctor_build_sets (); link_info.relocatable = r; @@ -600,7 +600,8 @@ gld${EMULATION_NAME}_after_open (void) } size = (p->count + 2) * 4; - if (!bfd_xcoff_link_record_set (output_bfd, &link_info, p->h, size)) + if (!bfd_xcoff_link_record_set (link_info.output_bfd, &link_info, + p->h, size)) einfo ("%F%P: bfd_xcoff_link_record_set failed: %E\n"); } } @@ -627,7 +628,7 @@ gld${EMULATION_NAME}_before_allocation (void) h = bfd_link_hash_lookup (link_info.hash, el->name, FALSE, FALSE, FALSE); if (h == NULL) einfo ("%P%F: bfd_link_hash_lookup of export symbol failed: %E\n"); - if (!bfd_xcoff_export_symbol (output_bfd, &link_info, h)) + if (!bfd_xcoff_export_symbol (link_info.output_bfd, &link_info, h)) einfo ("%P%F: bfd_xcoff_export_symbol failed: %E\n"); } @@ -703,7 +704,7 @@ gld${EMULATION_NAME}_before_allocation (void) /* Let the XCOFF backend set up the .loader section. */ if (!bfd_xcoff_size_dynamic_sections - (output_bfd, &link_info, libpath, entry_symbol.name, file_align, + (link_info.output_bfd, &link_info, libpath, entry_symbol.name, file_align, maxstack, maxdata, gc && !unix_ld ? TRUE : FALSE, modtype, textro ? TRUE : FALSE, unix_ld, special_sections, rtld ? TRUE : FALSE)) @@ -1159,7 +1160,8 @@ gld${EMULATION_NAME}_read_file (const char *filename, bfd_boolean import) } else { - if (!bfd_xcoff_import_symbol (output_bfd, &link_info, h, + if (!bfd_xcoff_import_symbol (link_info.output_bfd, + &link_info, h, address, imppath, impfile, impmember, syscall_flag)) einfo ("%X%s:%d: failed to import symbol %s: %E\n", @@ -1206,7 +1208,8 @@ gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *s) rs = &s->reloc_statement; if (rs->name == NULL) einfo ("%F%P: only relocations against symbols are permitted\n"); - if (!bfd_xcoff_link_count_reloc (output_bfd, &link_info, rs->name)) + if (!bfd_xcoff_link_count_reloc (link_info.output_bfd, &link_info, + rs->name)) einfo ("%F%P: bfd_xcoff_link_count_reloc failed: %E\n"); } @@ -1232,7 +1235,8 @@ gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp) case etree_assign: if (strcmp (exp->assign.dst, ".") != 0) { - if (!bfd_xcoff_record_link_assignment (output_bfd, &link_info, + if (!bfd_xcoff_record_link_assignment (link_info.output_bfd, + &link_info, exp->assign.dst)) einfo ("%P%F: failed to record assignment to %s: %E\n", exp->assign.dst); @@ -1317,7 +1321,7 @@ static void gld${EMULATION_NAME}_create_output_section_statements (void) { /* __rtinit */ - if ((bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour) + if ((bfd_get_flavour (link_info.output_bfd) == bfd_target_xcoff_flavour) && (link_info.init_function != NULL || link_info.fini_function != NULL || rtld)) @@ -1326,11 +1330,11 @@ gld${EMULATION_NAME}_create_output_section_statements (void) lang_input_file_is_file_enum, NULL); - initfini_file->the_bfd = bfd_create ("initfini", output_bfd); + initfini_file->the_bfd = bfd_create ("initfini", link_info.output_bfd); if (initfini_file->the_bfd == NULL || ! bfd_set_arch_mach (initfini_file->the_bfd, - bfd_get_arch (output_bfd), - bfd_get_mach (output_bfd))) + bfd_get_arch (link_info.output_bfd), + bfd_get_mach (link_info.output_bfd))) { einfo ("%X%P: can not create BFD %E\n"); return; @@ -1355,13 +1359,13 @@ gld${EMULATION_NAME}_create_output_section_statements (void) static void gld${EMULATION_NAME}_set_output_arch (void) { - bfd_set_arch_mach (output_bfd, - bfd_xcoff_architecture (output_bfd), - bfd_xcoff_machine (output_bfd)); + bfd_set_arch_mach (link_info.output_bfd, + bfd_xcoff_architecture (link_info.output_bfd), + bfd_xcoff_machine (link_info.output_bfd)); - ldfile_output_architecture = bfd_get_arch (output_bfd); - ldfile_output_machine = bfd_get_mach (output_bfd); - ldfile_output_machine_name = bfd_printable_name (output_bfd); + ldfile_output_architecture = bfd_get_arch (link_info.output_bfd); + ldfile_output_machine = bfd_get_mach (link_info.output_bfd); + ldfile_output_machine_name = bfd_printable_name (link_info.output_bfd); } struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = { diff --git a/ld/emultempl/alphaelf.em b/ld/emultempl/alphaelf.em index b1341409bb..81bb377d73 100644 --- a/ld/emultempl/alphaelf.em +++ b/ld/emultempl/alphaelf.em @@ -1,5 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2003, 2004, 2005, 2007 Free Software Foundation, Inc. +# Copyright 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # # This file is part of the GNU Binutils. # @@ -42,8 +42,8 @@ extern const bfd_target bfd_elf64_alpha_freebsd_vec; static void alpha_after_open (void) { - if (link_info.hash->creator == &bfd_elf64_alpha_vec - || link_info.hash->creator == &bfd_elf64_alpha_freebsd_vec) + if (link_info.output_bfd->xvec == &bfd_elf64_alpha_vec + || link_info.output_bfd->xvec == &bfd_elf64_alpha_freebsd_vec) { unsigned int num_plt; lang_output_section_statement_type *os; @@ -98,7 +98,7 @@ static void alpha_finish (void) { if (limit_32bit) - elf_elfheader (output_bfd)->e_flags |= EF_ALPHA_32BIT; + elf_elfheader (link_info.output_bfd)->e_flags |= EF_ALPHA_32BIT; gld${EMULATION_NAME}_finish (); } diff --git a/ld/emultempl/armcoff.em b/ld/emultempl/armcoff.em index bc37ea1eba..07fdcc990a 100644 --- a/ld/emultempl/armcoff.em +++ b/ld/emultempl/armcoff.em @@ -5,7 +5,7 @@ fragment <u.def.value - + bfd_get_section_vma (output_bfd, + + bfd_get_section_vma (link_info.output_bfd, h->u.def.section->output_section) + h->u.def.section->output_offset); diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em index e8b3682289..7d0320d851 100644 --- a/ld/emultempl/armelf.em +++ b/ld/emultempl/armelf.em @@ -1,6 +1,6 @@ # This shell script emits a C file. -*- C -*- # Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, -# 2004, 2005, 2007 +# 2004, 2005, 2007, 2008 # Free Software Foundation, Inc. # # This file is part of the GNU Binutils. @@ -53,7 +53,7 @@ gld${EMULATION_NAME}_before_parse (void) static void arm_elf_after_open (void) { - if (strstr (bfd_get_target (output_bfd), "arm") == NULL) + if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL) { /* The arm backend needs special fields in the output hash structure. These will only be created if the output format is an arm format, @@ -86,7 +86,7 @@ arm_elf_set_bfd_for_interworking (lang_statement_union_type *statement) { asection *output_section = i->output_section; - ASSERT (output_section->owner == output_bfd); + ASSERT (output_section->owner == link_info.output_bfd); /* Don't attach the interworking stubs to a dynamic object, to an empty section, etc. */ @@ -130,7 +130,7 @@ arm_elf_before_allocation (void) /* Choose type of VFP11 erratum fix, or warn if specified fix is unnecessary due to architecture version. */ - bfd_elf32_arm_set_vfp11_fix (output_bfd, &link_info); + bfd_elf32_arm_set_vfp11_fix (link_info.output_bfd, &link_info); /* We should be able to set the size of the interworking stub section. We can't do it until later if we have dynamic sections, though. */ @@ -212,7 +212,7 @@ arm_elf_finish (void) /* Special procesing is required for a Thumb entry symbol. The bottom bit of its address must be set. */ val = (h->u.def.value - + bfd_get_section_vma (output_bfd, + + bfd_get_section_vma (link_info.output_bfd, h->u.def.section->output_section) + h->u.def.section->output_offset); @@ -241,7 +241,8 @@ arm_elf_finish (void) static void arm_elf_create_output_section_statements (void) { - bfd_elf32_arm_set_target_relocs (output_bfd, &link_info, target1_is_rel, + bfd_elf32_arm_set_target_relocs (link_info.output_bfd, &link_info, + target1_is_rel, target2_type, fix_v4bx, use_blx, vfp11_denorm_fix, no_enum_size_warning, pic_veneer); diff --git a/ld/emultempl/avrelf.em b/ld/emultempl/avrelf.em index 3c242a937f..14b9ac2f17 100644 --- a/ld/emultempl/avrelf.em +++ b/ld/emultempl/avrelf.em @@ -1,5 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2006, 2007 +# Copyright 2006, 2007, 2008 # Free Software Foundation, Inc. # # This file is part of the GNU Binutils. @@ -85,7 +85,7 @@ avr_elf_${EMULATION_NAME}_before_allocation (void) if (avr_no_stubs) return; - ret = elf32_avr_setup_section_lists (output_bfd, &link_info); + ret = elf32_avr_setup_section_lists (link_info.output_bfd, &link_info); if (ret < 0) einfo ("%X%P: can not setup the input section list: %E\n"); @@ -94,7 +94,7 @@ avr_elf_${EMULATION_NAME}_before_allocation (void) return; /* Call into the BFD backend to do the real "stub"-work. */ - if (! elf32_avr_size_stubs (output_bfd, &link_info, TRUE)) + if (! elf32_avr_size_stubs (link_info.output_bfd, &link_info, TRUE)) einfo ("%X%P: can not size stub section: %E\n"); } @@ -110,11 +110,11 @@ avr_elf_create_output_section_statements (void) lang_input_file_is_fake_enum, NULL); - stub_file->the_bfd = bfd_create ("linker stubs", output_bfd); + stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd); if (stub_file->the_bfd == NULL || !bfd_set_arch_mach (stub_file->the_bfd, - bfd_get_arch (output_bfd), - bfd_get_mach (output_bfd))) + bfd_get_arch (link_info.output_bfd), + bfd_get_mach (link_info.output_bfd))) { einfo ("%X%P: can not create stub BFD %E\n"); return; @@ -157,7 +157,7 @@ avr_elf_finish (void) stubs with the correct symbol addresses. Since there could have been relaxation, the symbol addresses that were found during first call may no longer be correct. */ - if (!elf32_avr_size_stubs (output_bfd, &link_info, FALSE)) + if (!elf32_avr_size_stubs (link_info.output_bfd, &link_info, FALSE)) { einfo ("%X%P: can not size stub section: %E\n"); return; diff --git a/ld/emultempl/beos.em b/ld/emultempl/beos.em index 23d3849c5d..ac27c5a897 100644 --- a/ld/emultempl/beos.em +++ b/ld/emultempl/beos.em @@ -8,7 +8,7 @@ fi fragment <pe) + if (!coff_data(link_info.output_bfd)->pe) { einfo ("%F%P: PE operations on non PE file.\n"); } - pe_data(output_bfd)->pe_opthdr = pe; - pe_data(output_bfd)->dll = init[DLLOFF].value; + pe_data(link_info.output_bfd)->pe_opthdr = pe; + pe_data(link_info.output_bfd)->dll = init[DLLOFF].value; } diff --git a/ld/emultempl/elf-generic.em b/ld/emultempl/elf-generic.em index 94486f81d7..d286bb837c 100644 --- a/ld/emultempl/elf-generic.em +++ b/ld/emultempl/elf-generic.em @@ -1,5 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2006, 2007 Free Software Foundation, Inc. +# Copyright 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is part of the GNU Binutils. # @@ -47,30 +47,34 @@ gld${EMULATION_NAME}_map_segments (bfd_boolean need_layout) need_layout = FALSE; } - if (output_bfd->xvec->flavour == bfd_target_elf_flavour + if (link_info.output_bfd->xvec->flavour == bfd_target_elf_flavour && !link_info.relocatable) { bfd_size_type phdr_size; - phdr_size = elf_tdata (output_bfd)->program_header_size; + phdr_size = elf_tdata (link_info.output_bfd)->program_header_size; /* If we don't have user supplied phdrs, throw away any previous linker generated program headers. */ if (lang_phdr_list == NULL) - elf_tdata (output_bfd)->segment_map = NULL; - if (!_bfd_elf_map_sections_to_segments (output_bfd, &link_info)) + elf_tdata (link_info.output_bfd)->segment_map = NULL; + if (!_bfd_elf_map_sections_to_segments (link_info.output_bfd, + &link_info)) einfo ("%F%P: map sections to segments failed: %E\n"); - if (phdr_size != elf_tdata (output_bfd)->program_header_size) + if (phdr_size + != elf_tdata (link_info.output_bfd)->program_header_size) { if (tries > 6) /* The first few times we allow any change to phdr_size . */ need_layout = TRUE; - else if (phdr_size < elf_tdata (output_bfd)->program_header_size) + else if (phdr_size + < elf_tdata (link_info.output_bfd)->program_header_size) /* After that we only allow the size to grow. */ need_layout = TRUE; else - elf_tdata (output_bfd)->program_header_size = phdr_size; + elf_tdata (link_info.output_bfd)->program_header_size + = phdr_size; } } } diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 547bc2abea..da1bf4914a 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -307,7 +307,7 @@ gld${EMULATION_NAME}_try_needed (struct dt_needed *needed, const char *soname; int class; - abfd = bfd_openr (name, bfd_get_target (output_bfd)); + abfd = bfd_openr (name, bfd_get_target (link_info.output_bfd)); if (abfd == NULL) return FALSE; if (! bfd_check_format (abfd, bfd_object)) @@ -322,7 +322,7 @@ gld${EMULATION_NAME}_try_needed (struct dt_needed *needed, } /* For DT_NEEDED, they have to match. */ - if (abfd->xvec != output_bfd->xvec) + if (abfd->xvec != link_info.output_bfd->xvec) { bfd_close (abfd); return FALSE; @@ -1064,7 +1064,7 @@ gld${EMULATION_NAME}_after_open (void) | SEC_READONLY | SEC_DATA); if (s != NULL && bfd_set_section_alignment (abfd, s, 2)) { - struct elf_obj_tdata *t = elf_tdata (output_bfd); + struct elf_obj_tdata *t = elf_tdata (link_info.output_bfd); struct build_id_info *b = xmalloc (sizeof *b); b->style = link_info.emit_note_gnu_build_id; b->sec = s; @@ -1127,7 +1127,7 @@ gld${EMULATION_NAME}_after_open (void) loop. */ if (!link_info.executable) return; - needed = bfd_elf_get_needed_list (output_bfd, &link_info); + needed = bfd_elf_get_needed_list (link_info.output_bfd, &link_info); for (l = needed; l != NULL; l = l->next) { struct bfd_link_needed_list *ll; @@ -1231,7 +1231,7 @@ fi if [ "x${USE_LIBPATH}" = xyes ] ; then fragment <next) { char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name); @@ -1322,7 +1322,8 @@ gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp) will do no harm. */ if (strcmp (exp->assign.dst, ".") != 0) { - if (!bfd_elf_record_link_assignment (output_bfd, &link_info, + if (!bfd_elf_record_link_assignment (link_info.output_bfd, + &link_info, exp->assign.dst, provide, exp->assign.hidden)) einfo ("%P%F: failed to record assignment to %s: %E\n", @@ -1391,7 +1392,7 @@ gld${EMULATION_NAME}_before_allocation (void) asection *sinterp; if (link_info.hash->type == bfd_link_elf_hash_table) - _bfd_elf_tls_setup (output_bfd, &link_info); + _bfd_elf_tls_setup (link_info.output_bfd, &link_info); /* If we are going to make any variable assignments, we need to let the ELF backend know about them in case the variables are @@ -1404,7 +1405,7 @@ gld${EMULATION_NAME}_before_allocation (void) if (rpath == NULL) rpath = (const char *) getenv ("LD_RUN_PATH"); if (! (bfd_elf_size_dynamic_sections - (output_bfd, command_line.soname, rpath, + (link_info.output_bfd, command_line.soname, rpath, command_line.filter_shlib, (const char * const *) command_line.auxiliary_filters, &link_info, &sinterp, lang_elf_version_info))) @@ -1472,7 +1473,7 @@ ${ELF_INTERPRETER_SET_DEFAULT} before_allocation_default (); - if (!bfd_elf_size_dynsym_hash_dynstr (output_bfd, &link_info)) + if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info)) einfo ("%P%F: failed to set dynamic section sizes: %E\n"); } @@ -1710,7 +1711,7 @@ gld${EMULATION_NAME}_place_orphan (asection *s) if (os != NULL && (os->bfd_section == NULL || os->bfd_section->flags == 0 - || (_bfd_elf_match_sections_by_type (output_bfd, + || (_bfd_elf_match_sections_by_type (link_info.output_bfd, os->bfd_section, s->owner, s) && ((s->flags ^ os->bfd_section->flags) @@ -1801,10 +1802,11 @@ gld${EMULATION_NAME}_place_orphan (asection *s) /* Choose a unique name for the section. This will be needed if the same section name appears in the input file with different loadable or allocatable characteristics. */ - if (bfd_get_section_by_name (output_bfd, secname) != NULL) + if (bfd_get_section_by_name (link_info.output_bfd, secname) != NULL) { static int count = 1; - secname = bfd_get_unique_section_name (output_bfd, secname, &count); + secname = bfd_get_unique_section_name (link_info.output_bfd, + secname, &count); if (secname == NULL) einfo ("%F%P: place_orphan failed: %E\n"); } @@ -1822,7 +1824,8 @@ fragment <creator != &bfd_elf32_hppa_linux_vec - && link_info.hash->creator != &bfd_elf32_hppa_nbsd_vec - && link_info.hash->creator != &bfd_elf32_hppa_vec) + if (link_info.output_bfd->xvec != &bfd_elf32_hppa_linux_vec + && link_info.output_bfd->xvec != &bfd_elf32_hppa_nbsd_vec + && link_info.output_bfd->xvec != &bfd_elf32_hppa_vec) return; stub_file = lang_add_input_file ("linker stubs", lang_input_file_is_fake_enum, NULL); - stub_file->the_bfd = bfd_create ("linker stubs", output_bfd); + stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd); if (stub_file->the_bfd == NULL || ! bfd_set_arch_mach (stub_file->the_bfd, - bfd_get_arch (output_bfd), - bfd_get_mach (output_bfd))) + bfd_get_arch (link_info.output_bfd), + bfd_get_mach (link_info.output_bfd))) { einfo ("%X%P: can not create BFD %E\n"); return; @@ -236,7 +236,7 @@ build_section_lists (lang_statement_union_type *statement) if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag && (i->flags & SEC_EXCLUDE) == 0 && i->output_section != NULL - && i->output_section->owner == output_bfd) + && i->output_section->owner == link_info.output_bfd) { elf32_hppa_next_input_section (&link_info, i); } @@ -254,14 +254,15 @@ gld${EMULATION_NAME}_finish (void) ie. doesn't affect any code, so we can delay resizing the sections. It's likely we'll resize everything in the process of adding stubs. */ - if (bfd_elf_discard_info (output_bfd, &link_info)) + if (bfd_elf_discard_info (link_info.output_bfd, &link_info)) need_laying_out = 1; /* If generating a relocatable output file, then we don't have to examine the relocs. */ if (stub_file != NULL && !link_info.relocatable) { - int ret = elf32_hppa_setup_section_lists (output_bfd, &link_info); + int ret = elf32_hppa_setup_section_lists (link_info.output_bfd, + &link_info); if (ret != 0) { @@ -274,7 +275,7 @@ gld${EMULATION_NAME}_finish (void) lang_for_each_statement (build_section_lists); /* Call into the BFD backend to do the real work. */ - if (! elf32_hppa_size_stubs (output_bfd, + if (! elf32_hppa_size_stubs (link_info.output_bfd, stub_file->the_bfd, &link_info, multi_subspace, @@ -294,7 +295,7 @@ gld${EMULATION_NAME}_finish (void) if (! link_info.relocatable) { /* Set the global data pointer. */ - if (! elf32_hppa_set_gp (output_bfd, &link_info)) + if (! elf32_hppa_set_gp (link_info.output_bfd, &link_info)) { einfo ("%X%P: can not set gp\n"); return; diff --git a/ld/emultempl/irix.em b/ld/emultempl/irix.em index b4a8f4e13f..c3ef4169f5 100644 --- a/ld/emultempl/irix.em +++ b/ld/emultempl/irix.em @@ -1,5 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2004, 2006, 2007 Free Software Foundation, Inc. +# Copyright 2004, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is part of the GNU Binutils. # @@ -33,7 +33,8 @@ static void irix_after_open (void) { if (link_info.shared && command_line.soname == 0) - command_line.soname = (char *) lbasename (bfd_get_filename (output_bfd)); + command_line.soname + = (char *) lbasename (bfd_get_filename (link_info.output_bfd)); gld${EMULATION_NAME}_after_open (); } diff --git a/ld/emultempl/linux.em b/ld/emultempl/linux.em index aa4a088b12..2a2a960a49 100644 --- a/ld/emultempl/linux.em +++ b/ld/emultempl/linux.em @@ -10,7 +10,7 @@ fragment < Linux support by Eric Youngdale @@ -120,7 +120,8 @@ gld${EMULATION_NAME}_before_allocation (void) /* Let the backend work out the sizes of any sections required by dynamic linking. */ - if (! bfd_${EMULATION_NAME}_size_dynamic_sections (output_bfd, &link_info)) + if (! bfd_${EMULATION_NAME}_size_dynamic_sections (link_info.output_bfd, + &link_info)) einfo ("%P%F: failed to set dynamic section sizes: %E\n"); before_allocation_default (); diff --git a/ld/emultempl/lnk960.em b/ld/emultempl/lnk960.em index aa5afcc11f..e13233c716 100644 --- a/ld/emultempl/lnk960.em +++ b/ld/emultempl/lnk960.em @@ -189,7 +189,7 @@ lnk960_set_output_arch (void) break; } } - bfd_set_arch_mach (output_bfd, ldfile_output_architecture, + bfd_set_arch_mach (link_info.output_bfd, ldfile_output_architecture, ldfile_output_machine); } diff --git a/ld/emultempl/m68hc1xelf.em b/ld/emultempl/m68hc1xelf.em index d62323370a..c54eacd5e5 100644 --- a/ld/emultempl/m68hc1xelf.em +++ b/ld/emultempl/m68hc1xelf.em @@ -1,6 +1,6 @@ # This shell script emits a C file. -*- C -*- -# Copyright 1991, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003, 2007 -# Free Software Foundation, Inc. +# Copyright 1991, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003, 2007, +# 2008 Free Software Foundation, Inc. # # This file is part of the GNU Binutils. # @@ -72,7 +72,7 @@ m68hc11_elf_${EMULATION_NAME}_before_allocation (void) if (link_info.relocatable) return; - ret = elf32_m68hc11_setup_section_lists (output_bfd, &link_info); + ret = elf32_m68hc11_setup_section_lists (link_info.output_bfd, &link_info); if (ret != 0 && no_trampoline == 0) { if (ret < 0) @@ -82,7 +82,7 @@ m68hc11_elf_${EMULATION_NAME}_before_allocation (void) } /* Call into the BFD backend to do the real work. */ - if (!elf32_m68hc11_size_stubs (output_bfd, + if (!elf32_m68hc11_size_stubs (link_info.output_bfd, stub_file->the_bfd, &link_info, &m68hc11elf_add_stub_section)) @@ -145,11 +145,11 @@ m68hc11elf_create_output_section_statements (void) stub_file = lang_add_input_file ("linker stubs", lang_input_file_is_fake_enum, NULL); - stub_file->the_bfd = bfd_create ("linker stubs", output_bfd); + stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd); if (stub_file->the_bfd == NULL || !bfd_set_arch_mach (stub_file->the_bfd, - bfd_get_arch (output_bfd), - bfd_get_mach (output_bfd))) + bfd_get_arch (link_info.output_bfd), + bfd_get_mach (link_info.output_bfd))) { einfo ("%X%P: can not create BFD %E\n"); return; @@ -299,14 +299,14 @@ m68hc11elf_finish (void) stubs with the correct symbol addresses. Since there could have been relaxation, the symbol addresses that were found during first call may no longer be correct. */ - if (!elf32_m68hc11_size_stubs (output_bfd, + if (!elf32_m68hc11_size_stubs (link_info.output_bfd, stub_file->the_bfd, &link_info, 0)) { einfo ("%X%P: can not size stub section: %E\n"); return; } - if (!elf32_m68hc11_build_stubs (output_bfd, &link_info)) + if (!elf32_m68hc11_build_stubs (link_info.output_bfd, &link_info)) einfo ("%X%P: can not build stubs: %E\n"); } diff --git a/ld/emultempl/mmix-elfnmmo.em b/ld/emultempl/mmix-elfnmmo.em index 9957268cbd..909c3c46dd 100644 --- a/ld/emultempl/mmix-elfnmmo.em +++ b/ld/emultempl/mmix-elfnmmo.em @@ -1,5 +1,6 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2001, 2002, 2003, 2004, 2007 Free Software Foundation, Inc. +# Copyright 2001, 2002, 2003, 2004, 2007, 2008 +# Free Software Foundation, Inc. # # This file is part of the GNU Binutils. # @@ -43,7 +44,7 @@ mmix_before_allocation (void) link). */ command_line.relax = TRUE; - if (!_bfd_mmix_before_linker_allocation (output_bfd, &link_info)) + if (!_bfd_mmix_before_linker_allocation (link_info.output_bfd, &link_info)) einfo ("%X%P: Internal problems setting up section %s", MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME); } @@ -56,7 +57,8 @@ static void mmix_after_allocation (void) { asection *sec - = bfd_get_section_by_name (output_bfd, MMIX_REG_CONTENTS_SECTION_NAME); + = bfd_get_section_by_name (link_info.output_bfd, + MMIX_REG_CONTENTS_SECTION_NAME); bfd_signed_vma regvma; /* If there's no register section, we don't need to do anything. On the @@ -72,7 +74,7 @@ mmix_after_allocation (void) there. */ if (sec == NULL) sec - = bfd_get_section_by_name (output_bfd, + = bfd_get_section_by_name (link_info.output_bfd, MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME); if (sec == NULL) return; @@ -91,16 +93,16 @@ mmix_after_allocation (void) } /* Set vma to correspond to first such register number * 8. */ - bfd_set_section_vma (output_bfd, sec, (bfd_vma) regvma); + bfd_set_section_vma (link_info.output_bfd, sec, (bfd_vma) regvma); /* Simplify symbol output for the register section (without contents; created for register symbols) by setting the output offset to 0. This section is only present when there are register symbols. */ - sec = bfd_get_section_by_name (output_bfd, MMIX_REG_SECTION_NAME); + sec = bfd_get_section_by_name (link_info.output_bfd, MMIX_REG_SECTION_NAME); if (sec != NULL) bfd_set_section_vma (abfd, sec, 0); - if (!_bfd_mmix_after_linker_allocation (output_bfd, &link_info)) + if (!_bfd_mmix_after_linker_allocation (link_info.output_bfd, &link_info)) { /* This is a fatal error; make einfo call not return. */ einfo ("%F%P: Can't finalize linker-allocated global registers\n"); diff --git a/ld/emultempl/mmo.em b/ld/emultempl/mmo.em index 8c4657730d..8b02fd6422 100644 --- a/ld/emultempl/mmo.em +++ b/ld/emultempl/mmo.em @@ -1,5 +1,6 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2001, 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc. +# Copyright 2001, 2002, 2003, 2004, 2006, 2007, 2008 +# Free Software Foundation, Inc. # # This file is part of the GNU Binutils. # @@ -120,7 +121,7 @@ mmo_wipe_sec_reloc_flag (bfd *abfd, asection *sec, void *ptr ATTRIBUTE_UNUSED) static void mmo_finish (void) { - bfd_map_over_sections (output_bfd, mmo_wipe_sec_reloc_flag, NULL); + bfd_map_over_sections (link_info.output_bfd, mmo_wipe_sec_reloc_flag, NULL); gld${EMULATION_NAME}_map_segments (FALSE); finish_default (); } @@ -139,7 +140,7 @@ mmo_after_open (void) example), we'd count relocs twice because they'd also be counted along the usual route for ELF-only linking, which would lead to an internal accounting error. */ - if (bfd_get_flavour (output_bfd) != bfd_target_elf_flavour) + if (bfd_get_flavour (link_info.output_bfd) != bfd_target_elf_flavour) { LANG_FOR_EACH_INPUT_STATEMENT (is) { diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index 10887b0032..1ef225ae96 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -10,7 +10,7 @@ rm -f e${EMULATION_NAME}.c (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-) fragment <pe == 0) - einfo (_("%F%P: cannot perform PE operations on non PE output file '%B'.\n"), output_bfd); + if (coff_data (link_info.output_bfd) == NULL + || coff_data (link_info.output_bfd)->pe == 0) + einfo (_("%F%P: cannot perform PE operations on non PE output file '%B'.\n"), + link_info.output_bfd); - pe_data (output_bfd)->pe_opthdr = pe; - pe_data (output_bfd)->dll = init[DLLOFF].value; - pe_data (output_bfd)->real_flags |= real_flags; + pe_data (link_info.output_bfd)->pe_opthdr = pe; + pe_data (link_info.output_bfd)->dll = init[DLLOFF].value; + pe_data (link_info.output_bfd)->real_flags |= real_flags; #ifdef DLL_SUPPORT if (pe_enable_stdcall_fixup) /* -1=warn or 1=disable */ pe_fixup_stdcalls (); - pe_process_import_defs (output_bfd, & link_info); + pe_process_import_defs (link_info.output_bfd, &link_info); pe_find_data_imports (); @@ -1028,17 +1030,17 @@ gld_${EMULATION_NAME}_after_open (void) || defined (TARGET_IS_arm_epoc_pe) \ || defined (TARGET_IS_arm_wince_pe) if (!link_info.relocatable) - pe_dll_build_sections (output_bfd, &link_info); + pe_dll_build_sections (link_info.output_bfd, &link_info); else - pe_exe_build_sections (output_bfd, &link_info); + pe_exe_build_sections (link_info.output_bfd, &link_info); #else if (link_info.shared) - pe_dll_build_sections (output_bfd, &link_info); + pe_dll_build_sections (link_info.output_bfd, &link_info); #endif #endif /* DLL_SUPPORT */ #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) - if (strstr (bfd_get_target (output_bfd), "arm") == NULL) + if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL) { /* The arm backend needs special fields in the output hash structure. These will only be created if the output format is an arm format, @@ -1451,13 +1453,14 @@ gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIB if (pe_def_file->base_address != (bfd_vma)(-1)) { - pe.ImageBase = - pe_data (output_bfd)->pe_opthdr.ImageBase = - init[IMAGEBASEOFF].value = pe_def_file->base_address; + pe.ImageBase + = pe_data (link_info.output_bfd)->pe_opthdr.ImageBase + = init[IMAGEBASEOFF].value + = pe_def_file->base_address; init[IMAGEBASEOFF].inited = 1; if (image_base_statement) - image_base_statement->exp = - exp_assop ('=', "__image_base__", exp_intop (pe.ImageBase)); + image_base_statement->exp = exp_assop ('=', "__image_base__", + exp_intop (pe.ImageBase)); } if (pe_def_file->stack_reserve != -1 @@ -1531,7 +1534,7 @@ gld_${EMULATION_NAME}_finish (void) /* Special procesing is required for a Thumb entry symbol. The bottom bit of its address must be set. */ val = (h->u.def.value - + bfd_get_section_vma (output_bfd, + + bfd_get_section_vma (link_info.output_bfd, h->u.def.section->output_section) + h->u.def.section->output_offset); @@ -1563,7 +1566,7 @@ gld_${EMULATION_NAME}_finish (void) #endif ) { - pe_dll_fill_sections (output_bfd, &link_info); + pe_dll_fill_sections (link_info.output_bfd, &link_info); if (pe_implib_filename) pe_dll_generate_implib (pe_def_file, pe_implib_filename); } @@ -1571,7 +1574,7 @@ gld_${EMULATION_NAME}_finish (void) /* ARM doesn't need relocs. */ else { - pe_exe_fill_sections (output_bfd, &link_info); + pe_exe_fill_sections (link_info.output_bfd, &link_info); } #endif @@ -1581,7 +1584,7 @@ gld_${EMULATION_NAME}_finish (void) /* I don't know where .idata gets set as code, but it shouldn't be. */ { - asection *asec = bfd_get_section_by_name (output_bfd, ".idata"); + asection *asec = bfd_get_section_by_name (link_info.output_bfd, ".idata"); if (asec) { @@ -1719,10 +1722,11 @@ gld_${EMULATION_NAME}_place_orphan (asection *s) /* Choose a unique name for the section. This will be needed if the same section name appears in the input file with different loadable or allocatable characteristics. */ - if (bfd_get_section_by_name (output_bfd, secname) != NULL) + if (bfd_get_section_by_name (link_info.output_bfd, secname) != NULL) { static int count = 1; - secname = bfd_get_unique_section_name (output_bfd, secname, &count); + secname = bfd_get_unique_section_name (link_info.output_bfd, + secname, &count); if (secname == NULL) einfo ("%F%P: place_orphan failed: %E\n"); } diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em index 20523edd87..e32f6eb5e4 100644 --- a/ld/emultempl/pep.em +++ b/ld/emultempl/pep.em @@ -9,7 +9,7 @@ fi rm -f e${EMULATION_NAME}.c (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-) fragment <pe == 0) - einfo (_("%F%P: cannot perform PE operations on non PE output file '%B'.\n"), output_bfd); + if (coff_data (link_info.output_bfd) == NULL + || coff_data (link_info.output_bfd)->pe == 0) + einfo (_("%F%P: cannot perform PE operations on non PE output file '%B'.\n"), + link_info.output_bfd); - pe_data (output_bfd)->pe_opthdr = pep; - pe_data (output_bfd)->dll = init[DLLOFF].value; - pe_data (output_bfd)->real_flags |= real_flags; + pe_data (link_info.output_bfd)->pe_opthdr = pep; + pe_data (link_info.output_bfd)->dll = init[DLLOFF].value; + pe_data (link_info.output_bfd)->real_flags |= real_flags; #ifdef DLL_SUPPORT if (pep_enable_stdcall_fixup) /* -1=warn or 1=disable */ pep_fixup_stdcalls (); - pep_process_import_defs (output_bfd, & link_info); + pep_process_import_defs (link_info.output_bfd, &link_info); pep_find_data_imports (); @@ -987,11 +989,11 @@ gld_${EMULATION_NAME}_after_open (void) #else if (!link_info.relocatable) #endif - pep_dll_build_sections (output_bfd, &link_info); + pep_dll_build_sections (link_info.output_bfd, &link_info); #ifndef TARGET_IS_i386pep else - pep_exe_build_sections (output_bfd, &link_info); + pep_exe_build_sections (link_info.output_bfd, &link_info); #endif #endif /* DLL_SUPPORT */ @@ -1280,13 +1282,14 @@ gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIB if (pep_def_file->base_address != (bfd_vma)(-1)) { - pep.ImageBase = - pe_data (output_bfd)->pe_opthdr.ImageBase = - init[IMAGEBASEOFF].value = pep_def_file->base_address; + pep.ImageBase + = pe_data (link_info.output_bfd)->pe_opthdr.ImageBase + = init[IMAGEBASEOFF].value + = pep_def_file->base_address; init[IMAGEBASEOFF].inited = 1; if (image_base_statement) - image_base_statement->exp = - exp_assop ('=', "__image_base__", exp_intop (pep.ImageBase)); + image_base_statement->exp = exp_assop ('=', "__image_base__", + exp_intop (pep.ImageBase)); } if (pep_def_file->stack_reserve != -1 @@ -1332,7 +1335,7 @@ gld_${EMULATION_NAME}_finish (void) if (link_info.shared || (!link_info.relocatable && pep_def_file->num_exports != 0)) { - pep_dll_fill_sections (output_bfd, &link_info); + pep_dll_fill_sections (link_info.output_bfd, &link_info); if (pep_implib_filename) pep_dll_generate_implib (pep_def_file, pep_implib_filename); } @@ -1343,7 +1346,7 @@ gld_${EMULATION_NAME}_finish (void) /* I don't know where .idata gets set as code, but it shouldn't be. */ { - asection *asec = bfd_get_section_by_name (output_bfd, ".idata"); + asection *asec = bfd_get_section_by_name (link_info.output_bfd, ".idata"); if (asec) { @@ -1481,10 +1484,11 @@ gld_${EMULATION_NAME}_place_orphan (asection *s) /* Choose a unique name for the section. This will be needed if the same section name appears in the input file with different loadable or allocatable characteristics. */ - if (bfd_get_section_by_name (output_bfd, secname) != NULL) + if (bfd_get_section_by_name (link_info.output_bfd, secname) != NULL) { static int count = 1; - secname = bfd_get_unique_section_name (output_bfd, secname, &count); + secname = bfd_get_unique_section_name (link_info.output_bfd, + secname, &count); if (secname == NULL) einfo ("%F%P: place_orphan failed: %E\n"); } diff --git a/ld/emultempl/ppc32elf.em b/ld/emultempl/ppc32elf.em index 20af68cf2e..79266a1b5c 100644 --- a/ld/emultempl/ppc32elf.em +++ b/ld/emultempl/ppc32elf.em @@ -1,5 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2003, 2005, 2007 Free Software Foundation, Inc. +# Copyright 2003, 2005, 2007, 2008 Free Software Foundation, Inc. # # This file is part of the GNU Binutils. # @@ -52,7 +52,7 @@ static int old_got = 0; static void ppc_after_open (void) { - if (is_ppc_elf32_vec (link_info.hash->creator)) + if (is_ppc_elf32_vec (link_info.output_bfd->xvec)) { int new_plt; int keep_new; @@ -63,8 +63,8 @@ ppc_after_open (void) lang_output_section_statement_type *got_os[2]; emit_stub_syms |= link_info.emitrelocations; - new_plt = ppc_elf_select_plt_layout (output_bfd, &link_info, plt_style, - emit_stub_syms); + new_plt = ppc_elf_select_plt_layout (link_info.output_bfd, &link_info, + plt_style, emit_stub_syms); if (new_plt < 0) einfo ("%X%P: select_plt_layout problem %E\n"); @@ -109,11 +109,11 @@ ppc_after_open (void) static void ppc_before_allocation (void) { - if (is_ppc_elf32_vec (link_info.hash->creator)) + if (is_ppc_elf32_vec (link_info.output_bfd->xvec)) { - if (ppc_elf_tls_setup (output_bfd, &link_info) && !notlsopt) + if (ppc_elf_tls_setup (link_info.output_bfd, &link_info) && !notlsopt) { - if (!ppc_elf_tls_optimize (output_bfd, &link_info)) + if (!ppc_elf_tls_optimize (link_info.output_bfd, &link_info)) { einfo ("%X%P: TLS problem %E\n"); return; diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em index b23ae4381a..f6af69595d 100644 --- a/ld/emultempl/ppc64elf.em +++ b/ld/emultempl/ppc64elf.em @@ -75,8 +75,8 @@ ppc_create_output_section_statements (void) extern const bfd_target bfd_elf64_powerpc_vec; extern const bfd_target bfd_elf64_powerpcle_vec; - if (link_info.hash->creator != &bfd_elf64_powerpc_vec - && link_info.hash->creator != &bfd_elf64_powerpcle_vec) + if (link_info.output_bfd->xvec != &bfd_elf64_powerpc_vec + && link_info.output_bfd->xvec != &bfd_elf64_powerpcle_vec) return; link_info.wrap_char = '.'; @@ -84,11 +84,11 @@ ppc_create_output_section_statements (void) stub_file = lang_add_input_file ("linker stubs", lang_input_file_is_fake_enum, NULL); - stub_file->the_bfd = bfd_create ("linker stubs", output_bfd); + stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd); if (stub_file->the_bfd == NULL || !bfd_set_arch_mach (stub_file->the_bfd, - bfd_get_arch (output_bfd), - bfd_get_mach (output_bfd))) + bfd_get_arch (link_info.output_bfd), + bfd_get_mach (link_info.output_bfd))) { einfo ("%F%P: can not create BFD %E\n"); return; @@ -105,10 +105,12 @@ ppc_before_allocation (void) if (stub_file != NULL) { if (!no_opd_opt - && !ppc64_elf_edit_opd (output_bfd, &link_info, non_overlapping_opd)) + && !ppc64_elf_edit_opd (link_info.output_bfd, &link_info, + non_overlapping_opd)) einfo ("%X%P: can not edit %s %E\n", "opd"); - if (ppc64_elf_tls_setup (output_bfd, &link_info) && !no_tls_opt) + if (ppc64_elf_tls_setup (link_info.output_bfd, &link_info) + && !no_tls_opt) { /* Size the sections. This is premature, but we want to know the TLS segment layout so that certain optimizations can be done. */ @@ -116,7 +118,7 @@ ppc_before_allocation (void) expld.dataseg.phase = exp_dataseg_none; one_lang_size_sections_pass (NULL, TRUE); - if (!ppc64_elf_tls_optimize (output_bfd, &link_info)) + if (!ppc64_elf_tls_optimize (link_info.output_bfd, &link_info)) einfo ("%X%P: TLS problem %E\n"); /* We must not cache anything from the preliminary sizing. */ @@ -125,7 +127,7 @@ ppc_before_allocation (void) if (!no_toc_opt && !link_info.relocatable - && !ppc64_elf_edit_toc (output_bfd, &link_info)) + && !ppc64_elf_edit_toc (link_info.output_bfd, &link_info)) einfo ("%X%P: can not edit %s %E\n", "toc"); } @@ -271,7 +273,8 @@ static void gld${EMULATION_NAME}_after_allocation (void) { if (!link_info.relocatable) - _bfd_set_gp_value (output_bfd, ppc64_elf_toc (output_bfd)); + _bfd_set_gp_value (link_info.output_bfd, + ppc64_elf_toc (link_info.output_bfd)); } @@ -300,7 +303,7 @@ build_section_lists (lang_statement_union_type *statement) if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag && (i->flags & SEC_EXCLUDE) == 0 && i->output_section != NULL - && i->output_section->owner == output_bfd) + && i->output_section->owner == link_info.output_bfd) { if (!ppc64_elf_next_input_section (&link_info, i)) einfo ("%X%P: can not size stub section: %E\n"); @@ -323,29 +326,30 @@ gld${EMULATION_NAME}_finish (void) ie. doesn't affect any code, so we can delay resizing the sections. It's likely we'll resize everything in the process of adding stubs. */ - if (bfd_elf_discard_info (output_bfd, &link_info)) + if (bfd_elf_discard_info (link_info.output_bfd, &link_info)) need_laying_out = 1; /* If generating a relocatable output file, then we don't have any stubs. */ if (stub_file != NULL && !link_info.relocatable) { - int ret = ppc64_elf_setup_section_lists (output_bfd, &link_info, + int ret = ppc64_elf_setup_section_lists (link_info.output_bfd, + &link_info, no_multi_toc); if (ret < 0) einfo ("%X%P: can not size stub section: %E\n"); else if (ret > 0) { - toc_section = bfd_get_section_by_name (output_bfd, ".got"); + toc_section = bfd_get_section_by_name (link_info.output_bfd, ".got"); if (toc_section != NULL) lang_for_each_statement (build_toc_list); - ppc64_elf_reinit_toc (output_bfd, &link_info); + ppc64_elf_reinit_toc (link_info.output_bfd, &link_info); lang_for_each_statement (build_section_lists); /* Call into the BFD backend to do the real work. */ - if (!ppc64_elf_size_stubs (output_bfd, + if (!ppc64_elf_size_stubs (link_info.output_bfd, &link_info, group_size, &ppc_add_stub_section, @@ -359,9 +363,9 @@ gld${EMULATION_NAME}_finish (void) if (link_info.relocatable) { - asection *toc = bfd_get_section_by_name (output_bfd, ".toc"); + asection *toc = bfd_get_section_by_name (link_info.output_bfd, ".toc"); if (toc != NULL - && bfd_section_size (output_bfd, toc) > 0x10000) + && bfd_section_size (link_info.output_bfd, toc) > 0x10000) einfo ("%X%P: TOC section size exceeds 64k\n"); } diff --git a/ld/emultempl/scoreelf.em b/ld/emultempl/scoreelf.em index 369ad763bf..f6cb5100ca 100644 --- a/ld/emultempl/scoreelf.em +++ b/ld/emultempl/scoreelf.em @@ -1,5 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2006, 2007 Free Software Foundation, Inc. +# Copyright 2006, 2007, 2008 Free Software Foundation, Inc. # Contributed by: # Mei Ligang (ligang@sunnorth.com.cn) # Pei-Lin Tsai (pltsai@sunplus.com) @@ -40,7 +40,7 @@ gld${EMULATION_NAME}_before_parse () static void score_elf_after_open (void) { - if (strstr (bfd_get_target (output_bfd), "score") == NULL) + if (strstr (bfd_get_target (link_info.output_bfd), "score") == NULL) { /* The score backend needs special fields in the output hash structure. These will only be created if the output format is an score format, diff --git a/ld/emultempl/sh64elf.em b/ld/emultempl/sh64elf.em index 0433cf9724..d8cce23230 100644 --- a/ld/emultempl/sh64elf.em +++ b/ld/emultempl/sh64elf.em @@ -1,5 +1,6 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2000, 2001, 2002, 2003, 2004, 2007 Free Software Foundation, Inc. +# Copyright 2000, 2001, 2002, 2003, 2004, 2007, 2008 +# Free Software Foundation, Inc. # # This file is part of the GNU Binutils. # @@ -53,7 +54,8 @@ sh64_elf_${EMULATION_NAME}_before_allocation (void) /* Call main function; we're just extending it. */ gld${EMULATION_NAME}_before_allocation (); - cranges = bfd_get_section_by_name (output_bfd, SH64_CRANGES_SECTION_NAME); + cranges = bfd_get_section_by_name (link_info.output_bfd, + SH64_CRANGES_SECTION_NAME); if (cranges != NULL) { @@ -117,7 +119,7 @@ sh64_elf_${EMULATION_NAME}_before_allocation (void) /* For each non-empty input section in each output section, check if it has the same SH64-specific flags. If some input section differs, we need a .cranges section. */ - for (osec = output_bfd->sections; + for (osec = link_info.output_bfd->sections; osec != NULL; osec = osec->next) { @@ -125,13 +127,13 @@ sh64_elf_${EMULATION_NAME}_before_allocation (void) bfd_vma oflags_isa = 0; bfd_vma iflags_isa = 0; - if (bfd_get_flavour (output_bfd) != bfd_target_elf_flavour) + if (bfd_get_flavour (link_info.output_bfd) != bfd_target_elf_flavour) einfo (_("%FError: non-ELF output formats are not supported by this target's linker.\n")); sh64_sec_data = sh64_elf_section_data (osec)->sh64_info; /* Omit excluded or garbage-collected sections. */ - if (bfd_get_section_flags (output_bfd, osec) & SEC_EXCLUDE) + if (bfd_get_section_flags (link_info.output_bfd, osec) & SEC_EXCLUDE) continue; /* Make sure we have the target section data initialized. */ @@ -201,10 +203,10 @@ sh64_elf_${EMULATION_NAME}_before_allocation (void) sh64_elf_section_data; no need to set it specifically here. */ cranges - = bfd_make_section (output_bfd, + = bfd_make_section (link_info.output_bfd, SH64_CRANGES_SECTION_NAME); if (cranges == NULL - || !bfd_set_section_flags (output_bfd, + || !bfd_set_section_flags (link_info.output_bfd, cranges, SEC_LINKER_CREATED | SEC_KEEP @@ -245,8 +247,8 @@ sh64_elf_${EMULATION_NAME}_after_allocation (void) asection *osec; bfd_byte *crangesp; - asection *cranges - = bfd_get_section_by_name (output_bfd, SH64_CRANGES_SECTION_NAME); + asection *cranges = bfd_get_section_by_name (link_info.output_bfd, + SH64_CRANGES_SECTION_NAME); /* If this ever starts doing something, we will pick it up. */ after_allocation_default (); @@ -261,7 +263,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation (void) first non-discarded section. For each input section in osec, we check if it has the same flags. If it does not, we set flags to mark a mixed section (and exit the loop early). */ - for (osec = output_bfd->sections; + for (osec = link_info.output_bfd->sections; osec != NULL; osec = osec->next) { @@ -269,7 +271,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation (void) bfd_boolean need_check_cranges = FALSE; /* Omit excluded or garbage-collected sections. */ - if (bfd_get_section_flags (output_bfd, osec) & SEC_EXCLUDE) + if (bfd_get_section_flags (link_info.output_bfd, osec) & SEC_EXCLUDE) continue; /* First find an input section so we have flags to compare with; the @@ -408,7 +410,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation (void) /* Now pass over the sections again, and make reloc orders for the new .cranges entries. Constants are set as we go. */ - for (osec = output_bfd->sections; + for (osec = link_info.output_bfd->sections; osec != NULL; osec = osec->next) { @@ -419,7 +421,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation (void) /* Omit excluded or garbage-collected sections, and output sections which were not marked as needing further processing. */ - if ((bfd_get_section_flags (output_bfd, osec) & SEC_EXCLUDE) != 0 + if ((bfd_get_section_flags (link_info.output_bfd, osec) & SEC_EXCLUDE) != 0 || (sh64_elf_section_data (osec)->sh64_info->contents_flags != SHF_SH5_ISA32_MIXED)) continue; @@ -477,7 +479,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation (void) == osec->vma + isec->output_offset)) { last_cr_size += cr_size; - bfd_put_32 (output_bfd, last_cr_size, + bfd_put_32 (link_info.output_bfd, last_cr_size, crangesp - SH64_CRANGE_SIZE + SH64_CRANGE_CR_SIZE_OFFSET); @@ -494,7 +496,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation (void) would leave us free to do some optimizations later. */ cr_addr_order - = bfd_new_link_order (output_bfd, cranges); + = bfd_new_link_order (link_info.output_bfd, cranges); if (cr_addr_order == NULL) { @@ -518,12 +520,12 @@ sh64_elf_${EMULATION_NAME}_after_allocation (void) "partial inplace" REL-like relocation for this, we put the addend in the contents and specify 0 for the reloc. */ - bfd_put_32 (output_bfd, isec->output_offset, + bfd_put_32 (link_info.output_bfd, isec->output_offset, crangesp + SH64_CRANGE_CR_ADDR_OFFSET); cr_addr_order->u.reloc.p->addend = 0; } else - bfd_put_32 (output_bfd, + bfd_put_32 (link_info.output_bfd, osec->vma + isec->output_offset, crangesp + SH64_CRANGE_CR_ADDR_OFFSET); @@ -531,10 +533,10 @@ sh64_elf_${EMULATION_NAME}_after_allocation (void) it, but we would have to have a symbol for the size of the _input_ section and there's no way to generate that. */ - bfd_put_32 (output_bfd, cr_size, + bfd_put_32 (link_info.output_bfd, cr_size, crangesp + SH64_CRANGE_CR_SIZE_OFFSET); - bfd_put_16 (output_bfd, cr_type, + bfd_put_16 (link_info.output_bfd, cr_type, crangesp + SH64_CRANGE_CR_TYPE_OFFSET); last_cr_type = cr_type; diff --git a/ld/emultempl/spuelf.em b/ld/emultempl/spuelf.em index bbaf098c05..14d1d9e66f 100644 --- a/ld/emultempl/spuelf.em +++ b/ld/emultempl/spuelf.em @@ -64,7 +64,7 @@ is_spu_target (void) { extern const bfd_target bfd_elf32_spu_vec; - return link_info.hash->creator == &bfd_elf32_spu_vec; + return link_info.output_bfd->xvec == &bfd_elf32_spu_vec; } /* Create our note section. */ @@ -75,7 +75,7 @@ spu_after_open (void) if (is_spu_target () && !link_info.relocatable && link_info.input_bfds != NULL - && !spu_elf_create_sections (output_bfd, &link_info, + && !spu_elf_create_sections (link_info.output_bfd, &link_info, stack_analysis, emit_stack_syms)) einfo ("%X%P: can not create note section: %E\n"); @@ -198,11 +198,11 @@ spu_before_allocation (void) one_lang_size_sections_pass (NULL, TRUE); /* Find overlays by inspecting section vmas. */ - if (spu_elf_find_overlays (output_bfd, &link_info)) + if (spu_elf_find_overlays (link_info.output_bfd, &link_info)) { int ret; - ret = spu_elf_size_stubs (output_bfd, &link_info, + ret = spu_elf_size_stubs (link_info.output_bfd, &link_info, spu_place_special_section, non_overlay_stubs); if (ret == 0) @@ -225,7 +225,7 @@ gld${EMULATION_NAME}_finish (void) { int need_laying_out; - need_laying_out = bfd_elf_discard_info (output_bfd, &link_info); + need_laying_out = bfd_elf_discard_info (link_info.output_bfd, &link_info); gld${EMULATION_NAME}_map_segments (need_laying_out); @@ -233,7 +233,8 @@ gld${EMULATION_NAME}_finish (void) { asection *s; - s = spu_elf_check_vma (output_bfd, local_store_lo, local_store_hi); + s = spu_elf_check_vma (link_info.output_bfd, + local_store_lo, local_store_hi); if (s != NULL) einfo ("%X%P: %A exceeds local store range\n", s); } diff --git a/ld/emultempl/sunos.em b/ld/emultempl/sunos.em index 00d949ffef..6367c3c803 100644 --- a/ld/emultempl/sunos.em +++ b/ld/emultempl/sunos.em @@ -10,7 +10,7 @@ fragment < SunOS shared library support by Ian Lance Taylor @@ -378,7 +378,7 @@ gld${EMULATION_NAME}_after_open (void) include another without requiring special action by the person doing the link. Note that the needed list can actually grow while we are stepping through this loop. */ - needed = bfd_sunos_get_needed_list (output_bfd, &link_info); + needed = bfd_sunos_get_needed_list (link_info.output_bfd, &link_info); for (l = needed; l != NULL; l = l->next) { struct bfd_link_needed_list *ll; @@ -405,7 +405,7 @@ gld${EMULATION_NAME}_after_open (void) { bfd *abfd; - abfd = bfd_openr (lname, bfd_get_target (output_bfd)); + abfd = bfd_openr (lname, bfd_get_target (link_info.output_bfd)); if (abfd != NULL) { if (! bfd_check_format (abfd, bfd_object)) @@ -555,7 +555,7 @@ gld${EMULATION_NAME}_try_needed (const char *dir, const char *name) alc = (char *) xmalloc (strlen (dir) + strlen (file) + 2); sprintf (alc, "%s/%s", dir, file); free (file); - abfd = bfd_openr (alc, bfd_get_target (output_bfd)); + abfd = bfd_openr (alc, bfd_get_target (link_info.output_bfd)); if (abfd == NULL) return FALSE; if (! bfd_check_format (abfd, bfd_object)) @@ -715,7 +715,7 @@ gld${EMULATION_NAME}_before_allocation (void) FALSE); if (hdyn == NULL) einfo ("%P%F: bfd_link_hash_lookup: %E\n"); - if (! bfd_sunos_record_link_assignment (output_bfd, &link_info, + if (! bfd_sunos_record_link_assignment (link_info.output_bfd, &link_info, "__DYNAMIC")) einfo ("%P%F: failed to record assignment to __DYNAMIC: %E\n"); } @@ -727,8 +727,8 @@ gld${EMULATION_NAME}_before_allocation (void) /* Let the backend linker work out the sizes of any sections required by dynamic linking. */ - if (! bfd_sunos_size_dynamic_sections (output_bfd, &link_info, &sdyn, - &sneed, &srules)) + if (! bfd_sunos_size_dynamic_sections (link_info.output_bfd, &link_info, + &sdyn, &sneed, &srules)) einfo ("%P%F: failed to set dynamic section sizes: %E\n"); if (sneed != NULL) @@ -847,7 +847,8 @@ gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp) if (strcmp (exp->assign.dst, ".") != 0) { - if (! bfd_sunos_record_link_assignment (output_bfd, &link_info, + if (! bfd_sunos_record_link_assignment (link_info.output_bfd, + &link_info, exp->assign.dst)) einfo ("%P%F: failed to record assignment to %s: %E\n", exp->assign.dst); @@ -914,12 +915,13 @@ gld${EMULATION_NAME}_set_need (lang_input_statement_type *inp) Instead, we use offsets, and rely on the BFD backend to finish the section up correctly. FIXME: Talk about lack of referential locality. */ - bfd_put_32 (output_bfd, need_pnames - need_contents, need_pinfo); + bfd_put_32 (link_info.output_bfd, need_pnames - need_contents, + need_pinfo); if (! inp->is_archive) { - bfd_put_32 (output_bfd, (bfd_vma) 0, need_pinfo + 4); - bfd_put_16 (output_bfd, (bfd_vma) 0, need_pinfo + 8); - bfd_put_16 (output_bfd, (bfd_vma) 0, need_pinfo + 10); + bfd_put_32 (link_info.output_bfd, (bfd_vma) 0, need_pinfo + 4); + bfd_put_16 (link_info.output_bfd, (bfd_vma) 0, need_pinfo + 8); + bfd_put_16 (link_info.output_bfd, (bfd_vma) 0, need_pinfo + 10); strcpy ((char *) need_pnames, inp->filename); } else @@ -927,22 +929,23 @@ gld${EMULATION_NAME}_set_need (lang_input_statement_type *inp) char *verstr; int maj, min; - bfd_put_32 (output_bfd, (bfd_vma) 0x80000000, need_pinfo + 4); + bfd_put_32 (link_info.output_bfd, (bfd_vma) 0x80000000, + need_pinfo + 4); maj = 0; min = 0; verstr = strstr (inp->filename, ".so."); if (verstr != NULL) sscanf (verstr, ".so.%d.%d", &maj, &min); - bfd_put_16 (output_bfd, (bfd_vma) maj, need_pinfo + 8); - bfd_put_16 (output_bfd, (bfd_vma) min, need_pinfo + 10); + bfd_put_16 (link_info.output_bfd, (bfd_vma) maj, need_pinfo + 8); + bfd_put_16 (link_info.output_bfd, (bfd_vma) min, need_pinfo + 10); strcpy ((char *) need_pnames, inp->local_sym_name + 2); } c = (need_pinfo - need_contents) / NEED_ENTRY_SIZE; if (c + 1 >= need_entries) - bfd_put_32 (output_bfd, (bfd_vma) 0, need_pinfo + 12); + bfd_put_32 (link_info.output_bfd, (bfd_vma) 0, need_pinfo + 12); else - bfd_put_32 (output_bfd, (bfd_vma) (c + 1) * NEED_ENTRY_SIZE, + bfd_put_32 (link_info.output_bfd, (bfd_vma) (c + 1) * NEED_ENTRY_SIZE, need_pinfo + 12); need_pinfo += NEED_ENTRY_SIZE; diff --git a/ld/emultempl/vanilla.em b/ld/emultempl/vanilla.em index 8ed2a5abea..bd8039a3d2 100644 --- a/ld/emultempl/vanilla.em +++ b/ld/emultempl/vanilla.em @@ -2,7 +2,7 @@ # It does some substitutions. fragment <xvec->flavour == bfd_target_elf_flavour + && bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour && !_bfd_elf_link_create_dynamic_sections (link_info.input_bfds, &link_info)) einfo ("%X%P: Cannot create dynamic sections %E\n"); if (!force_dynamic && !link_info.shared - && output_bfd->xvec->flavour == bfd_target_elf_flavour + && bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour && elf_hash_table (&link_info)->dynamic_sections_created) einfo ("%X%P: Dynamic sections created in non-dynamic link\n"); } diff --git a/ld/emultempl/xtensaelf.em b/ld/emultempl/xtensaelf.em index f09515ac81..6651a50c96 100644 --- a/ld/emultempl/xtensaelf.em +++ b/ld/emultempl/xtensaelf.em @@ -1,5 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2003, 2004, 2005, 2006, 2007 +# Copyright 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. # # This file is part of the GNU Binutils. @@ -434,12 +434,14 @@ elf_xtensa_before_allocation (void) required to process relocations) for the selected Xtensa configuration. */ - if (is_big_endian && output_bfd->xvec->byteorder == BFD_ENDIAN_LITTLE) + if (is_big_endian + && link_info.output_bfd->xvec->byteorder == BFD_ENDIAN_LITTLE) { einfo (_("%F%P: little endian output does not match " "Xtensa configuration\n")); } - if (!is_big_endian && output_bfd->xvec->byteorder == BFD_ENDIAN_BIG) + if (!is_big_endian + && link_info.output_bfd->xvec->byteorder == BFD_ENDIAN_BIG) { einfo (_("%F%P: big endian output does not match " "Xtensa configuration\n")); diff --git a/ld/emultempl/z80.em b/ld/emultempl/z80.em index 7b17e8fc2b..37ef944e10 100644 --- a/ld/emultempl/z80.em +++ b/ld/emultempl/z80.em @@ -1,7 +1,7 @@ # This shell script emits C code -*- C -*- # to keep track of the machine type of Z80 object files # It does some substitutions. -# Copyright 2007 Free Software Foundation, Inc. +# Copyright 2007, 2008 Free Software Foundation, Inc. # This file is part of the GNU Binutils. # # This program is free software; you can redistribute it and/or modify @@ -96,7 +96,7 @@ gldz80_after_open (void) default: mach_type = 0; } - bfd_set_arch_mach (output_bfd, bfd_arch_z80, mach_type); + bfd_set_arch_mach (link_info.output_bfd, bfd_arch_z80, mach_type); } /* --- \end{z80.em} */ EOF diff --git a/ld/ldcref.c b/ld/ldcref.c index 4ebb8cddf4..890b61cbd5 100644 --- a/ld/ldcref.c +++ b/ld/ldcref.c @@ -1,6 +1,6 @@ /* ldcref.c -- output a cross reference table Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, - 2007 Free Software Foundation, Inc. + 2007, 2008 Free Software Foundation, Inc. Written by Ian Lance Taylor This file is part of the GNU Binutils. @@ -327,7 +327,7 @@ cref_fill_array (struct cref_hash_entry *h, void *data) struct cref_hash_entry ***pph = data; ASSERT (h->demangled == NULL); - h->demangled = bfd_demangle (output_bfd, h->root.string, + h->demangled = bfd_demangle (link_info.output_bfd, h->root.string, DMGL_ANSI | DMGL_PARAMS); if (h->demangled == NULL) h->demangled = h->root.string; diff --git a/ld/ldctor.c b/ld/ldctor.c index f16e25e74e..12adcecc94 100644 --- a/ld/ldctor.c +++ b/ld/ldctor.c @@ -1,6 +1,6 @@ /* ldctor.c -- constructor support routines Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc. + 2002, 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. By Steve Chamberlain This file is part of the GNU Binutils. @@ -273,13 +273,13 @@ ldctor_build_sets (void) except that we use the right size instead of .long. When generating relocatable output, we generate relocs instead of addresses. */ - howto = bfd_reloc_type_lookup (output_bfd, p->reloc); + howto = bfd_reloc_type_lookup (link_info.output_bfd, p->reloc); if (howto == NULL) { if (link_info.relocatable) { einfo (_("%P%X: %s does not support reloc %s for set %s\n"), - bfd_get_target (output_bfd), + bfd_get_target (link_info.output_bfd), bfd_get_reloc_code_name (p->reloc), p->h->root.string); continue; diff --git a/ld/ldemul.c b/ld/ldemul.c index b112bf47b1..6b86ddfce4 100644 --- a/ld/ldemul.c +++ b/ld/ldemul.c @@ -1,6 +1,6 @@ /* ldemul.c -- clearing house for ld emulation states Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2005, 2007 + 2001, 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc. This file is part of the GNU Binutils. @@ -218,14 +218,14 @@ void finish_default (void) { if (!link_info.relocatable) - _bfd_fix_excluded_sec_syms (output_bfd, &link_info); + _bfd_fix_excluded_sec_syms (link_info.output_bfd, &link_info); } void set_output_arch_default (void) { /* Set the output architecture and machine if possible. */ - bfd_set_arch_mach (output_bfd, + bfd_set_arch_mach (link_info.output_bfd, ldfile_output_architecture, ldfile_output_machine); } diff --git a/ld/ldexp.c b/ld/ldexp.c index 5e2812d5ba..16ee5dd556 100644 --- a/ld/ldexp.c +++ b/ld/ldexp.c @@ -1,6 +1,6 @@ /* This module handles expression trees. Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Written by Steve Chamberlain of Cygnus Support . @@ -489,7 +489,7 @@ fold_name (etree_type *tree) /* Don't find the real header size if only marking sections; The bfd function may cache incorrect data. */ if (expld.phase != lang_mark_phase_enum) - hdr_size = bfd_sizeof_headers (output_bfd, &link_info); + hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info); new_abs (hdr_size); } break; @@ -503,7 +503,8 @@ fold_name (etree_type *tree) int def_iteration = lang_symbol_definition_iteration (tree->name.name); - h = bfd_wrapped_link_hash_lookup (output_bfd, &link_info, + h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, + &link_info, tree->name.name, FALSE, FALSE, TRUE); expld.result.value = (h != NULL @@ -526,7 +527,8 @@ fold_name (etree_type *tree) { struct bfd_link_hash_entry *h; - h = bfd_wrapped_link_hash_lookup (output_bfd, &link_info, + h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, + &link_info, tree->name.name, TRUE, FALSE, TRUE); if (!h) @@ -628,7 +630,8 @@ fold_name (etree_type *tree) bfd_vma val; if (tree->type.node_code == SIZEOF) - val = os->bfd_section->size / bfd_octets_per_byte (output_bfd); + val = (os->bfd_section->size + / bfd_octets_per_byte (link_info.output_bfd)); else val = (bfd_vma)1 << os->bfd_section->alignment_power; diff --git a/ld/ldfile.c b/ld/ldfile.c index 4a11fb1fef..f76aec4635 100644 --- a/ld/ldfile.c +++ b/ld/ldfile.c @@ -272,11 +272,11 @@ ldfile_try_open_bfd (const char *attempt, } if (entry->search_dirs_flag - && !bfd_arch_get_compatible (check, output_bfd, + && !bfd_arch_get_compatible (check, link_info.output_bfd, command_line.accept_unknown_input_arch) /* XCOFF archives can have 32 and 64 bit objects. */ && ! (bfd_get_flavour (check) == bfd_target_xcoff_flavour - && bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour + && bfd_get_flavour (link_info.output_bfd) == bfd_target_xcoff_flavour && bfd_check_format (entry->the_bfd, bfd_archive))) { if (command_line.warn_search_mismatch) diff --git a/ld/ldlang.c b/ld/ldlang.c index 1e9b0904aa..262c94b671 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -1312,7 +1312,8 @@ lang_output_section_find_by_flags (const asection *sec, if (look->bfd_section != NULL) { flags = look->bfd_section->flags; - if (match_type && !match_type (output_bfd, look->bfd_section, + if (match_type && !match_type (link_info.output_bfd, + look->bfd_section, sec->owner, sec)) continue; } @@ -1337,7 +1338,8 @@ lang_output_section_find_by_flags (const asection *sec, if (look->bfd_section != NULL) { flags = look->bfd_section->flags; - if (match_type && !match_type (output_bfd, look->bfd_section, + if (match_type && !match_type (link_info.output_bfd, + look->bfd_section, sec->owner, sec)) continue; } @@ -1356,7 +1358,8 @@ lang_output_section_find_by_flags (const asection *sec, if (look->bfd_section != NULL) { flags = look->bfd_section->flags; - if (match_type && !match_type (output_bfd, look->bfd_section, + if (match_type && !match_type (link_info.output_bfd, + look->bfd_section, sec->owner, sec)) continue; } @@ -1376,7 +1379,8 @@ lang_output_section_find_by_flags (const asection *sec, if (look->bfd_section != NULL) { flags = look->bfd_section->flags; - if (match_type && !match_type (output_bfd, look->bfd_section, + if (match_type && !match_type (link_info.output_bfd, + look->bfd_section, sec->owner, sec)) continue; } @@ -1397,7 +1401,8 @@ lang_output_section_find_by_flags (const asection *sec, if (look->bfd_section != NULL) { flags = look->bfd_section->flags; - if (match_type && !match_type (output_bfd, look->bfd_section, + if (match_type && !match_type (link_info.output_bfd, + look->bfd_section, sec->owner, sec)) continue; } @@ -1416,7 +1421,8 @@ lang_output_section_find_by_flags (const asection *sec, if (look->bfd_section != NULL) { flags = look->bfd_section->flags; - if (match_type && !match_type (output_bfd, look->bfd_section, + if (match_type && !match_type (link_info.output_bfd, + look->bfd_section, sec->owner, sec)) continue; } @@ -1560,7 +1566,7 @@ lang_insert_orphan (asection *s, etree_type *e_align; symname = (char *) xmalloc (ps - secname + sizeof "__start_" + 1); - symname[0] = bfd_get_symbol_leading_char (output_bfd); + symname[0] = bfd_get_symbol_leading_char (link_info.output_bfd); sprintf (symname + (symname[0] != 0), "__start_%s", secname); e_align = exp_unop (ALIGN_K, exp_intop ((bfd_vma) 1 << s->alignment_power)); @@ -1595,7 +1601,7 @@ lang_insert_orphan (asection *s, stat_ptr = &add; symname = (char *) xmalloc (ps - secname + sizeof "__stop_" + 1); - symname[0] = bfd_get_symbol_leading_char (output_bfd); + symname[0] = bfd_get_symbol_leading_char (link_info.output_bfd); sprintf (symname + (symname[0] != 0), "__stop_%s", secname); lang_add_assignment (exp_provide (symname, exp_nameop (NAME, "."), @@ -1632,7 +1638,7 @@ lang_insert_orphan (asection *s, } if (place->section == NULL) - place->section = &output_bfd->sections; + place->section = &link_info.output_bfd->sections; as = *place->section; @@ -1641,18 +1647,18 @@ lang_insert_orphan (asection *s, /* Put the section at the end of the list. */ /* Unlink the section. */ - bfd_section_list_remove (output_bfd, snew); + bfd_section_list_remove (link_info.output_bfd, snew); /* Now tack it back on in the right place. */ - bfd_section_list_append (output_bfd, snew); + bfd_section_list_append (link_info.output_bfd, snew); } else if (as != snew && as->prev != snew) { /* Unlink the section. */ - bfd_section_list_remove (output_bfd, snew); + bfd_section_list_remove (link_info.output_bfd, snew); /* Now tack it back on in the right place. */ - bfd_section_list_insert_before (output_bfd, as, snew); + bfd_section_list_insert_before (link_info.output_bfd, as, snew); } /* Save the end of this list. Further ophans of this type will @@ -1757,7 +1763,7 @@ lang_map (void) for (s = file->the_bfd->sections; s != NULL; s = s->next) if ((s->output_section == NULL - || s->output_section->owner != output_bfd) + || s->output_section->owner != link_info.output_bfd) && (s->flags & (SEC_LINKER_CREATED | SEC_KEEP)) == 0) { if (! dis_header_printed) @@ -1882,14 +1888,14 @@ init_os (lang_output_section_statement_type *s, asection *isec, if (strcmp (s->name, DISCARD_SECTION_NAME) == 0) einfo (_("%P%F: Illegal use of `%s' section\n"), DISCARD_SECTION_NAME); - s->bfd_section = bfd_get_section_by_name (output_bfd, s->name); + s->bfd_section = bfd_get_section_by_name (link_info.output_bfd, s->name); if (s->bfd_section == NULL) - s->bfd_section = bfd_make_section_with_flags (output_bfd, s->name, - flags); + s->bfd_section = bfd_make_section_with_flags (link_info.output_bfd, + s->name, flags); if (s->bfd_section == NULL) { einfo (_("%P%F: output format %s cannot represent section called %s\n"), - output_bfd->xvec->name, s->name); + link_info.output_bfd->xvec->name, s->name); } s->bfd_section->output_section = s->bfd_section; s->bfd_section->output_offset = 0; @@ -1916,7 +1922,7 @@ init_os (lang_output_section_statement_type *s, asection *isec, if (isec) bfd_init_private_section_data (isec->owner, isec, - output_bfd, s->bfd_section, + link_info.output_bfd, s->bfd_section, &link_info); } @@ -2763,11 +2769,9 @@ lang_get_output_target (void) /* Open the output file. */ -static bfd * +static void open_output (const char *name) { - bfd *output; - output_target = lang_get_output_target (); /* Has the user requested a particular endianness on the command @@ -2819,9 +2823,9 @@ open_output (const char *name) } } - output = bfd_openw (name, output_target); + link_info.output_bfd = bfd_openw (name, output_target); - if (output == NULL) + if (link_info.output_bfd == NULL) { if (bfd_get_error () == bfd_error_invalid_target) einfo (_("%P%F: target %s not found\n"), output_target); @@ -2831,19 +2835,18 @@ open_output (const char *name) delete_output_file_on_failure = TRUE; - if (! bfd_set_format (output, bfd_object)) + if (! bfd_set_format (link_info.output_bfd, bfd_object)) einfo (_("%P%F:%s: can not make object file: %E\n"), name); - if (! bfd_set_arch_mach (output, + if (! bfd_set_arch_mach (link_info.output_bfd, ldfile_output_architecture, ldfile_output_machine)) einfo (_("%P%F:%s: can not set architecture: %E\n"), name); - link_info.hash = bfd_link_hash_table_create (output); + link_info.hash = bfd_link_hash_table_create (link_info.output_bfd); if (link_info.hash == NULL) einfo (_("%P%F: can not create hash table: %E\n")); - bfd_set_gp_size (output, g_switch_value); - return output; + bfd_set_gp_size (link_info.output_bfd, g_switch_value); } static void @@ -2852,21 +2855,21 @@ ldlang_open_output (lang_statement_union_type *statement) switch (statement->header.type) { case lang_output_statement_enum: - ASSERT (output_bfd == NULL); - output_bfd = open_output (statement->output_statement.name); + ASSERT (link_info.output_bfd == NULL); + open_output (statement->output_statement.name); ldemul_set_output_arch (); if (config.magic_demand_paged && !link_info.relocatable) - output_bfd->flags |= D_PAGED; + link_info.output_bfd->flags |= D_PAGED; else - output_bfd->flags &= ~D_PAGED; + link_info.output_bfd->flags &= ~D_PAGED; if (config.text_read_only) - output_bfd->flags |= WP_TEXT; + link_info.output_bfd->flags |= WP_TEXT; else - output_bfd->flags &= ~WP_TEXT; + link_info.output_bfd->flags &= ~WP_TEXT; if (link_info.traditional_format) - output_bfd->flags |= BFD_TRADITIONAL_FORMAT; + link_info.output_bfd->flags |= BFD_TRADITIONAL_FORMAT; else - output_bfd->flags &= ~BFD_TRADITIONAL_FORMAT; + link_info.output_bfd->flags &= ~BFD_TRADITIONAL_FORMAT; break; case lang_target_statement_enum: @@ -3078,7 +3081,7 @@ ldlang_add_undef (const char *const name) new->name = xstrdup (name); - if (output_bfd != NULL) + if (link_info.output_bfd != NULL) insert_undefined (new->name); } @@ -3446,17 +3449,17 @@ process_insert_statements (void) if (first_sec->prev != NULL) first_sec->prev->next = last_sec->next; else - output_bfd->sections = last_sec->next; + link_info.output_bfd->sections = last_sec->next; if (last_sec->next != NULL) last_sec->next->prev = first_sec->prev; else - output_bfd->section_last = first_sec->prev; + link_info.output_bfd->section_last = first_sec->prev; /* Add back. */ last_sec->next = sec->next; if (sec->next != NULL) sec->next->prev = last_sec; else - output_bfd->section_last = last_sec; + link_info.output_bfd->section_last = last_sec; first_sec->prev = sec; sec->next = first_sec; } @@ -3516,7 +3519,7 @@ strip_excluded_output_sections (void) exclude = (output_section->rawsize == 0 && (output_section->flags & SEC_KEEP) == 0 - && !bfd_section_removed_from_list (output_bfd, + && !bfd_section_removed_from_list (link_info.output_bfd, output_section)); /* Some sections have not yet been sized, notably .gnu.version, @@ -3548,8 +3551,8 @@ strip_excluded_output_sections (void) && !os->update_dot_tree) os->ignored = TRUE; output_section->flags |= SEC_EXCLUDE; - bfd_section_list_remove (output_bfd, output_section); - output_bfd->section_count--; + bfd_section_list_remove (link_info.output_bfd, output_section); + link_info.output_bfd->section_count--; } } @@ -3799,7 +3802,8 @@ print_input_section (asection *i) ++len; } - if (i->output_section != NULL && i->output_section->owner == output_bfd) + if (i->output_section != NULL + && i->output_section->owner == link_info.output_bfd) addr = i->output_section->vma + i->output_offset; else { @@ -3826,7 +3830,8 @@ print_input_section (asection *i) minfo (_("%W (size before relaxing)\n"), i->rawsize); } - if (i->output_section != NULL && i->output_section->owner == output_bfd) + if (i->output_section != NULL + && i->output_section->owner == link_info.output_bfd) { if (link_info.reduce_memory_overheads) bfd_link_hash_traverse (link_info.hash, print_one_symbol, i); @@ -4300,15 +4305,15 @@ lang_check_section_addresses (void) bfd_size_type amt; lang_memory_region_type *m; - if (bfd_count_sections (output_bfd) <= 1) + if (bfd_count_sections (link_info.output_bfd) <= 1) return; - amt = bfd_count_sections (output_bfd) * sizeof (asection *); + amt = bfd_count_sections (link_info.output_bfd) * sizeof (asection *); sections = xmalloc (amt); /* Scan all sections in the output list. */ count = 0; - for (s = output_bfd->sections; s != NULL; s = s->next) + for (s = link_info.output_bfd->sections; s != NULL; s = s->next) { /* Only consider loadable sections with real contents. */ if (IGNORE_SECTION (s) || s->size == 0) @@ -4326,7 +4331,7 @@ lang_check_section_addresses (void) spp = sections; s = *spp++; - s_start = bfd_section_lma (output_bfd, s); + s_start = bfd_section_lma (link_info.output_bfd, s); s_end = s_start + TO_ADDR (s->size) - 1; for (count--; count; count--) { @@ -4337,7 +4342,7 @@ lang_check_section_addresses (void) os_start = s_start; os_end = s_end; s = *spp++; - s_start = bfd_section_lma (output_bfd, s); + s_start = bfd_section_lma (link_info.output_bfd, s); s_end = s_start + TO_ADDR (s->size) - 1; /* Look for an overlap. */ @@ -4445,8 +4450,10 @@ lang_size_sections_1 address from the input section. FIXME: This is COFF specific; it would be cleaner if there were some other way to do this, but nothing simple comes to mind. */ - if ((bfd_get_flavour (output_bfd) == bfd_target_ecoff_flavour - || bfd_get_flavour (output_bfd) == bfd_target_coff_flavour) + if (((bfd_get_flavour (link_info.output_bfd) + == bfd_target_ecoff_flavour) + || (bfd_get_flavour (link_info.output_bfd) + == bfd_target_coff_flavour)) && (os->bfd_section->flags & SEC_COFF_SHARED_LIBRARY) != 0) { asection *input; @@ -4516,12 +4523,12 @@ lang_size_sections_1 if (command_line.check_section_addresses) einfo (_("%P%F: error: no memory region specified" " for loadable section `%s'\n"), - bfd_get_section_name (output_bfd, + bfd_get_section_name (link_info.output_bfd, os->bfd_section)); else einfo (_("%P: warning: no memory region specified" " for loadable section `%s'\n"), - bfd_get_section_name (output_bfd, + bfd_get_section_name (link_info.output_bfd, os->bfd_section)); } @@ -5010,7 +5017,7 @@ lang_size_sections (bfd_boolean *relax, bfd_boolean check_regions) /* Find maximum alignment power of sections between DATA_SEGMENT_ALIGN and DATA_SEGMENT_RELRO_END. */ - for (sec = output_bfd->sections; sec; sec = sec->next) + for (sec = link_info.output_bfd->sections; sec; sec = sec->next) if (sec->vma >= expld.dataseg.base && sec->vma < expld.dataseg.relro_end && sec->alignment_power > max_alignment_power) @@ -5209,13 +5216,13 @@ lang_set_startof (void) if (link_info.relocatable) return; - for (s = output_bfd->sections; s != NULL; s = s->next) + for (s = link_info.output_bfd->sections; s != NULL; s = s->next) { const char *secname; char *buf; struct bfd_link_hash_entry *h; - secname = bfd_get_section_name (output_bfd, s); + secname = bfd_get_section_name (link_info.output_bfd, s); buf = xmalloc (10 + strlen (secname)); sprintf (buf, ".startof.%s", secname); @@ -5223,7 +5230,7 @@ lang_set_startof (void) if (h != NULL && h->type == bfd_link_hash_undefined) { h->type = bfd_link_hash_defined; - h->u.def.value = bfd_get_section_vma (output_bfd, s); + h->u.def.value = bfd_get_section_vma (link_info.output_bfd, s); h->u.def.section = bfd_abs_section_ptr; } @@ -5278,10 +5285,10 @@ lang_end (void) bfd_vma val; val = (h->u.def.value - + bfd_get_section_vma (output_bfd, + + bfd_get_section_vma (link_info.output_bfd, h->u.def.section->output_section) + h->u.def.section->output_offset); - if (! bfd_set_start_address (output_bfd, val)) + if (! bfd_set_start_address (link_info.output_bfd, val)) einfo (_("%P%F:%s: can't set start address\n"), entry_symbol.name); } else @@ -5294,7 +5301,7 @@ lang_end (void) val = bfd_scan_vma (entry_symbol.name, &send, 0); if (*send == '\0') { - if (! bfd_set_start_address (output_bfd, val)) + if (! bfd_set_start_address (link_info.output_bfd, val)) einfo (_("%P%F: can't set start address\n")); } else @@ -5303,17 +5310,17 @@ lang_end (void) /* Can't find the entry symbol, and it's not a number. Use the first address in the text section. */ - ts = bfd_get_section_by_name (output_bfd, entry_section); + ts = bfd_get_section_by_name (link_info.output_bfd, entry_section); if (ts != NULL) { if (warn) einfo (_("%P: warning: cannot find entry symbol %s;" " defaulting to %V\n"), entry_symbol.name, - bfd_get_section_vma (output_bfd, ts)); - if (! bfd_set_start_address (output_bfd, - bfd_get_section_vma (output_bfd, - ts))) + bfd_get_section_vma (link_info.output_bfd, ts)); + if (!(bfd_set_start_address + (link_info.output_bfd, + bfd_get_section_vma (link_info.output_bfd, ts)))) einfo (_("%P%F: can't set start address\n")); } else @@ -5354,7 +5361,7 @@ lang_check (void) { input_bfd = file->input_statement.the_bfd; compatible - = bfd_arch_get_compatible (input_bfd, output_bfd, + = bfd_arch_get_compatible (input_bfd, link_info.output_bfd, command_line.accept_unknown_input_arch); /* In general it is not possible to perform a relocatable @@ -5365,13 +5372,14 @@ lang_check (void) relocs for other link purposes than a final link). */ if ((link_info.relocatable || link_info.emitrelocations) && (compatible == NULL - || bfd_get_flavour (input_bfd) != bfd_get_flavour (output_bfd)) + || (bfd_get_flavour (input_bfd) + != bfd_get_flavour (link_info.output_bfd))) && (bfd_get_file_flags (input_bfd) & HAS_RELOC) != 0) { einfo (_("%P%F: Relocatable linking with relocations from" " format %s (%B) to format %s (%B) is not supported\n"), bfd_get_target (input_bfd), input_bfd, - bfd_get_target (output_bfd), output_bfd); + bfd_get_target (link_info.output_bfd), link_info.output_bfd); /* einfo with %F exits. */ } @@ -5381,7 +5389,7 @@ lang_check (void) einfo (_("%P%X: %s architecture of input file `%B'" " is incompatible with %s output\n"), bfd_printable_name (input_bfd), input_bfd, - bfd_printable_name (output_bfd)); + bfd_printable_name (link_info.output_bfd)); } else if (bfd_count_sections (input_bfd)) { @@ -5397,7 +5405,7 @@ lang_check (void) information which is needed in the output file. */ if (! command_line.warn_mismatch) pfn = bfd_set_error_handler (ignore_bfd_errors); - if (! bfd_merge_private_bfd_data (input_bfd, output_bfd)) + if (! bfd_merge_private_bfd_data (input_bfd, link_info.output_bfd)) { if (command_line.warn_mismatch) einfo (_("%P%X: failed to merge target specific data" @@ -5489,7 +5497,7 @@ lang_one_common (struct bfd_link_hash_entry *h, void *info) header_printed = TRUE; } - name = bfd_demangle (output_bfd, h->root.string, + name = bfd_demangle (link_info.output_bfd, h->root.string, DMGL_ANSI | DMGL_PARAMS); if (name == NULL) { @@ -5664,7 +5672,7 @@ ldlang_add_file (lang_input_statement_type *entry) /* The BFD linker needs to have a list of all input BFDs involved in a link. */ ASSERT (entry->the_bfd->link_next == NULL); - ASSERT (entry->the_bfd != output_bfd); + ASSERT (entry->the_bfd != link_info.output_bfd); *link_info.input_bfds_tail = entry->the_bfd; link_info.input_bfds_tail = &entry->the_bfd->link_next; @@ -5786,7 +5794,7 @@ lang_reset_memory_regions (void) os->processed_lma = FALSE; } - for (o = output_bfd->sections; o != NULL; o = o->next) + for (o = link_info.output_bfd->sections; o != NULL; o = o->next) { /* Save the last size for possible use by bfd_relax_section. */ o->rawsize = o->size; @@ -5858,7 +5866,7 @@ lang_gc_sections (void) } if (link_info.gc_sections) - bfd_gc_sections (output_bfd, &link_info); + bfd_gc_sections (link_info.output_bfd, &link_info); } /* Worker for lang_find_relro_sections_1. */ @@ -5873,7 +5881,7 @@ find_relro_section_callback (lang_wild_statement_type *ptr ATTRIBUTE_UNUSED, /* Discarded, excluded and ignored sections effectively have zero size. */ if (section->output_section != NULL - && section->output_section->owner == output_bfd + && section->output_section->owner == link_info.output_bfd && (section->output_section->flags & SEC_EXCLUDE) == 0 && !IGNORE_SECTION (section) && section->size != 0) @@ -6043,10 +6051,10 @@ lang_process (void) sections, so that GCed sections are not merged, but before assigning dynamic symbols, since removing whole input sections is hard then. */ - bfd_merge_sections (output_bfd, &link_info); + bfd_merge_sections (link_info.output_bfd, &link_info); /* Look for a text section and set the readonly attribute in it. */ - found = bfd_get_section_by_name (output_bfd, ".text"); + found = bfd_get_section_by_name (link_info.output_bfd, ".text"); if (found != NULL) { @@ -6376,11 +6384,11 @@ lang_abs_symbol_at_beginning_of (const char *secname, const char *name) h->type = bfd_link_hash_defined; - sec = bfd_get_section_by_name (output_bfd, secname); + sec = bfd_get_section_by_name (link_info.output_bfd, secname); if (sec == NULL) h->u.def.value = 0; else - h->u.def.value = bfd_get_section_vma (output_bfd, sec); + h->u.def.value = bfd_get_section_vma (link_info.output_bfd, sec); h->u.def.section = bfd_abs_section_ptr; } @@ -6407,11 +6415,11 @@ lang_abs_symbol_at_end_of (const char *secname, const char *name) h->type = bfd_link_hash_defined; - sec = bfd_get_section_by_name (output_bfd, secname); + sec = bfd_get_section_by_name (link_info.output_bfd, secname); if (sec == NULL) h->u.def.value = 0; else - h->u.def.value = (bfd_get_section_vma (output_bfd, sec) + h->u.def.value = (bfd_get_section_vma (link_info.output_bfd, sec) + TO_ADDR (sec->size)); h->u.def.section = bfd_abs_section_ptr; @@ -6605,7 +6613,7 @@ lang_record_phdrs (void) else at = exp_get_vma (l->at, 0, "phdr load address"); - if (! bfd_record_phdr (output_bfd, l->type, + if (! bfd_record_phdr (link_info.output_bfd, l->type, l->flags != NULL, flags, l->at != NULL, at, l->filehdr, l->phdrs, c, secs)) einfo (_("%F%P: bfd_record_phdr failed: %E\n")); diff --git a/ld/ldmain.c b/ld/ldmain.c index a9af255a39..dd7b7fe171 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -1,6 +1,6 @@ /* Main program of GNU linker. Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 2004, 2005, 2006, 2007 + 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Written by Steve Chamberlain steve@cygnus.com @@ -77,9 +77,6 @@ const char *ld_sysroot; char * ld_canon_sysroot; int ld_canon_sysroot_len; -/* The file that we're creating. */ -bfd *output_bfd = 0; - /* Set by -G argument, for MIPS ECOFF target. */ int g_switch_value = 8; @@ -177,8 +174,8 @@ remove_output (void) { if (output_filename) { - if (output_bfd) - bfd_cache_close (output_bfd); + if (link_info.output_bfd) + bfd_cache_close (link_info.output_bfd); if (delete_output_file_on_failure) unlink_if_ordinary (output_filename); } @@ -463,9 +460,9 @@ main (int argc, char **argv) /* Print error messages for any missing symbols, for any warning symbols, and possibly multiple definitions. */ if (link_info.relocatable) - output_bfd->flags &= ~EXEC_P; + link_info.output_bfd->flags &= ~EXEC_P; else - output_bfd->flags |= EXEC_P; + link_info.output_bfd->flags |= EXEC_P; ldwrite (); @@ -492,8 +489,8 @@ main (int argc, char **argv) } else { - if (! bfd_close (output_bfd)) - einfo (_("%F%B: final close failed: %E\n"), output_bfd); + if (! bfd_close (link_info.output_bfd)) + einfo (_("%F%B: final close failed: %E\n"), link_info.output_bfd); /* If the --force-exe-suffix is enabled, and we're making an executable file and it doesn't end in .exe, copy it to one @@ -1151,7 +1148,7 @@ constructor_callback (struct bfd_link_info *info, /* Ensure that BFD_RELOC_CTOR exists now, so that we can give a useful error message. */ - if (bfd_reloc_type_lookup (output_bfd, BFD_RELOC_CTOR) == NULL + if (bfd_reloc_type_lookup (link_info.output_bfd, BFD_RELOC_CTOR) == NULL && (info->relocatable || bfd_reloc_type_lookup (abfd, BFD_RELOC_CTOR) == NULL)) einfo (_("%P%F: BFD backend error: BFD_RELOC_CTOR unsupported\n")); @@ -1457,7 +1454,7 @@ reloc_overflow (struct bfd_link_info *info ATTRIBUTE_UNUSED, reloc_name, entry->root.string, entry->u.def.section, entry->u.def.section == bfd_abs_section_ptr - ? output_bfd : entry->u.def.section->owner); + ? link_info.output_bfd : entry->u.def.section->owner); break; default: abort (); diff --git a/ld/ldmain.h b/ld/ldmain.h index d297e8a0d6..c39780629b 100644 --- a/ld/ldmain.h +++ b/ld/ldmain.h @@ -1,6 +1,6 @@ /* ldmain.h - Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2002, 2003, 2004, - 2005, 2007 Free Software Foundation, Inc. + 2005, 2007, 2008 Free Software Foundation, Inc. This file is part of the GNU Binutils. @@ -29,7 +29,6 @@ extern int ld_canon_sysroot_len; extern FILE *saved_script_handle; extern FILE *previous_script_handle; extern bfd_boolean force_make_executable; -extern bfd *output_bfd; extern char *default_target; extern bfd_boolean trace_files; extern bfd_boolean trace_file_tries; diff --git a/ld/ldmisc.c b/ld/ldmisc.c index e8c6b302eb..bdae82e4ae 100644 --- a/ld/ldmisc.c +++ b/ld/ldmisc.c @@ -1,6 +1,6 @@ /* ldmisc.c Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Written by Steve Chamberlain of Cygnus Support. @@ -152,7 +152,7 @@ vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning) { char *demangled; - demangled = bfd_demangle (output_bfd, name, + demangled = bfd_demangle (link_info.output_bfd, name, DMGL_ANSI | DMGL_PARAMS); if (demangled != NULL) { diff --git a/ld/ldwrite.c b/ld/ldwrite.c index 0f45a91605..42eb2cc55f 100644 --- a/ld/ldwrite.c +++ b/ld/ldwrite.c @@ -1,6 +1,6 @@ /* ldwrite.c -- write out the linked file Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002, - 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Written by Steve Chamberlain sac@cygnus.com This file is part of the GNU Binutils. @@ -49,9 +49,9 @@ build_link_order (lang_statement_union_type *statement) bfd_boolean big_endian = FALSE; output_section = statement->data_statement.output_section; - ASSERT (output_section->owner == output_bfd); + ASSERT (output_section->owner == link_info.output_bfd); - link_order = bfd_new_link_order (output_bfd, output_section); + link_order = bfd_new_link_order (link_info.output_bfd, output_section); if (link_order == NULL) einfo (_("%P%F: bfd_new_link_order failed\n")); @@ -66,9 +66,9 @@ build_link_order (lang_statement_union_type *statement) By convention, the bfd_put routines for an unknown endianness are big endian, so we must swap here if the input file is little endian. */ - if (bfd_big_endian (output_bfd)) + if (bfd_big_endian (link_info.output_bfd)) big_endian = TRUE; - else if (bfd_little_endian (output_bfd)) + else if (bfd_little_endian (link_info.output_bfd)) big_endian = FALSE; else { @@ -132,13 +132,14 @@ build_link_order (lang_statement_union_type *statement) } } - ASSERT (output_section->owner == output_bfd); + ASSERT (output_section->owner == link_info.output_bfd); switch (statement->data_statement.type) { case QUAD: case SQUAD: if (sizeof (bfd_vma) >= QUAD_SIZE) - bfd_put_64 (output_bfd, value, link_order->u.data.contents); + bfd_put_64 (link_info.output_bfd, value, + link_order->u.data.contents); else { bfd_vma high; @@ -149,25 +150,28 @@ build_link_order (lang_statement_union_type *statement) high = 0; else high = (bfd_vma) -1; - bfd_put_32 (output_bfd, high, + bfd_put_32 (link_info.output_bfd, high, (link_order->u.data.contents + (big_endian ? 0 : 4))); - bfd_put_32 (output_bfd, value, + bfd_put_32 (link_info.output_bfd, value, (link_order->u.data.contents + (big_endian ? 4 : 0))); } link_order->size = QUAD_SIZE; break; case LONG: - bfd_put_32 (output_bfd, value, link_order->u.data.contents); + bfd_put_32 (link_info.output_bfd, value, + link_order->u.data.contents); link_order->size = LONG_SIZE; break; case SHORT: - bfd_put_16 (output_bfd, value, link_order->u.data.contents); + bfd_put_16 (link_info.output_bfd, value, + link_order->u.data.contents); link_order->size = SHORT_SIZE; break; case BYTE: - bfd_put_8 (output_bfd, value, link_order->u.data.contents); + bfd_put_8 (link_info.output_bfd, value, + link_order->u.data.contents); link_order->size = BYTE_SIZE; break; default: @@ -185,9 +189,9 @@ build_link_order (lang_statement_union_type *statement) rs = &statement->reloc_statement; output_section = rs->output_section; - ASSERT (output_section->owner == output_bfd); + ASSERT (output_section->owner == link_info.output_bfd); - link_order = bfd_new_link_order (output_bfd, output_section); + link_order = bfd_new_link_order (link_info.output_bfd, output_section); if (link_order == NULL) einfo (_("%P%F: bfd_new_link_order failed\n")); @@ -202,7 +206,7 @@ build_link_order (lang_statement_union_type *statement) if (rs->name == NULL) { link_order->type = bfd_section_reloc_link_order; - if (rs->section->owner == output_bfd) + if (rs->section->owner == link_info.output_bfd) link_order->u.reloc.p->u.section = rs->section; else { @@ -229,7 +233,7 @@ build_link_order (lang_statement_union_type *statement) { asection *output_section = i->output_section; - ASSERT (output_section->owner == output_bfd); + ASSERT (output_section->owner == link_info.output_bfd); if ((output_section->flags & SEC_HAS_CONTENTS) != 0 || ((output_section->flags & SEC_LOAD) != 0 @@ -237,7 +241,8 @@ build_link_order (lang_statement_union_type *statement) { struct bfd_link_order *link_order; - link_order = bfd_new_link_order (output_bfd, output_section); + link_order = bfd_new_link_order (link_info.output_bfd, + output_section); if (i->flags & SEC_NEVER_LOAD) { @@ -269,13 +274,14 @@ build_link_order (lang_statement_union_type *statement) output_section = statement->padding_statement.output_section; ASSERT (statement->padding_statement.output_section->owner - == output_bfd); + == link_info.output_bfd); if (((output_section->flags & SEC_HAS_CONTENTS) != 0 || ((output_section->flags & SEC_LOAD) != 0 && (output_section->flags & SEC_THREAD_LOCAL))) && (output_section->flags & SEC_NEVER_LOAD) == 0) { - link_order = bfd_new_link_order (output_bfd, output_section); + link_order = bfd_new_link_order (link_info.output_bfd, + output_section); link_order->type = bfd_data_link_order; link_order->size = statement->padding_statement.size; link_order->offset = statement->padding_statement.output_offset; @@ -557,8 +563,8 @@ ldwrite (void) if (config.split_by_reloc != (unsigned) -1 || config.split_by_file != (bfd_size_type) -1) - split_sections (output_bfd, &link_info); - if (!bfd_final_link (output_bfd, &link_info)) + split_sections (link_info.output_bfd, &link_info); + if (!bfd_final_link (link_info.output_bfd, &link_info)) { /* If there was an error recorded, print it out. Otherwise assume an appropriate error message like unknown symbol was printed diff --git a/ld/pe-dll.c b/ld/pe-dll.c index d754747700..c0cf63de5c 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -1,6 +1,6 @@ /* Routines to help build PEI-format DLLs (Win32 etc) - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 - Free Software Foundation, Inc. + Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, + 2008 Free Software Foundation, Inc. Written by DJ Delorie This file is part of the GNU Binutils. @@ -858,11 +858,12 @@ build_filler_bfd (int include_edata) filler_file = lang_add_input_file ("dll stuff", lang_input_file_is_fake_enum, NULL); - filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd); + filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", + link_info.output_bfd); if (filler_bfd == NULL || !bfd_set_arch_mach (filler_bfd, - bfd_get_arch (output_bfd), - bfd_get_mach (output_bfd))) + bfd_get_arch (link_info.output_bfd), + bfd_get_mach (link_info.output_bfd))) { einfo ("%X%P: can not create BFD: %E\n"); return; @@ -1445,9 +1446,10 @@ pe_dll_generate_def_file (const char *pe_out_def_filename) quoteput (pe_def_file->name, out, 1); - if (pe_data (output_bfd)->pe_opthdr.ImageBase) + if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase) fprintf (out, " BASE=0x%lx", - (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase); + (unsigned long) + pe_data (link_info.output_bfd)->pe_opthdr.ImageBase); fprintf (out, "\n"); } @@ -2334,12 +2336,12 @@ pe_create_import_fixup (arelent *rel, asection *s, int addend) if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined) { - bfd *b = make_singleton_name_thunk (name, output_bfd); + bfd *b = make_singleton_name_thunk (name, link_info.output_bfd); add_bfd_to_link (b, b->filename, &link_info); /* If we ever use autoimport, we have to cast text section writable. */ config.text_read_only = FALSE; - output_bfd->flags &= ~WP_TEXT; + link_info.output_bfd->flags &= ~WP_TEXT; } if (addend == 0 || link_info.pei386_runtime_pseudo_reloc) @@ -2347,7 +2349,8 @@ pe_create_import_fixup (arelent *rel, asection *s, int addend) extern char * pe_data_import_dll; char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown"; - b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd); + b = make_import_fixup_entry (name, fixup_name, dll_symname, + link_info.output_bfd); add_bfd_to_link (b, b->filename, &link_info); } @@ -2358,12 +2361,13 @@ pe_create_import_fixup (arelent *rel, asection *s, int addend) if (pe_dll_extra_pe_debug) printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n", fixup_name, addend); - b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd); + b = make_runtime_pseudo_reloc (name, fixup_name, addend, + link_info.output_bfd); add_bfd_to_link (b, b->filename, &link_info); if (runtime_pseudo_relocs_created == 0) { - b = pe_create_runtime_relocator_reference (output_bfd); + b = pe_create_runtime_relocator_reference (link_info.output_bfd); add_bfd_to_link (b, b->filename, &link_info); } runtime_pseudo_relocs_created++;