* 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.
This commit is contained in:
Maciej W. Rozycki 2009-12-10 14:20:04 +00:00
parent b59befec8e
commit e7e2196da3
6 changed files with 50 additions and 7 deletions

View File

@ -1,3 +1,8 @@
2009-12-10 Maciej W. Rozycki <macro@codesourcery.com>
* elfxx-mips.c (mips_elf_calculate_relocation): Correct handling
of undefined symbols.
2009-12-09 Daniel Jacobowitz <dan@codesourcery.com>
* elf32-arm.c (elf32_arm_next_input_section): Skip sections without

View File

@ -4973,15 +4973,17 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf */
symbol = 0;
}
else if ((*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;
}
else
{
if (! ((*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;
symbol = 0;
return bfd_reloc_notsupported;
}
target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (h->root.other);

View File

@ -1,3 +1,9 @@
2009-12-10 Maciej W. Rozycki <macro@codesourcery.com>
* 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.
2009-12-09 Daniel Jacobowitz <dan@codesourcery.com>
* ld-arm/arm-elf.exp (armeabitests): Add farcall-data.

View File

@ -520,3 +520,5 @@ if { $linux_gnu } {
"got-vers-1.so"}
}
}
run_dump_test "undefined"

View File

@ -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

View File

@ -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