From e7e2196da3f0157573acc1b4fa2f7a87da9f044f Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Thu, 10 Dec 2009 14:20:04 +0000 Subject: [PATCH] bfd/ * 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. --- bfd/ChangeLog | 5 +++++ bfd/elfxx-mips.c | 16 +++++++++------- ld/testsuite/ChangeLog | 6 ++++++ ld/testsuite/ld-mips-elf/mips-elf.exp | 2 ++ ld/testsuite/ld-mips-elf/undefined.d | 4 ++++ ld/testsuite/ld-mips-elf/undefined.s | 24 ++++++++++++++++++++++++ 6 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 ld/testsuite/ld-mips-elf/undefined.d create mode 100644 ld/testsuite/ld-mips-elf/undefined.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 25912604288..1922f7e2e23 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2009-12-10 Maciej W. Rozycki + + * elfxx-mips.c (mips_elf_calculate_relocation): Correct handling + of undefined symbols. + 2009-12-09 Daniel Jacobowitz * elf32-arm.c (elf32_arm_next_input_section): Skip sections without diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 3a1c8ba9bf7..9df441de7d7 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -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); diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 1bd1edadae6..e2bb39fd4be 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-12-10 Maciej W. Rozycki + + * 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 * ld-arm/arm-elf.exp (armeabitests): Add farcall-data. diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp index 7622ac3ebcc..ea70ea1fe8b 100644 --- a/ld/testsuite/ld-mips-elf/mips-elf.exp +++ b/ld/testsuite/ld-mips-elf/mips-elf.exp @@ -520,3 +520,5 @@ if { $linux_gnu } { "got-vers-1.so"} } } + +run_dump_test "undefined" diff --git a/ld/testsuite/ld-mips-elf/undefined.d b/ld/testsuite/ld-mips-elf/undefined.d new file mode 100644 index 00000000000..e5231dfbd59 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/undefined.d @@ -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 diff --git a/ld/testsuite/ld-mips-elf/undefined.s b/ld/testsuite/ld-mips-elf/undefined.s new file mode 100644 index 00000000000..d946a5ab6fb --- /dev/null +++ b/ld/testsuite/ld-mips-elf/undefined.s @@ -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 -- 2.30.2