aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-mips-elf/undefined.s
diff options
context:
space:
mode:
Diffstat (limited to 'ld/testsuite/ld-mips-elf/undefined.s')
-rw-r--r--ld/testsuite/ld-mips-elf/undefined.s24
1 files changed, 24 insertions, 0 deletions
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