Subject: Don't check shared/export_dynamic/ref_dynamic for type mismatch
From: H.J. Lu <[email-masked]>
Date: Tue, 21 Jan 2014 13:33:48 +0000 (-0800)

Don't check shared/export_dynamic/ref_dynamic for type mismatch

There is nothing linker can do when a type mismatched default definition
are made dynamic by info->shared, info->export_dynamic or h->ref_dynamic.
But we do want to avoid exporting it when building PIE.  Let's remove
those checks.

bfd/

	PR ld/2404
	* elflink.c (_bfd_elf_merge_symbol): Don't check info->shared,
	info->export_dynamic, nor !h->ref_dynamic for type mismatch when
	adding the default version.

ld/testsuite/

	PR ld/2404
	* ld-elf/shared.exp: Add a PIE test for PR ld/2404.

Upstream-Status: Backport
---

Index: binutils-2.24/bfd/elflink.c
===================================================================
--- binutils-2.24.orig/bfd/elflink.c	2014-02-08 13:20:08.628378267 +0000
+++ binutils-2.24/bfd/elflink.c	2014-02-08 13:20:08.624378267 +0000
@@ -1090,9 +1090,6 @@
      the type of existing regular definition mismatch.  We only do it
      if the existing regular definition won't be dynamic.  */
   if (pold_alignment == NULL
-      && !info->shared
-      && !info->export_dynamic
-      && !h->ref_dynamic
       && newdyn
       && newdef
       && !olddyn
Index: binutils-2.24/ld/testsuite/ld-elf/shared.exp
===================================================================
--- binutils-2.24.orig/ld/testsuite/ld-elf/shared.exp	2014-02-08 13:20:08.628378267 +0000
+++ binutils-2.24/ld/testsuite/ld-elf/shared.exp	2014-02-08 13:20:08.624378267 +0000
@@ -432,3 +432,29 @@
 
 run_cc_link_tests $build_cxx_tests
 run_ld_link_exec_tests [] $run_cxx_tests
+
+if { [istarget *-*-linux*]
+     || [istarget *-*-nacl*]
+     || [istarget *-*-gnu*] } {
+    run_cc_link_tests [list \
+	[list \
+	    "Build libpr2404b.a with PIE" \
+	    "" \
+	    "-fPIE" \
+	    { pr2404b.c } \
+	    {} \
+	    "libpr2404b.a" \
+	] \
+    ]
+    run_ld_link_exec_tests [] [list \
+	[list \
+	    "Run pr2404 with PIE" \
+	    "-pie tmpdir/pr2404b.o tmpdir/libpr2404a.so" \
+	    "" \
+	    { dummy.c } \
+	    "pr2404pie" \
+	    "pr2404.out" \
+	    "-fPIE" \
+	] \
+    ]
+}