binutils-gdb/ld/testsuite/ld-mips-elf/undefined.s
James Cowgill dfb93f1158 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 e7e2196da3 ("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.
2018-03-03 15:49:21 +00:00

29 lines
1009 B
ArmAsm

# Relocations against undefined symbols would be incorrectly let through
# by mips_elf_calculate_relocation() once the result of the
# ->undefined_symbol() callback has been interpreted in the opposite
# sense. The link would fail anyway, but for R_MIPS_GOT_PAGE relocations
# a failure of the following assertion:
#
# BFD_ASSERT (h->dynindx >= global_got_dynindx);
#
# would additionally be reported in mips_elf_global_got_index(), because
# at this point h->dynindx for the undefined symbol would be set to -1.
# Other kinds of GOT relocations allocate a GOT index for the symbol
# referred and set its h->dynindx in _bfd_mips_elf_check_relocs(), but
# R_MIPS_GOT_PAGE relocations only allocate a GOT page at that point and
# for undefined symbols the page never gets resolved any further.
.abicalls
.text
.globl foo
.type foo, @function
.ent foo
foo:
li $2, %got_page(bar)
.end foo
.size foo, . - foo
# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
.align 4, 0
.space 16