Hi!

As discussed, using --as-needed and --no-as-needed is dangerous, because
it results in --no-as-needed even for libraries after -lgcc_s, even when the
default is --as-needed or --as-needed has been specified earlier on the
command line.

If the linker supports --push-state/--pop-state, we should IMHO use it.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for stage1?

Or is this something we want in GCC8 too?

2018-04-11  Jakub Jelinek  <ja...@redhat.com>

        * configure.ac (LD_AS_NEEDED_OPTION, LD_NO_AS_NEEDED_OPTION): Use
        --push-state --as-needed and --pop-state instead of --as-needed and
        --no-as-needed if ld supports it.
        * configure: Regenerated.

--- gcc/configure.ac.jj 2018-03-21 21:18:32.470351282 +0100
+++ gcc/configure.ac    2018-04-10 13:31:25.448060053 +0200
@@ -5517,11 +5517,21 @@ 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
+    if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" 
-ge 28; then
+      gcc_cv_ld_as_needed_option='--push-state --as-needed'
+      gcc_cv_ld_no_as_needed_option='--pop-state'
+    fi
   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>&1 | grep as-needed > /dev/null; then
     gcc_cv_ld_as_needed=yes
+    if $gcc_cv_ld --help 2>&1 | grep push-state > /dev/null; then
+      if $gcc_cv_ld --help 2>&1 | grep pop-state > /dev/null; then
+       gcc_cv_ld_as_needed_option='--push-state --as-needed'
+       gcc_cv_ld_no_as_needed_option='--pop-state'
+      fi
+    fi
   fi
   case "$target:$gnu_ld" in
     *-*-solaris2*:no)
--- gcc/configure.jj    2018-03-21 21:18:30.187351579 +0100
+++ gcc/configure       2018-04-10 13:47:57.652298798 +0200
@@ -28733,11 +28733,21 @@ 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
+    if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" 
-ge 28; then
+      gcc_cv_ld_as_needed_option='--push-state --as-needed'
+      gcc_cv_ld_no_as_needed_option='--pop-state'
+    fi
   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>&1 | grep as-needed > /dev/null; then
     gcc_cv_ld_as_needed=yes
+    if $gcc_cv_ld --help 2>&1 | grep push-state > /dev/null; then
+      if $gcc_cv_ld --help 2>&1 | grep pop-state > /dev/null; then
+       gcc_cv_ld_as_needed_option='--push-state --as-needed'
+       gcc_cv_ld_no_as_needed_option='--pop-state'
+      fi
+    fi
   fi
   case "$target:$gnu_ld" in
     *-*-solaris2*:no)

        Jakub

Reply via email to