Patchwork [build] Fix Solaris --as-needed/-z ignore detection (PR target/57261)

login
register
mail settings
Submitter Rainer Orth
Date May 14, 2013, 9:33 a.m.
Message ID <ydd7gj152is.fsf@lokon.CeBiTec.Uni-Bielefeld.DE>
Download mbox | patch
Permalink /patch/243642/
State New
Headers show

Comments

Rainer Orth - May 14, 2013, 9:33 a.m.
The patch to use -z ignore/-z record for libgcc_s on Solaris caused far
more problems than it initially seemed:

* Before Solaris 11 where dl_iterate_phdr is used, crtbegin.o contains
  references to
  __register_frame_info_bases/__deregister_frame_info_bases which cause
  libgcc_s.so.1 to be dragged into even the most trivial C program,
  which breaks bootstrap.

* On Solaris 11/x86 with gld, crt1.o is delivered with a reference to
  _DYNAMIC (unlike SPARC), which again drags in libgcc_s.so.1.  I don't
  yet know why this doesn't happen with Solaris ld.

Anyway, this patch disables -z ignore/--as-needed use in all those
configurations.

Bootstrapped without regressions on i386-pc-solaris2.{9,10,11} and
sparc-sun-solaris2.{9,10,11} with as/ld, gas/gld, installed on mainline.

	Rainer


2013-04-25  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	PR target/57261
	* configure.ac (gcc_cv_ld_as_needed): Disable before Solaris 11
	and Solaris 11+/x86 with gld.
	* configure: Regenerate.

Patch

# HG changeset patch
# Parent a618b2ae5c9b7838e4785a8179e0a67fb55365f7
Fix Solaris --as-needed/-z ignore detection

diff --git a/gcc/configure.ac b/gcc/configure.ac
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -4560,6 +4560,23 @@  elif test x$gcc_cv_ld != x; then
 	  esac
 	fi
 fi
+# --as-needed/-z ignore can only be used if libgcc_s.so.1 uses
+# dl_iterate_phdr, i.e. since Solaris 11.
+case "$target" in
+  *-*-solaris2.1[[1-9]]*)
+    case "$target" in
+    i?86-*-* | x86_64-*-*)
+      if echo "$ld_ver" | grep GNU > /dev/null; then
+        # Doesn't work with gld on Solaris/x86 due to PR ld/12320.
+        gcc_cv_ld_as_needed=no
+      fi
+      ;;
+    esac
+    ;;
+  *-*-solaris2*)
+    gcc_cv_ld_as_needed=no
+    ;;
+esac
 ])
 if test x"$gcc_cv_ld_as_needed" = xyes; then
 	AC_DEFINE(HAVE_LD_AS_NEEDED, 1,