aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorMaciej W. Rozycki <macro@linux-mips.org>2009-12-10 14:20:04 +0000
committerMaciej W. Rozycki <macro@linux-mips.org>2009-12-10 14:20:04 +0000
commite7e2196da3f0157573acc1b4fa2f7a87da9f044f (patch)
treed53254d0337939a0dae85ff5cf0b6b974bc85712 /ld
parentb59befec8e8a9bec906f2a0ae623db822c9ef2cd (diff)
downloadfsf-binutils-gdb-e7e2196da3f0157573acc1b4fa2f7a87da9f044f.zip
fsf-binutils-gdb-e7e2196da3f0157573acc1b4fa2f7a87da9f044f.tar.gz
fsf-binutils-gdb-e7e2196da3f0157573acc1b4fa2f7a87da9f044f.tar.bz2
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.
Diffstat (limited to 'ld')
-rw-r--r--ld/testsuite/ChangeLog6
-rw-r--r--ld/testsuite/ld-mips-elf/mips-elf.exp2
-rw-r--r--ld/testsuite/ld-mips-elf/undefined.d4
-rw-r--r--ld/testsuite/ld-mips-elf/undefined.s24
4 files changed, 36 insertions, 0 deletions
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 1bd1eda..e2bb39f 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -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.
diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp
index 7622ac3..ea70ea1 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 0000000..e5231df
--- /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 0000000..d946a5a
--- /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