diff options
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/cofflink.c | 22 |
2 files changed, 17 insertions, 11 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index aeda144..5aaa45e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2015-06-15 Alan Modra <amodra@gmail.com> + + * cofflink.c (_bfd_coff_generic_relocate_section): Revert + 2014-03-26 change. Call _bfd_clear_contents for relocs against + local and global symbols defined in discarded input sections. + 2015-06-05 Nick Clifton <nickc@redhat.com> * elf32-msp430.c (rl78_sym_diff_handler): New function. diff --git a/bfd/cofflink.c b/bfd/cofflink.c index 0ac10de..c1541d1 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -2915,6 +2915,7 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd, struct internal_syment *sym; bfd_vma addend; bfd_vma val; + asection *sec; reloc_howto_type *howto; bfd_reloc_status_type rstat; @@ -2965,11 +2966,9 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd, } val = 0; - + sec = NULL; if (h == NULL) { - asection *sec; - if (symndx == -1) { sec = bfd_abs_section_ptr; @@ -2978,11 +2977,6 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd, else { sec = sections[symndx]; - - /* If the output section has been discarded then ignore this reloc. */ - if (sec->output_section->vma == 0) - continue; - val = (sec->output_section->vma + sec->output_offset + sym->n_value); @@ -2996,8 +2990,6 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd, || h->root.type == bfd_link_hash_defweak) { /* Defined weak symbols are a GNU extension. */ - asection *sec; - sec = h->root.u.def.section; val = (h->root.u.def.value + sec->output_section->vma @@ -3018,7 +3010,6 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd, will resolve a weak external only if a normal external causes the library member to be linked. See also linker.c: generic_link_check_archive_element. */ - asection *sec; struct coff_link_hash_entry *h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes[ h->aux->x_sym.x_tagndx.l]; @@ -3049,6 +3040,15 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd, } } + /* If the input section defining the symbol has been discarded + then zero this reloc field. */ + if (sec != NULL && discarded_section (sec)) + { + _bfd_clear_contents (howto, input_bfd, input_section, + contents + (rel->r_vaddr - input_section->vma)); + continue; + } + if (info->base_file) { /* Emit a reloc if the backend thinks it needs it. */ |