PR ld/21900: MIPS: Fix relocation processing with undefined symbols
authorJames Cowgill <james.cowgill@mips.com>
Sat, 3 Mar 2018 15:49:21 +0000 (15:49 +0000)
committerMaciej W. Rozycki <macro@mips.com>
Sat, 3 Mar 2018 15:49:21 +0000 (15:49 +0000)
Currently, when `mips_elf_calculate_relocation' is asked to relocate an
undefined symbol, it reports an error or a warning and immediately
returns without performing the relocation.  This is fine if the link
fails, but if unresolved_syms_in_objects == RM_GENERATE_WARNING, the
link will continue and output some unrelocated code, which is a
regression from commit e7e2196da3f0 ("MIPS/BFD: Correctly report
undefined relocations").

Fix this by continuing after calling the `undefined_symbol' hook unless
this is an error condition.

bfd/
PR ld/21900
* elfxx-mips.c (mips_elf_calculate_relocation): Only return
after calling `undefined_symbol' hook if this is an error
condition.  Assume the value of 0 for the symbol requested
otherwise.

ld/
PR ld/21900
* testsuite/ld-mips-elf/undefined-warn.d: New test.
* testsuite/ld-mips-elf/undefined.s: Add padding at the end.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new test.

bfd/ChangeLog
bfd/elfxx-mips.c
ld/ChangeLog
ld/testsuite/ld-mips-elf/mips-elf.exp
ld/testsuite/ld-mips-elf/undefined-warn.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/undefined.s

index 003f8a3c66d9d6b887f390db309326e7d2da6ee2..6e2033022347159136238b7694e260caa6be043c 100644 (file)
@@ -1,3 +1,12 @@
+2018-03-03  James Cowgill  <james.cowgill@mips.com>
+           Maciej W. Rozycki  <macro@mips.com>
+
+       PR ld/21900
+       * elfxx-mips.c (mips_elf_calculate_relocation): Only return
+       after calling `undefined_symbol' hook if this is an error
+       condition.  Assume the value of 0 for the symbol requested
+       otherwise.
+
 2018-03-02  Jim Wilson  <jimw@sifive.com>
 
        PR 22903
index 32b93fe7ad0897df08a133a11b55efa6f3ab77df..ce645817bb257b7d26b9b17cbf4ff78f86921faa 100644 (file)
@@ -5478,12 +5478,18 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
        }
       else
        {
+         bfd_boolean reject_undefined
+           = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
+              || ELF_ST_VISIBILITY (h->root.other) != STV_DEFAULT);
+
          (*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;
+            input_section, relocation->r_offset, reject_undefined);
+
+         if (reject_undefined)
+           return bfd_reloc_undefined;
+
+         symbol = 0;
        }
 
       target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (h->root.other);
index 6f9abfa3e9e75de438af13839736aa8ed1165054..c7961253e52729fd04fc68450011d023c8dcada6 100644 (file)
@@ -1,3 +1,11 @@
+2018-03-03  James Cowgill  <james.cowgill@mips.com>
+           Maciej W. Rozycki  <macro@mips.com>
+
+       PR ld/21900
+       * testsuite/ld-mips-elf/undefined-warn.d: New test.
+       * testsuite/ld-mips-elf/undefined.s: Add padding at the end.
+       * testsuite/ld-mips-elf/mips-elf.exp: Run the new test.
+
 2018-03-02  Jim Wilson  <jimw@sifive.com>
 
        PR 22903
index 144b007089d06cb37e2115d676d7338740dc7aaf..95d677e577632b1411a2ecc3d9bca196803c68ed 100644 (file)
@@ -995,6 +995,7 @@ if { $linux_gnu } {
 }
 
 run_dump_test "undefined"
+run_dump_test "undefined-warn"
 
 # Test the conversion from jr to b
 if { $linux_gnu } {
diff --git a/ld/testsuite/ld-mips-elf/undefined-warn.d b/ld/testsuite/ld-mips-elf/undefined-warn.d
new file mode 100644 (file)
index 0000000..b43018e
--- /dev/null
@@ -0,0 +1,13 @@
+#objdump: -d --prefix-addresses --show-raw-insn
+#name: MIPS undefined reference with --warn-unresolved-symbols
+#source: undefined.s
+#ld: -e foo --warn-unresolved-symbols
+#warning: \A[^\n]*\.o: in function `foo':\n\(\.text\+0x0\): warning: undefined reference to `bar'\Z
+
+.*:     file format .*
+
+Disassembly of section \.text:
+
+# Loaded value must not be 0.
+[0-9a-f]+ <[^>]*> 2402....     li      v0,[-1-9][0-9]*
+       \.\.\.
index d946a5ab6fbb134f593d164fb26f55e6f8f30ae6..98f46de6f44acc609b5cb8364fe94265c380b857 100644 (file)
@@ -22,3 +22,7 @@ foo:
        li      $2, %got_page(bar)
        .end    foo
        .size   foo, . - foo
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+       .align  4, 0
+       .space  16