gcc.c (init_gcc_specs): If HAVE_LD_AS_NEEDED, link with -lgcc --as-needed -lgcc_s...
authorAlan Modra <amodra@bigpond.net.au>
Thu, 1 Apr 2004 16:45:34 +0000 (16:45 +0000)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 1 Apr 2004 16:45:34 +0000 (18:45 +0200)
* gcc.c (init_gcc_specs): If HAVE_LD_AS_NEEDED, link with
-lgcc --as-needed -lgcc_s --no-as-needed by default.
* configure.ac (HAVE_LD_AS_NEEDED): Check for ld --as-needed.
* configure: Rebuilt.
* config.in: Rebuilt.
* Makefile.in (stage1-start): Copy also libgcc_s*$(SHLIB_EXT).
(stage2-start, stage3-start, stage4-start): Likewise.
(stageprofile-start, stagefeedback-start): Likewise.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r80302

gcc/ChangeLog
gcc/Makefile.in
gcc/config.in
gcc/configure
gcc/configure.ac
gcc/gcc.c

index fc6662c1af512f81a8feb4f0bd6f2c352bcbd4f8..7ba2f43f80e3029a376d0f8f581493fc4d43cbdf 100644 (file)
@@ -1,3 +1,15 @@
+2004-04-01  Alan Modra  <amodra@bigpond.net.au>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.c (init_gcc_specs): If HAVE_LD_AS_NEEDED, link with
+       -lgcc --as-needed -lgcc_s --no-as-needed by default.
+       * configure.ac (HAVE_LD_AS_NEEDED): Check for ld --as-needed.
+       * configure: Rebuilt.
+       * config.in: Rebuilt.
+       * Makefile.in (stage1-start): Copy also libgcc_s*$(SHLIB_EXT).
+       (stage2-start, stage3-start, stage4-start): Likewise.
+       (stageprofile-start, stagefeedback-start): Likewise.
+
 2004-04-01  Jakub Jelinek  <jakub@redhat.com>
 
        * config/sparc/sparc.h (DITF_CONVERSION_LIBFUNCS): Define to 0.
index 95f04975f44efbb8a57e76d2004751f5c4b031f2..be9a647ef1d3e544453ec5c550c6601a7ba3657a 100644 (file)
@@ -3639,6 +3639,7 @@ stage1-start:
        -if [ -f ld$(exeext) ] ; then (cd stage1 && $(LN_S) ../ld$(exeext) .) ; else true ; fi
        -if [ -f collect-ld$(exeext) ] ; then (cd stage1 && $(LN_S) ../collect-ld$(exeext) .) ; else true ; fi
        -rm -f stage1/libgcc.a stage1/libgcc_eh.a stage1/libgcov.a
+       -rm -f stage1/libgcc_s*$(SHLIB_EXT)
        -cp libgcc.a stage1
        -$(RANLIB_FOR_TARGET) stage1/libgcc.a
        -cp libgcov.a stage1
@@ -3646,6 +3647,7 @@ stage1-start:
        -if [ -f libgcc_eh.a ] ; then cp libgcc_eh.a stage1; \
           $(RANLIB_FOR_TARGET) stage1/libgcc_eh.a; \
        fi
+       -cp libgcc_s*$(SHLIB_EXT) stage1
        -for f in .. $(EXTRA_MULTILIB_PARTS); do if [ x$${f} != x.. ]; then \
          cp stage1/$${f} . ; \
        else true; \
@@ -3672,6 +3674,7 @@ stage2-start:
        -if [ -f ld$(exeext) ] ; then (cd stage2 && $(LN_S) ../ld$(exeext) .) ; else true ; fi
        -if [ -f collect-ld$(exeext) ] ; then (cd stage2 && $(LN_S) ../collect-ld$(exeext) .) ; else true ; fi
        -rm -f stage2/libgcc.a stage2/libgcov.a stage2/libgcc_eh.a
+       -rm -f stage2/libgcc_s*$(SHLIB_EXT)
        -cp libgcc.a stage2
        -$(RANLIB_FOR_TARGET) stage2/libgcc.a
        -cp libgcov.a stage2
@@ -3679,6 +3682,7 @@ stage2-start:
        -if [ -f libgcc_eh.a ] ; then cp libgcc_eh.a stage2; \
           $(RANLIB_FOR_TARGET) stage2/libgcc_eh.a; \
        fi
+       -cp libgcc_s*$(SHLIB_EXT) stage2
        -for f in .. $(EXTRA_MULTILIB_PARTS); do if [ x$${f} != x.. ]; then \
          cp stage2/$${f} . ; \
        else true; \
