diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fc6662c1af5..7ba2f43f80e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2004-04-01 Alan Modra + Jakub Jelinek + + * 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 * config/sparc/sparc.h (DITF_CONVERSION_LIBFUNCS): Define to 0. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 95f04975f44..be9a647ef1d 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -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; \ diff --git a/gcc/config.in b/gcc/config.in index 35cb545e31e..2d8f5836dc1 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -306,6 +306,9 @@ /* Define to 1 if you have the 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 diff --git a/gcc/configure b/gcc/configure index db55887e227..f0d5d418e0f 100755 --- a/gcc/configure +++ b/gcc/configure @@ -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 diff --git a/gcc/configure.ac b/gcc/configure.ac index a4da3d26541..f35812d42f2 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -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", diff --git a/gcc/gcc.c b/gcc/gcc.c index 71be65b1cd3..d69d78a0d03 100644 --- 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);