This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

libgcc.mk fallout


This patch, I believe, fixes the reported problems with libgcc.mk.
There are still some weirdnesses in the way shared libraries are being
generated on multilib-ful architectures (e.g. powerpc64-linux) but I
am not sure it is wrong, and I am not sure what is right if it is
wrong, so I am not messing with it.  This _does_ fix the problem that
the default libgcc_s.so would be generated with a soname with a ./ in
it.

Tested by (a) stage1_build for powerpc64-linux, (b) ditto amd64-linux,
(c) cross compiler build for arm-elf.  More thorough testing is in
progress, but I am going to check this in now in hopes of clearing
bootstrap failures for people.

zw

        * mklibgcc.in: Correct calculation of libgcc_s_soname and
        libunwind_soname.  Use $out, not $outS, in commands for
        no-shared-library case.  Move EXTRA_MULTILIB_PARTS rules above
        library build rules, make $libunwind_so and $libgcc_s_so
        depend on them in the normal fashion, and filter those objects
        out of @shlib_objs@.

===================================================================
Index: mklibgcc.in
--- mklibgcc.in	30 Nov 2004 08:15:39 -0000	1.73
+++ mklibgcc.in	30 Nov 2004 19:15:24 -0000
@@ -170,23 +170,24 @@ for ml in $MULTILIBS; do
 	libgcc_eh_a=$dir/libgcc_eh.a
 	libgcc_s_so_base=$dir/libgcc_s
 	libgcc_s_so=${libgcc_s_so_base}${SHLIB_EXT}
+	libgcc_s_soname=libgcc_s
 	if [ "$LIBUNWIND" ]; then
 	  libunwind_so_base=$dir/libunwind
 	  libunwind_so=${libunwind_so_base}${SHLIB_EXT}
+	  libunwind_soname=libunwind
 	fi
       else
+        suffix=`echo $dir | sed s,/,_,g`
 	libgcc_eh_a=$dir/libgcc_eh.a
-	libgcc_s_so_base=$dir/libgcc_s_`echo $dir | sed s,/,_,g`
+	libgcc_s_so_base=$dir/libgcc_s_${suffix}
 	libgcc_s_so=${libgcc_s_so_base}${SHLIB_EXT}
+	libgcc_s_soname=libgcc_s_${suffix}
 	if [ "$LIBUNWIND" ]; then
-	  libunwind_so_base=$dir/libunwind_`echo $dir | sed s,/,_,g`
+	  libunwind_so_base=$dir/libunwind_${suffix}
 	  libunwind_so=${libunwind_so_base}${SHLIB_EXT}
 	fi
       fi
 
-      libgcc_s_soname=$libgcc_s_so_base
-      libunwind_soname=$libunwind_so_base
-
       if [ -n "$MULTILIB_OSDIRNAMES" ]; then
 	if [ "$dir" != . ]; then
 	  gcc_multilib_dir=`./xgcc -B./ $flags --print-multi-directory`
@@ -212,15 +213,16 @@ for ml in $MULTILIBS; do
       libgcc_eh_a=$dir/libgcc_eh.a
       libgcc_s_so_base=$dir/libgcc_s
       libgcc_s_so=${libgcc_s_so_base}${SHLIB_EXT}
+      libgcc_s_soname=libgcc_s
       if [ "$LIBUNWIND" ]; then
 	libunwind_so_base=$dir/libunwind
 	libunwind_so=${libunwind_so_base}${SHLIB_EXT}
+	libunwind_soname=libunwind
       fi
-
-      libgcc_s_soname=$libgcc_s_so_base
-      libunwind_soname=$libunwind_so_base
     fi
   fi
+  libgcc_s_so_extra=
+  libunwind_so_extra=
 
   echo
   echo \#
@@ -312,7 +314,7 @@ for ml in $MULTILIBS; do
     else
       out="libgcc/${dir}/${name}${objext}"
       echo ${out}: stmp-dirs '$(srcdir)/config/$(LIB1ASMSRC)'
-      echo "	$gcc_compile" $flags -DL$name -c '$(srcdir)/libgcc2.c' -o $outS
+      echo "	$gcc_compile" $flags -DL$name -c '$(srcdir)/libgcc2.c' -o $out
       echo $libgcc_a: $out
     fi
   done
@@ -348,7 +350,7 @@ for ml in $MULTILIBS; do
       out="libgcc/${dir}/${name}${objext}"
       echo ${out}: stmp-dirs '$(srcdir)/config/$(LIB1ASMSRC)'
       echo "	$gcc_compile" $flags -DL$name \
-        -fexceptions -fnon-call-exceptions -c '$(srcdir)/libgcc2.c' -o $outS
+        -fexceptions -fnon-call-exceptions -c '$(srcdir)/libgcc2.c' -o $out
       echo $libgcc_a: $out
     fi
   done
