mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-21 04:42:53 +08:00
dfb93f1158
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.
29 lines
1009 B
ArmAsm
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
|