Browse Source
* elfxx-mips.c (mips_elf_calculate_relocation): Correct handling of undefined symbols. ld/testsuite/ * ld-mips-elf/undefined.d: New test. * ld-mips-elf/undefined.s: Source for the new test. * ld-mips-elf/mips-elf.exp: Run the new test.gdb_7_1-branch
6 changed files with 50 additions and 7 deletions
@ -0,0 +1,4 @@ |
|||
#name: MIPS undefined reference |
|||
#source: undefined.s |
|||
#ld: -e foo |
|||
#error: \A[^\n]*\.o: In function `foo':\n\(\.text\+0x0\): undefined reference to `bar'\Z |
|||
@ -0,0 +1,24 @@ |
|||
# 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 |
|||
Loading…
Reference in new issue