diff options
author | James Cowgill <james.cowgill@mips.com> | 2018-03-03 15:49:21 +0000 |
---|---|---|
committer | Maciej W. Rozycki <macro@mips.com> | 2018-03-03 15:49:21 +0000 |
commit | dfb93f11587ca08b820c7c785278366f2505cfd1 (patch) | |
tree | 19952490ddd453f8fb532d608c92012da84b0c18 /bfd | |
parent | b9671caf8fe1abd737846edf7dcd627870f986cc (diff) | |
download | gdb-dfb93f11587ca08b820c7c785278366f2505cfd1.zip gdb-dfb93f11587ca08b820c7c785278366f2505cfd1.tar.gz gdb-dfb93f11587ca08b820c7c785278366f2505cfd1.tar.bz2 |
PR ld/21900: MIPS: Fix relocation processing with undefined symbols
Currently, when `mips_elf_calculate_relocation' is asked to relocate an
undefined symbol, it reports an error or a warning and immediately
returns without performing the relocation. This is fine if the link
fails, but if unresolved_syms_in_objects == RM_GENERATE_WARNING, the
link will continue and output some unrelocated code, which is a
regression from commit e7e2196da3f0 ("MIPS/BFD: Correctly report
undefined relocations").
Fix this by continuing after calling the `undefined_symbol' hook unless
this is an error condition.
bfd/
PR ld/21900
* elfxx-mips.c (mips_elf_calculate_relocation): Only return
after calling `undefined_symbol' hook if this is an error
condition. Assume the value of 0 for the symbol requested
otherwise.
ld/
PR ld/21900
* testsuite/ld-mips-elf/undefined-warn.d: New test.
* testsuite/ld-mips-elf/undefined.s: Add padding at the end.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new test.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 9 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 14 |
2 files changed, 19 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 003f8a3..6e20330 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2018-03-03 James Cowgill <james.cowgill@mips.com> + Maciej W. Rozycki <macro@mips.com> + + PR ld/21900 + * elfxx-mips.c (mips_elf_calculate_relocation): Only return + after calling `undefined_symbol' hook if this is an error + condition. Assume the value of 0 for the symbol requested + otherwise. + 2018-03-02 Jim Wilson <jimw@sifive.com> PR 22903 diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 32b93fe..ce64581 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -5478,12 +5478,18 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, } else { + bfd_boolean reject_undefined + = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR + || ELF_ST_VISIBILITY (h->root.other) != STV_DEFAULT); + (*info->callbacks->undefined_symbol) (info, h->root.root.root.string, input_bfd, - input_section, relocation->r_offset, - (info->unresolved_syms_in_objects == RM_GENERATE_ERROR) - || ELF_ST_VISIBILITY (h->root.other)); - return bfd_reloc_undefined; + input_section, relocation->r_offset, reject_undefined); + + if (reject_undefined) + return bfd_reloc_undefined; + + symbol = 0; } target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (h->root.other); |