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]

[PATCH]: Fix PR other/35107, avoid unnecessarily linking with shared gmp/mpfr


This patch addresses PR other/35107, in which we unnecessarily link
various host programs with GMP/MPFR when we don't need to.  Only
things that get linked with libbackend.a need mpfr, so xgcc, cpp,
gcov, etc don't need to load the shared libraries at runtime.

The solution to this issue is to remove the $(GMPLIBS) Makefile
variable from $(LIBS), and instead move it to just the executables
that need it.  (Note $(GMPLIBS) contains both -lgmp and -lmpfr).

Fixed by the patch below, bootstrapped on x86_64-unknown-linux-gnu
using --enable-languages=c,ada,c++,fortran,java,objc,obj-c++,treelang.

I verified using ldd that only the specified programs load libgmp.so
at runtime, whereas before everyone of them did so.

IMHO this patch is safe for this stage because it doesn't alter the
compiler itself, only the build process.  Either it works or it
doesn't.  But I understand if it must be postponed to 4.4.

Okay for mainline?  If so when?

		Thanks,
		--Kaveh


2008-02-06  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>

	PR other/35107
	* Makefile.in (LIBS): Remove $(GMPLIBS).
	(cc1-dummy, cc1): Add $(GMPLIBS).

ada:
	PR other/35107
	* Make-lang.in (gnat1): Add $(GMPLIBS).

cp:
	PR other/35107
	* Make-lang.in (cc1plus-dummy, cc1plus): Add $(GMPLIBS).

fortran:
	PR other/35107
	* Make-lang.in (f951): Add $(GMPLIBS).

java:
	PR other/35107
	* Make-lang.in (jc1): Add $(GMPLIBS).

objc:
	PR other/35107
	* Make-lang.in (cc1obj-dummy, cc1obj): Add $(GMPLIBS).

objcp:
	PR other/35107
	* Make-lang.in (cc1objplus-dummy, cc1objplus): Add $(GMPLIBS).

treelang:
	PR other/35107
	* Make-lang.in (tree1): Add $(GMPLIBS).

diff -rup orig/egcc-SVN20080206/gcc/Makefile.in egcc-SVN20080206/gcc/Makefile.in
--- orig/egcc-SVN20080206/gcc/Makefile.in	2008-01-24 22:51:59.000000000 +0100
+++ egcc-SVN20080206/gcc/Makefile.in	2008-02-06 19:32:53.000000000 +0100
@@ -873,7 +873,7 @@ BUILD_LIBDEPS= $(BUILD_LIBIBERTY)

 # How to link with both our special library facilities
 # and the system's installed libraries.
-LIBS = @LIBS@ $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBIBERTY) $(LIBDECNUMBER) $(GMPLIBS)
+LIBS = @LIBS@ $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBIBERTY) $(LIBDECNUMBER)

 # Any system libraries needed just for GNAT.
 SYSLIBS = @GNAT_LIBEXC@
@@ -1554,7 +1554,7 @@ dummy-checksum.o : dummy-checksum.c

 cc1-dummy$(exeext): $(C_OBJS) dummy-checksum.o $(BACKEND) $(LIBDEPS)
 	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(C_OBJS) dummy-checksum.o \
-	  $(BACKEND) $(LIBS)
+	  $(BACKEND) $(LIBS) $(GMPLIBS)

 cc1-checksum.c : cc1-dummy$(exeext) build/genchecksum$(build_exeext)
 	build/genchecksum$(build_exeext) cc1-dummy$(exeext) > $@
@@ -1563,7 +1563,7 @@ cc1-checksum.o : cc1-checksum.c

 cc1$(exeext): $(C_OBJS) cc1-checksum.o $(BACKEND) $(LIBDEPS)
 	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(C_OBJS) cc1-checksum.o \
-	  $(BACKEND) $(LIBS)
+	  $(BACKEND) $(LIBS) $(GMPLIBS)

 #
 # Build libgcc.a.