@@ -590,7 +592,7 @@ for ml in $MULTILIBS; do
       fi
     done
 
-  else # no SHLIB_LINK
+  else # no libgcc_eh.a
     for file in $LIB2ADDEH; do
       case $file in
         *.c) ;;
@@ -652,6 +654,39 @@ for ml in $MULTILIBS; do
     echo $libgcov_a: $out
   done
 
+  # EXTRA_MULTILIB_PARTS.
+  echo
+  for f in $EXTRA_MULTILIB_PARTS; do
+    case $dir in
+    .) out=$f ; t= ;;
+    *) out=$dir/$f ; t=$dir/ ;;
+    esac
+    case $out in
+    # Prevent `make' from interpreting $out as a macro assignment
+    *'$(EQ)'*) targ="T_TARGET=$out T_TARGET" ;;
+    *) targ=$out ;;
+    esac
+
+    echo $out: stmp-dirs
+    echo "	$make_compile" \\
+    echo '	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)' $flags '" ' \\
+    echo '	  MULTILIB_CFLAGS="'$flags'"' T=$t $targ
+    echo "all: $out"
+
+    # Make libunwind.so and libgcc_s.so depend on these, since they are
+    # likely to be implicitly used by the link process.  However, we must
+    # then arrange to remove them from the explicit object list generated
+    # from $^ - see below.
+    if [ "$libgcc_s_so" ]; then
+      libgcc_s_so_extra="$libgcc_s_so_extra $out"
+      echo "$libgcc_s_so: $out"
+    fi
+    if [ "$libunwind_so" ]; then
+      libunwind_so_extra="$libunwind_so_extra $out"
+      echo "$libunwind_so: $out"
+    fi
+  done
+
   # Library build rules.
   dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
   flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
@@ -677,14 +712,6 @@ $libgcc_s_so: ${mapfile}
 EOF
   fi
 
-  # Depend on EXTRA_MULTILIB_PARTS, since that's where crtbegin/end
-  # usually are put in a true multilib situation.
-  shlib_extra_deps=""
-  for f in $EXTRA_MULTILIB_PARTS; do
-    shlib_extra_deps="$shlib_extra_deps $dir/$f"
-  done
-  echo $libgcc_s_so: $shlib_extra_deps
-
   # Static libraries.
 
   # Each of these .a files depends on stmp-dirs.  It would seem that
@@ -733,7 +760,7 @@ EOF
     echo "	$SHLIB_LINK" \
 	 | sed -e "s%@multilib_flags@%$flags%g" \
 	       -e "s%@multilib_dir@%$dir%g" \
-	       -e "s%@shlib_objs@%\$(objects)%g" \
+	       -e "s%@shlib_objs@%\$(filter-out $libgcc_s_so_extra,\$(objects))%g" \
 	       -e "s%@shlib_base_name@%$libgcc_s_so_base%g" \
 	       -e "s%@shlib_so_name@%$libgcc_s_soname%g" \
 	       -e "s%@shlib_map_file@%$mapfile%g" \
@@ -748,7 +775,7 @@ EOF
     echo "	$SHLIBUNWIND_LINK" \
 	   | sed -e "s%@multilib_flags@%$flags%g" \
 		 -e "s%@multilib_dir@%$dir%g" \
-		 -e "s%@shlib_objs@%\$(objects)%g" \
+		 -e "s%@shlib_objs@%\$(filter-out $libunwind_so_extra,\$(objects))%g" \
 		 -e "s%@shlib_base_name@%$libunwind_so_base%g" \
 		 -e "s%@shlib_so_name@%$libunwind_soname%g" \
 		 -e "s%@shlib_dir@%$shlib_dir%g" \
@@ -756,25 +783,6 @@ EOF
     echo "all: $libunwind_so"
   fi
 
-  # EXTRA_MULTILIB_PARTS.
-  for f in $EXTRA_MULTILIB_PARTS; do
-    case $dir in
-    .) out=$f ; t= ;;
-    *) out=$dir/$f ; t=$dir/ ;;
-    esac
-    case $out in
-    # Prevent `make' from interpreting $out as a macro assignment
-    *'$(EQ)'*) targ="T_TARGET=$out T_TARGET" ;;
-    *) targ=$out ;;
-    esac
-
-    echo $out: stmp-dirs
-    echo "	$make_compile" \\
-    echo '	  LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)' $flags '" ' \\
-    echo '	  MULTILIB_CFLAGS="'$flags'"' T=$t $targ
-    echo "all: $out"
-  done
-
 done # ml in MULTILIBS
 
 echo


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]