@@ -3701,6 +3705,7 @@ stage3-start:
        -if [ -f ld$(exeext) ] ; then (cd stage3 && $(LN_S) ../ld$(exeext) .) ; else true ; fi
        -if [ -f collect-ld$(exeext) ] ; then (cd stage3 && $(LN_S) ../collect-ld$(exeext) .) ; else true ; fi
        -rm -f stage3/libgcc.a stage3/libgcov.a stage3/libgcc_eh.a
+       -rm -f stage3/libgcc_s*$(SHLIB_EXT)
        -cp libgcc.a stage3
        -$(RANLIB_FOR_TARGET) stage3/libgcc.a
        -cp libgcov.a stage3
@@ -3708,6 +3713,7 @@ stage3-start:
        -if [ -f libgcc_eh.a ] ; then cp libgcc_eh.a stage3; \
           $(RANLIB_FOR_TARGET) stage3/libgcc_eh.a; \
        fi
+       -cp libgcc_s*$(SHLIB_EXT) stage3
        -for f in .. $(EXTRA_MULTILIB_PARTS); do if [ x$${f} != x.. ]; then \
          cp stage3/$${f} . ; \
        else true; \
@@ -3730,6 +3736,7 @@ stage4-start:
        -if [ -f ld$(exeext) ] ; then (cd stage4 && $(LN_S) ../ld$(exeext) .) ; else true ; fi
        -if [ -f collect-ld$(exeext) ] ; then (cd stage4 && $(LN_S) ../collect-ld$(exeext) .) ; else true ; fi
        -rm -f stage4/libgcc.a stage4/libgcov.a stage4/libgcc_eh.a
+       -rm -f stage4/libgcc_s*$(SHLIB_EXT)
        -cp libgcc.a stage4
        -$(RANLIB_FOR_TARGET) stage4/libgcc.a
        -cp libgcov.a stage4
@@ -3737,6 +3744,7 @@ stage4-start:
        -if [ -f libgcc_eh.a ] ; then cp libgcc_eh.a stage4; \
           $(RANLIB_FOR_TARGET) stage4/libgcc_eh.a; \
        fi
+       -cp libgcc_s*$(SHLIB_EXT) stage4
        -for f in .. $(EXTRA_MULTILIB_PARTS); do if [ x$${f} != x.. ]; then \
          cp stage4/$${f} . ; \
        else true; \
@@ -3757,6 +3765,7 @@ stageprofile-start:
        -if [ -f ld$(exeext) ] ; then (cd stageprofile && $(LN_S) ../ld$(exeext) .) ; else true ; fi
        -if [ -f collect-ld$(exeext) ] ; then (cd stageprofile && $(LN_S) ../collect-ld$(exeext) .) ; else true ; fi
        -rm -f stageprofile/libgcc.a stageprofile/libgcov.a stageprofile/libgcc_eh.a
+       -rm -f stageprofile/libgcc_s*$(SHLIB_EXT)
        -cp libgcc.a stageprofile
        -$(RANLIB_FOR_TARGET) stageprofile/libgcc.a
        -cp libgcov.a stageprofile
@@ -3764,6 +3773,7 @@ stageprofile-start:
        -if [ -f libgcc_eh.a ] ; then cp libgcc_eh.a stageprofile; \
           $(RANLIB_FOR_TARGET) stageprofile/libgcc_eh.a; \
        fi
+       -cp libgcc_s*$(SHLIB_EXT) stageprofile
        -for f in .. $(EXTRA_MULTILIB_PARTS); do if [ x$${f} != x.. ]; then \
          cp stageprofile/$${f} . ; \
        else true; \
@@ -3784,6 +3794,7 @@ stagefeedback-start:
        -if [ -f ld$(exeext) ] ; then (cd stagefeedback && $(LN_S) ../ld$(exeext) .) ; else true ; fi
        -if [ -f collect-ld$(exeext) ] ; then (cd stagefeedback && $(LN_S) ../collect-ld$(exeext) .) ; else true ; fi
        -rm -f stagefeedback/libgcc.a stagefeedback/libgcov.a stagefeedback/libgcc_eh.a
+       -rm -f stagefeedback/libgcc_s*$(SHLIB_EXT)
        -rm -f *.da
        -for dir in fixinc po testsuite $(SUBDIRS); \
         do \
@@ -3796,6 +3807,7 @@ stagefeedback-start:
        -if [ -f libgcc_eh.a ] ; then cp libgcc_eh.a stagefeedback; \
           $(RANLIB_FOR_TARGET) stagefeedback/libgcc_eh.a; \
        fi
+       -cp libgcc_s*$(SHLIB_EXT) stagefeedback
        -for f in .. $(EXTRA_MULTILIB_PARTS); do if [ x$${f} != x.. ]; then \
          cp stagefeedback/$${f} . ; \
        else true; \