diff -rup orig/egcc-SVN20080206/gcc/ada/Make-lang.in egcc-SVN20080206/gcc/ada/Make-lang.in
--- orig/egcc-SVN20080206/gcc/ada/Make-lang.in	2007-12-31 19:14:30.000000000 +0100
+++ egcc-SVN20080206/gcc/ada/Make-lang.in	2008-02-06 19:26:49.000000000 +0100
@@ -290,7 +290,7 @@ TARGET_ADA_SRCS =
 # Since the RTL should be built with the latest compiler, remove the
 #  stamp target in the parent directory whenever gnat1 is rebuilt
 gnat1$(exeext): $(TARGET_ADA_SRCS) $(GNAT1_OBJS) $(ADA_BACKEND) $(LIBDEPS)
-	$(GCC_LINK) -o $@ $(GNAT1_OBJS) $(ADA_BACKEND) $(ALL_CFLAGS) $(LIBS) $(SYSLIBS)
+	$(GCC_LINK) -o $@ $(GNAT1_OBJS) $(ADA_BACKEND) $(ALL_CFLAGS) $(LIBS) $(SYSLIBS) $(GMPLIBS)
 	$(RM) stamp-gnatlib2 stamp-tools

 gnatbind$(exeext): ada/b_gnatb.o $(CONFIG_H) $(GNATBIND_OBJS)
diff -rup orig/egcc-SVN20080206/gcc/cp/Make-lang.in egcc-SVN20080206/gcc/cp/Make-lang.in
--- orig/egcc-SVN20080206/gcc/cp/Make-lang.in	2007-12-31 19:13:59.000000000 +0100
+++ egcc-SVN20080206/gcc/cp/Make-lang.in	2008-02-06 19:26:49.000000000 +0100
@@ -91,7 +91,7 @@ cp-warn = $(STRICT_WARN) $(CXX_COMPAT_WA

 cc1plus-dummy$(exeext): $(CXX_OBJS) dummy-checksum.o $(BACKEND) $(LIBDEPS)
 	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
-	      $(CXX_OBJS) dummy-checksum.o $(BACKEND) $(LIBS)
+	      $(CXX_OBJS) dummy-checksum.o $(BACKEND) $(LIBS) $(GMPLIBS)

 cc1plus-checksum.c : cc1plus-dummy$(exeext) build/genchecksum$(build_exeext)
 	build/genchecksum$(build_exeext) cc1plus-dummy$(exeext) > $@
@@ -100,7 +100,7 @@ cc1plus-checksum.o : cc1plus-checksum.c

 cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBDEPS)
 	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
-	      $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBS)
+	      $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBS) $(GMPLIBS)

 # Special build rules.
 $(srcdir)/cp/cfns.h: $(srcdir)/cp/cfns.gperf
diff -rup orig/egcc-SVN20080206/gcc/fortran/Make-lang.in egcc-SVN20080206/gcc/fortran/Make-lang.in
--- orig/egcc-SVN20080206/gcc/fortran/Make-lang.in	2007-12-31 19:14:32.000000000 +0100
+++ egcc-SVN20080206/gcc/fortran/Make-lang.in	2008-02-06 19:26:49.000000000 +0100
@@ -94,7 +94,7 @@ gfortran-cross$(exeext): gfortran$(exeex
 f951$(exeext): $(F95_OBJS) \
 		$(BACKEND) $(LIBDEPS) attribs.o
 	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
-		$(F95_OBJS) $(BACKEND) $(LIBS) attribs.o
+		$(F95_OBJS) $(BACKEND) $(LIBS) attribs.o $(GMPLIBS)

 gt-fortran-trans.h    : s-gtype; @true
 #
diff -rup orig/egcc-SVN20080206/gcc/java/Make-lang.in egcc-SVN20080206/gcc/java/Make-lang.in
--- orig/egcc-SVN20080206/gcc/java/Make-lang.in	2007-12-31 19:11:20.000000000 +0100
+++ egcc-SVN20080206/gcc/java/Make-lang.in	2008-02-06 19:26:49.000000000 +0100
@@ -102,7 +102,7 @@ java/parse.o-warn = -Wno-error
 jc1$(exeext): $(JAVA_OBJS) $(BACKEND) $(LIBDEPS) attribs.o
 	rm -f $@
 	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
-		$(JAVA_OBJS) $(BACKEND) $(ZLIB) $(LIBICONV) $(LIBS) attribs.o
+		$(JAVA_OBJS) $(BACKEND) $(ZLIB) $(LIBICONV) $(LIBS) attribs.o $(GMPLIBS)

 jcf-dump$(exeext): $(JCFDUMP_OBJS) $(LIBDEPS)
 	rm -f $@
diff -rup orig/egcc-SVN20080206/gcc/objc/Make-lang.in egcc-SVN20080206/gcc/objc/Make-lang.in
--- orig/egcc-SVN20080206/gcc/objc/Make-lang.in	2007-12-31 19:11:24.000000000 +0100
+++ egcc-SVN20080206/gcc/objc/Make-lang.in	2008-02-06 19:26:49.000000000 +0100
@@ -52,7 +52,7 @@ OBJC_OBJS = objc/objc-lang.o objc/objc-a
 cc1obj-dummy$(exeext): $(OBJC_OBJS) $(C_AND_OBJC_OBJS) dummy-checksum.o $(BACKEND) $(LIBDEPS)
 	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
 	      $(OBJC_OBJS) $(C_AND_OBJC_OBJS) dummy-checksum.o \
-	      $(BACKEND) $(LIBS)
+	      $(BACKEND) $(LIBS) $(GMPLIBS)

 cc1obj-checksum.c : cc1obj-dummy$(exeext) build/genchecksum$(build_exeext)
 	build/genchecksum$(build_exeext) cc1obj-dummy$(exeext) > $@
@@ -62,7 +62,7 @@ cc1obj-checksum.o : cc1obj-checksum.c
 cc1obj$(exeext): $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) $(LIBDEPS)
 	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
 	      $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o \
