X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fcofflink.c;h=41cf77df507a1d0f511530f3b273103a8b7b6e5c;hb=2425a30e406a0523020b7e70abb864a06a45bb97;hp=16ba0acb10346df3da87dd47cec8755f65517759;hpb=270f824531ceef276616a5d2f3027fa9f537c10b;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/cofflink.c b/bfd/cofflink.c index 16ba0acb10..41cf77df50 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -1,5 +1,5 @@ /* COFF specific linker code. - Copyright (C) 1994-2015 Free Software Foundation, Inc. + Copyright (C) 1994-2017 Free Software Foundation, Inc. Written by Ian Lance Taylor, Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -212,8 +212,9 @@ coff_link_check_archive_element (bfd *abfd, if (h->type != bfd_link_hash_undefined) return TRUE; + /* Include this element? */ if (!(*info->callbacks->add_archive_element) (info, abfd, name, &abfd)) - return FALSE; + return TRUE; *pneeded = TRUE; return coff_link_add_object_symbols (abfd, info); @@ -343,8 +344,8 @@ coff_link_add_symbols (bfd *abfd, & COFF_LINK_HASH_PE_SECTION_SYMBOL) == 0 && (*sym_hash)->root.type != bfd_link_hash_undefined && (*sym_hash)->root.type != bfd_link_hash_undefweak) - (*_bfd_error_handler) - ("Warning: symbol `%s' is both section and non-section", + _bfd_error_handler + (_("Warning: symbol `%s' is both section and non-section"), name); addit = FALSE; @@ -444,7 +445,8 @@ coff_link_add_symbols (bfd *abfd, && !(DTYPE ((*sym_hash)->type) == DTYPE (sym.n_type) && (BTYPE ((*sym_hash)->type) == T_NULL || BTYPE (sym.n_type) == T_NULL))) - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext: c-format */ (_("Warning: type of symbol `%s' changed from %d to %d in %B"), abfd, name, (*sym_hash)->type, sym.n_type); @@ -1397,7 +1399,8 @@ mark_relocs (struct coff_final_link_info *flaginfo, bfd *input_bfd) in the relocation table. This will then be picked up in the skip/don't-skip pass. */ for (; irel < irelend; irel++) - flaginfo->sym_indices[ irel->r_symndx ] = -1; + if ((unsigned long) irel->r_symndx < obj_raw_syment_count (input_bfd)) + flaginfo->sym_indices[irel->r_symndx] = -1; } } @@ -2360,7 +2363,8 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd) if ((o->flags & SEC_RELOC) != 0 && o->reloc_count != 0) { - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext: c-format */ (_("%B: relocs in section `%A', but it has no contents"), input_bfd, o); bfd_set_error (bfd_error_no_contents); @@ -2423,6 +2427,7 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd) /* Complain if definition comes from an excluded section. */ if (ps->flags & SEC_EXCLUDE) (*flaginfo->info->callbacks->einfo) + /* xgettext: c-format */ (_("%X`%s' referenced in section `%A' of %B: " "defined in discarded section `%A' of %B\n"), h->root.root.string, o, input_bfd, ps, ps->owner); @@ -2514,10 +2519,8 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd) if (name == NULL) return FALSE; - if (! ((*flaginfo->info->callbacks->unattached_reloc) - (flaginfo->info, name, input_bfd, o, - irel->r_vaddr))) - return FALSE; + (*flaginfo->info->callbacks->unattached_reloc) + (flaginfo->info, name, input_bfd, o, irel->r_vaddr); } } } @@ -2721,7 +2724,8 @@ _bfd_coff_write_global_sym (struct bfd_hash_entry *bh, void *data) if (sec->reloc_count > 0xffff && (! obj_pe (output_bfd) || bfd_link_relocatable (flaginfo->info))) - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext: c-format */ (_("%s: %s: reloc overflow: 0x%lx > 0xffff"), bfd_get_filename (output_bfd), bfd_get_section_name (output_bfd, sec), @@ -2730,7 +2734,8 @@ _bfd_coff_write_global_sym (struct bfd_hash_entry *bh, void *data) if (sec->lineno_count > 0xffff && (! obj_pe (output_bfd) || bfd_link_relocatable (flaginfo->info))) - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext: c-format */ (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"), bfd_get_filename (output_bfd), bfd_get_section_name (output_bfd, sec), @@ -2833,18 +2838,14 @@ _bfd_coff_reloc_link_order (bfd *output_bfd, case bfd_reloc_outofrange: abort (); case bfd_reloc_overflow: - if (! ((*flaginfo->info->callbacks->reloc_overflow) - (flaginfo->info, NULL, - (link_order->type == bfd_section_reloc_link_order - ? bfd_section_name (output_bfd, - link_order->u.reloc.p->u.section) - : link_order->u.reloc.p->u.name), - howto->name, link_order->u.reloc.p->addend, - (bfd *) NULL, (asection *) NULL, (bfd_vma) 0))) - { - free (buf); - return FALSE; - } + (*flaginfo->info->callbacks->reloc_overflow) + (flaginfo->info, NULL, + (link_order->type == bfd_section_reloc_link_order + ? bfd_section_name (output_bfd, + link_order->u.reloc.p->u.section) + : link_order->u.reloc.p->u.name), + howto->name, link_order->u.reloc.p->addend, + (bfd *) NULL, (asection *) NULL, (bfd_vma) 0); break; } loc = link_order->offset * bfd_octets_per_byte (output_bfd); @@ -2900,10 +2901,9 @@ _bfd_coff_reloc_link_order (bfd *output_bfd, } else { - if (! ((*flaginfo->info->callbacks->unattached_reloc) - (flaginfo->info, link_order->u.reloc.p->u.name, (bfd *) NULL, - (asection *) NULL, (bfd_vma) 0))) - return FALSE; + (*flaginfo->info->callbacks->unattached_reloc) + (flaginfo->info, link_order->u.reloc.p->u.name, + (bfd *) NULL, (asection *) NULL, (bfd_vma) 0); irel->r_symndx = 0; } } @@ -2959,8 +2959,9 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd, else if (symndx < 0 || (unsigned long) symndx >= obj_raw_syment_count (input_bfd)) { - (*_bfd_error_handler) - ("%B: illegal symbol index %ld in relocs", input_bfd, symndx); + _bfd_error_handler + /* xgettext: c-format */ + (_("%B: illegal symbol index %ld in relocs"), input_bfd, symndx); return FALSE; } else @@ -3007,6 +3008,12 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd, else { sec = sections[symndx]; + + /* PR 19623: Relocations against symbols in + the absolute sections should ignored. */ + if (bfd_is_abs_section (sec)) + continue; + val = (sec->output_section->vma + sec->output_offset + sym->n_value); @@ -3062,12 +3069,9 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd, } else if (! bfd_link_relocatable (info)) - { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, input_section, - rel->r_vaddr - input_section->vma, TRUE))) - return FALSE; - } + (*info->callbacks->undefined_symbol) + (info, h->root.root.string, input_bfd, input_section, + rel->r_vaddr - input_section->vma, TRUE); } /* If the input section defining the symbol has been discarded @@ -3117,7 +3121,8 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd, case bfd_reloc_ok: break; case bfd_reloc_outofrange: - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext: c-format */ (_("%B: bad reloc address 0x%lx in section `%A'"), input_bfd, input_section, (unsigned long) rel->r_vaddr); return FALSE; @@ -3137,11 +3142,10 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd, return FALSE; } - if (! ((*info->callbacks->reloc_overflow) - (info, (h ? &h->root : NULL), name, howto->name, - (bfd_vma) 0, input_bfd, input_section, - rel->r_vaddr - input_section->vma))) - return FALSE; + (*info->callbacks->reloc_overflow) + (info, (h ? &h->root : NULL), name, howto->name, + (bfd_vma) 0, input_bfd, input_section, + rel->r_vaddr - input_section->vma); } } }