[committed][PATCH] PR ld/17847: Confusing linker error message

H.J. Lu hongjiu.lu@intel.com
Thu Jan 15 19:11:00 GMT 2015


When building executable, undefined symbol is a fatal error.  We don't
complain about -fPIC if the symbol is undefined.  I checked it in
master.


H.J.
---
bfd/

	PR ld/17847
	* elf64-x86-64.c (elf_x86_64_relocate_section): Don't complain
	about -fPIC if the symbol is undefined when building executable.

ld/testsuite/

	PR ld/17847
	* ld-x86-64/pie1.d: New file.
	* ld-x86-64/pie1.s: Likwise.
	* ld-x86-64/x86-64.exp: Run pie1.
---
 bfd/ChangeLog                     |  6 ++++++
 bfd/elf64-x86-64.c                | 13 ++++++++++---
 ld/testsuite/ChangeLog            |  7 +++++++
 ld/testsuite/ld-x86-64/pie1.d     |  9 +++++++++
 ld/testsuite/ld-x86-64/pie1.s     |  4 ++++
 ld/testsuite/ld-x86-64/x86-64.exp |  1 +
 6 files changed, 37 insertions(+), 3 deletions(-)
 create mode 100644 ld/testsuite/ld-x86-64/pie1.d
 create mode 100644 ld/testsuite/ld-x86-64/pie1.s

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 8c376e2..9558b5c 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2015-01-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/17847
+	* elf64-x86-64.c (elf_x86_64_relocate_section): Don't complain
+	about -fPIC if the symbol is undefined when building executable.
+
 2015-01-15  Nick Clifton  <nickc@redhat.com>
 
 	PR binutils/17512
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 6b7d3c9..bf7d386 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -4063,10 +4063,14 @@ elf_x86_64_relocate_section (bfd *output_bfd,
 	case R_X86_64_PC16:
 	case R_X86_64_PC32:
 	case R_X86_64_PC32_BND:
+	  /* Don't complain about -fPIC if the symbol is undefined when
+	     building executable.  */
 	  if (info->shared
 	      && (input_section->flags & SEC_ALLOC) != 0
 	      && (input_section->flags & SEC_READONLY) != 0
-	      && h != NULL)
+	      && h != NULL
+	      && !(info->executable
+		   && h->root.type == bfd_link_hash_undefined))
 	    {
 	      bfd_boolean fail = FALSE;
 	      bfd_boolean branch
@@ -4140,11 +4144,14 @@ direct:
 	    break;
 
 	   /* Don't copy a pc-relative relocation into the output file
-	      if the symbol needs copy reloc.  */
+	      if the symbol needs copy reloc or the symbol is undefined
+	      when building executable.  */
 	  if ((info->shared
 	       && !(info->executable
 		    && h != NULL
-		    && (h->needs_copy || eh->needs_copy)
+		    && (h->needs_copy
+			|| eh->needs_copy
+			|| h->root.type == bfd_link_hash_undefined)
 		    && IS_X86_64_PCREL_TYPE (r_type))
 	       && (h == NULL
 		   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 3ab61c7..58e5595 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2015-01-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/17847
+	* ld-x86-64/pie1.d: New file.
+	* ld-x86-64/pie1.s: Likwise.
+	* ld-x86-64/x86-64.exp: Run pie1.
+
 2015-01-13  Thomas Preud'homme <thomas.preudhomme@arm.com>
 
 	* ld-aarch64/aarch64-elf.exp: Added relocs-257-symbolic-func test.
diff --git a/ld/testsuite/ld-x86-64/pie1.d b/ld/testsuite/ld-x86-64/pie1.d
new file mode 100644
index 0000000..06d2562
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pie1.d
@@ -0,0 +1,9 @@
+#name: PIE with undefined symbol
+#as: --64
+#ld: -pie -melf_x86_64 --noinhibit-exec
+#readelf: -s --wide
+#warning: \A[^\n]*\.o[^\n]*In function `_start':\n[^\n]*: undefined reference to `foo'\Z
+
+#...
+ +[0-9]+: +[0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +UND foo
+#pass
diff --git a/ld/testsuite/ld-x86-64/pie1.s b/ld/testsuite/ld-x86-64/pie1.s
new file mode 100644
index 0000000..94c59cb
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pie1.s
@@ -0,0 +1,4 @@
+	.text
+	.global _start
+_start:
+	movl	foo(%rip), %eax
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 5b49bff..bfa89c3 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -228,6 +228,7 @@ run_dump_test "pr12570b"
 run_dump_test "pr14215"
 run_dump_test "pr14207"
 run_dump_test "gotplt1"
+run_dump_test "pie1"
 
 if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
     return
-- 
1.9.3



More information about the Binutils mailing list