-	      $(BACKEND) $(LIBS)
+	      $(BACKEND) $(LIBS) $(GMPLIBS)

 # Objective C language specific files.

diff -rup orig/egcc-SVN20080206/gcc/objcp/Make-lang.in egcc-SVN20080206/gcc/objcp/Make-lang.in
--- orig/egcc-SVN20080206/gcc/objcp/Make-lang.in	2007-12-31 19:13:52.000000000 +0100
+++ egcc-SVN20080206/gcc/objcp/Make-lang.in	2008-02-06 19:26:49.000000000 +0100
@@ -54,7 +54,7 @@ OBJCXX_OBJS = objcp/objcp-act.o objcp/ob
 cc1objplus-dummy$(exeext): $(OBJCXX_OBJS) dummy-checksum.o $(BACKEND) \
 		$(LIBDEPS)
 	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
-		$(OBJCXX_OBJS) dummy-checksum.o $(BACKEND) $(LIBS)
+		$(OBJCXX_OBJS) dummy-checksum.o $(BACKEND) $(LIBS) $(GMPLIBS)

 cc1objplus-checksum.c : cc1objplus-dummy$(exeext) build/genchecksum$(build_exeext)
 	build/genchecksum$(build_exeext) cc1objplus-dummy$(exeext) > $@
@@ -63,7 +63,7 @@ cc1objplus-checksum.o : cc1objplus-check

 cc1objplus$(exeext): $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) $(LIBDEPS)
 	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
-		$(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) $(LIBS)
+		$(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) $(LIBS) $(GMPLIBS)

 # Objective C++ language specific files.

diff -rup orig/egcc-SVN20080206/gcc/treelang/Make-lang.in egcc-SVN20080206/gcc/treelang/Make-lang.in
--- orig/egcc-SVN20080206/gcc/treelang/Make-lang.in	2007-12-31 19:14:40.000000000 +0100
+++ egcc-SVN20080206/gcc/treelang/Make-lang.in	2008-02-06 19:26:49.000000000 +0100
@@ -84,7 +84,7 @@ tree1$(exeext): treelang/tree1.o treelan
 	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
 	treelang/tree1.o treelang/treetree.o treelang/tree-convert.o \
 	treelang/lex.o treelang/parse.o \
-	$(BACKEND) $(LIBS) attribs.o
+	$(BACKEND) $(LIBS) attribs.o $(GMPLIBS)

 # Create the compiler driver treelang.
 gtreelang$(exeext): $(GCC_OBJS) version.o prefix.o intl.o $(EXTRA_GCC_OBJS) \


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