[binutils-gdb] PR ld/21900: MIPS: Fix relocation processing with undefined symbols

Maciej W.Rozycki macro@sourceware.org
Sat Mar 3 15:52:00 GMT 2018


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=dfb93f11587ca08b820c7c785278366f2505cfd1

commit dfb93f11587ca08b820c7c785278366f2505cfd1
Author: James Cowgill <james.cowgill@mips.com>
Date:   Sat Mar 3 15:49:21 2018 +0000

    PR ld/21900: MIPS: Fix relocation processing with undefined symbols
    
    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.

Diff:
---
 bfd/ChangeLog                             |  9 +++++++++
 bfd/elfxx-mips.c                          | 14 ++++++++++----
 ld/ChangeLog                              |  8 ++++++++
 ld/testsuite/ld-mips-elf/mips-elf.exp     |  1 +
 ld/testsuite/ld-mips-elf/undefined-warn.d | 13 +++++++++++++
 ld/testsuite/ld-mips-elf/undefined.s      |  4 ++++
 6 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 003f8a3..6e20330 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index 32b93fe..ce64581 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -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);
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 6f9abfa..c796125 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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
diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp
index 144b007..95d677e 100644
--- a/ld/testsuite/ld-mips-elf/mips-elf.exp
+++ b/ld/testsuite/ld-mips-elf/mips-elf.exp
@@ -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
index 0000000..b43018e
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/undefined-warn.d
@@ -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]*
+	\.\.\.
diff --git a/ld/testsuite/ld-mips-elf/undefined.s b/ld/testsuite/ld-mips-elf/undefined.s
index d946a5a..98f46de 100644
--- a/ld/testsuite/ld-mips-elf/undefined.s
+++ b/ld/testsuite/ld-mips-elf/undefined.s
@@ -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



More information about the Binutils-cvs mailing list