bfd/
authorMaciej W. Rozycki <macro@linux-mips.org>
Thu, 10 Dec 2009 14:20:04 +0000 (14:20 +0000)
committerMaciej W. Rozycki <macro@linux-mips.org>
Thu, 10 Dec 2009 14:20:04 +0000 (14:20 +0000)
* 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
bfd/elfxx-mips.c
ld/testsuite/ChangeLog
ld/testsuite/ld-mips-elf/mips-elf.exp
ld/testsuite/ld-mips-elf/undefined.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/undefined.s [new file with mode: 0644]

index 25912604288d8f606d4d3dde0793562cd7f7915d..1922f7e2e2379f8421b97746d20e7caaf82dfce2 100644 (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
index 3a1c8ba9bf70548341cecf3ea73ee78f192e93ae..9df441de7d737285f293b8464f0ca997af4b1aac 100644 (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);
index 1bd1edadae604b0ba9e4771a1dc8eae6ce7edc46..e2bb39fd4bef5cc3b0fb9b53e4779f8d62da93f3 100644 (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.
index 7622ac3ebcc8ad3198c1dc51f1b749ef6e5d0aba..ea70ea1fe8b9a8551a23e26aa798f5f9af378341 100644 (file)
@@ -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 (file)
index 0000000..e5231df
--- /dev/null
@@ -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 (file)
index 0000000..d946a5a
--- /dev/null
@@ -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