index 35cb545e31e40789ab2f9692751ac8f86d1221cc..2d8f5836dc11aac28c5debd178594621d463d3dd 100644 (file)
 /* Define to 1 if you have the <ldfcn.h> header file. */
 #undef HAVE_LDFCN_H
 
+/* Define if your linker supports --as-needed and --no-as-needed options. */
+#undef HAVE_LD_AS_NEEDED
+
 /* Define if your linker supports --eh-frame-hdr option. */
 #undef HAVE_LD_EH_FRAME_HDR
 
index db55887e227a01f6f0ae210a001a75965bcd7e1c..f0d5d418e0fbfbe46047b76ca1a0dbf41fadc4f6 100755 (executable)
@@ -11916,6 +11916,30 @@ echo "${ECHO_T}$gcc_cv_ld_pie" >&6
 # UNSORTED
 # --------
 
+echo "$as_me:$LINENO: checking linker --as-needed support" >&5
+echo $ECHO_N "checking linker --as-needed support... $ECHO_C" >&6
+gcc_cv_ld_as_needed=no
+if test $in_tree_ld = yes ; then
+  if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 16 -o "$gcc_cv_gld_major_version" -gt 2 \
+     && test $in_tree_ld_is_elf = yes; then
+    gcc_cv_ld_as_needed=yes
+  fi
+elif test x$gcc_cv_ld != x; then
+       # Check if linker supports --as-needed and --no-as-needed options
+       if $gcc_cv_ld --help 2>/dev/null | grep as-needed > /dev/null; then
+               gcc_cv_ld_as_needed=yes
+       fi
+fi
+if test x"$gcc_cv_ld_as_needed" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LD_AS_NEEDED 1
+_ACEOF
+
+fi
+echo "$as_me:$LINENO: result: $gcc_cv_ld_as_needed" >&5
+echo "${ECHO_T}$gcc_cv_ld_as_needed" >&6
+
 if test x$with_sysroot = x && test x$host = x$target \
    && test "$prefix" != "/usr" && test "x$prefix" != "x$local_prefix" ; then
 
index a4da3d265418057b31ee5b0e37d7820a37c0ce8f..f35812d42f21ea8e73b2582f16aae6a4e1066a6f 100644 (file)
@@ -2744,6 +2744,25 @@ AC_MSG_RESULT($gcc_cv_ld_pie)
 # UNSORTED
 # --------
 
+AC_MSG_CHECKING(linker --as-needed support)
+gcc_cv_ld_as_needed=no
+if test $in_tree_ld = yes ; then
+  if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 16 -o "$gcc_cv_gld_major_version" -gt 2 \
+     && test $in_tree_ld_is_elf = yes; then
+    gcc_cv_ld_as_needed=yes
+  fi
+elif test x$gcc_cv_ld != x; then
+       # Check if linker supports --as-needed and --no-as-needed options
+       if $gcc_cv_ld --help 2>/dev/null | grep as-needed > /dev/null; then
+               gcc_cv_ld_as_needed=yes
+       fi
+fi
+if test x"$gcc_cv_ld_as_needed" = xyes; then
+       AC_DEFINE(HAVE_LD_AS_NEEDED, 1,
+[Define if your linker supports --as-needed and --no-as-needed options.])
+fi
+AC_MSG_RESULT($gcc_cv_ld_as_needed)
+
 if test x$with_sysroot = x && test x$host = x$target \
    && test "$prefix" != "/usr" && test "x$prefix" != "x$local_prefix" ; then
   AC_DEFINE_UNQUOTED(PREFIX_INCLUDE_DIR, "$prefix/include",
index 71be65b1cd3775c746525a65fc397939babf04b1..d69d78a0d030515674b2cf800716e8d5aa243078 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -1533,6 +1533,12 @@ init_gcc_specs (struct obstack *obstack, const char *shared_name,
 
   buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name,
                "}%{!static:%{!static-libgcc:",
+#ifdef HAVE_LD_AS_NEEDED
+               "%{!shared-libgcc:", static_name,
+               " --as-needed ", shared_name, " --no-as-needed}"
+               "%{shared-libgcc:", shared_name, "%{!shared: ", static_name,
+               "}",
+#else
                "%{!shared:%{!shared-libgcc:", static_name, " ",
                eh_name, "}%{shared-libgcc:", shared_name, " ",
                static_name, "}}%{shared:",
@@ -1541,6 +1547,7 @@ init_gcc_specs (struct obstack *obstack, const char *shared_name,
                "}%{!shared-libgcc:", static_name, "}",
 #else
                shared_name,
+#endif
 #endif
                "}}}", NULL);