This is the mail archive of the gcc@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: Build shared libraries with -Bsymbolic-functions


On Wed, Jan 10, 2007 at 06:26:09AM -0700, Tom Tromey wrote:
> >>>>> "H.J." == H J Lu <hjl@lucon.org> writes:
> 
> H.J.> With the new linker switches, -Bsymbolic-functions and
> H.J.> --dynamic-list-cpp-new, we can improve shared library
> H.J.> performance in gcc. This change will build libstdc++.so with
> H.J.> -Bsymbolic-functions and --dynamic-list-cpp-new. I can expand it
> H.J.> to other libraries.
> 
> I prefer to see semi-generic helper code like this in a new .m4 file
> in config.  That makes it somewhat simpler for other target libraries
> to reuse it.
> 

Here it is. If it is OK, I will extend it to Java and Fortran.


H.J.
---
config/

2007-01-10  H.J. Lu  <hongjiu.lu@intel.com>

	* lib-ld.m4 (AC_LIB_PROG_LD_GNU_SYMBOLIC): New.
	(AC_LIB_PROG_LD_GNU_DYNAMIC_LIST_CPP_NEW): Likewise.

libstdc++-v3/

2007-01-10  H.J. Lu  <hongjiu.lu@intel.com>

	* aclocal.m4: Include ../config/lib-ld.m4.
	* configure.ac: Use AC_LIB_PROG_LD_GNU_DYNAMIC_LIST_CPP_NEW.
	* configure: Regenerated.
	* Makefile.in: Likewise.

	* src/Makefile.am (CXXLINK): Add $(DYNAMIC_LIST_CPP_NEW_LDFLAGS).
	* src/Makefile.in: Regenerated.

--- gcc/config/lib-ld.m4.symbolic	2005-11-01 13:56:29.000000000 -0800
+++ gcc/config/lib-ld.m4	2007-01-10 10:49:49.000000000 -0800
@@ -108,3 +108,43 @@ fi
 test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
 AC_LIB_PROG_LD_GNU
 ])
+
+dnl Substitute SYMBOLIC_LDFLAGS with -Bsymbolic-functions for GNU linker
+dnl if it is supported.
+AC_DEFUN([AC_LIB_PROG_LD_GNU_SYMBOLIC],
+[AC_CACHE_CHECK([if the GNU linker ($LD) supports -Bsymbolic-functions],
+acl_cv_prog_gnu_ld_symbolic, [
+acl_cv_prog_gnu_ld_symbolic=no
+if test x"$with_gnu_ld" = x"yes"; then
+  if $LD --help 2>&1 </dev/null | grep Bsymbolic-functions 1>&5; then
+    acl_cv_prog_gnu_ld_symbolic=yes
+  fi
+fi])
+if test x"$acl_cv_prog_gnu_ld_symbolic" = x"yes"; then
+  SYMBOLIC_LDFLAGS="-Wl,-Bsymbolic-functions"
+else
+  SYMBOLIC_LDFLAGS=''
+fi
+AC_SUBST(SYMBOLIC_LDFLAGS)
+])
+
+dnl Substitute DYNAMIC_LIST_CPP_NEW_LDFLAGS with --dynamic-list-cpp-new
+dnl for GNU linker if it is supported.
+AC_DEFUN([AC_LIB_PROG_LD_GNU_DYNAMIC_LIST_CPP_NEW],
+[AC_CACHE_CHECK([if the GNU linker ($LD) supports --dynamic-list-cpp-new],
+acl_cv_prog_gnu_ld_dynamic_list_cpp_new, [
+acl_cv_prog_gnu_ld_dynamic_list_cpp_new=no
+if test x"$with_gnu_ld" = x"yes"; then
+  if $LD --help 2>&1 </dev/null | grep dynamic-list-cpp-new 1>&5; then
+    acl_cv_prog_gnu_ld_dynamic_list_cpp_new=yes
+  fi
+fi])
+AC_LIB_PROG_LD_GNU_SYMBOLIC
+if test x"$acl_cv_prog_gnu_ld_symbolic" = x"yes" -a \
+	x"$acl_cv_prog_gnu_ld_dynamic_list_cpp_new" = x"yes"; then
+   DYNAMIC_LIST_CPP_NEW_LDFLAGS="$SYMBOLIC_LDFLAGS -Wl,--dynamic-list-cpp-new"
+else
+   DYNAMIC_LIST_CPP_NEW_LDFLAGS=''
+fi
+AC_SUBST(DYNAMIC_LIST_CPP_NEW_LDFLAGS)
+])
--- gcc/libstdc++-v3/Makefile.in.symbolic	2006-10-17 07:33:04.000000000 -0700
+++ gcc/libstdc++-v3/Makefile.in	2007-01-10 10:33:04.000000000 -0800
@@ -50,9 +50,10 @@ am__aclocal_m4_deps = $(top_srcdir)/../c
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
 	$(top_srcdir)/../config/unwind_ipinfo.m4 \
-	$(top_srcdir)/../libtool.m4 $(top_srcdir)/crossconfig.m4 \
-	$(top_srcdir)/linkage.m4 $(top_srcdir)/acinclude.m4 \
-	$(top_srcdir)/../config/tls.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/../config/lib-ld.m4 $(top_srcdir)/../libtool.m4 \
+	$(top_srcdir)/crossconfig.m4 $(top_srcdir)/linkage.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/../config/tls.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
@@ -129,6 +130,7 @@ CYGPATH_W = @CYGPATH_W@
 C_INCLUDE_DIR = @C_INCLUDE_DIR@
 DEBUG_FLAGS = @DEBUG_FLAGS@
 DEFS = @DEFS@
+DYNAMIC_LIST_CPP_NEW_LDFLAGS = @DYNAMIC_LIST_CPP_NEW_LDFLAGS@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
@@ -193,6 +195,7 @@ SECTION_LDFLAGS = @SECTION_LDFLAGS@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+SYMBOLIC_LDFLAGS = @SYMBOLIC_LDFLAGS@
 SYMVER_FILE = @SYMVER_FILE@
 TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@
 USE_NLS = @USE_NLS@
--- gcc/libstdc++-v3/aclocal.m4.symbolic	2006-10-17 07:33:04.000000000 -0700
+++ gcc/libstdc++-v3/aclocal.m4	2007-01-10 10:19:35.000000000 -0800
@@ -585,6 +585,7 @@ m4_include([../config/lead-dot.m4])
 m4_include([../config/multi.m4])
 m4_include([../config/no-executables.m4])
 m4_include([../config/unwind_ipinfo.m4])
+m4_include([../config/lib-ld.m4])
 m4_include([../libtool.m4])
 m4_include([crossconfig.m4])
 m4_include([linkage.m4])
--- gcc/libstdc++-v3/configure.ac.symbolic	2006-11-16 09:57:24.000000000 -0800
+++ gcc/libstdc++-v3/configure.ac	2007-01-10 10:20:44.000000000 -0800
@@ -403,5 +403,7 @@ _EOF
 SUBDIRS="$SUBDIRS"
 ])
 
+AC_LIB_PROG_LD_GNU_DYNAMIC_LIST_CPP_NEW
+
 dnl And this actually makes things happen:
 AC_OUTPUT
--- gcc/libstdc++-v3/src/Makefile.am.symbolic	2006-07-30 22:39:24.000000000 -0700
+++ gcc/libstdc++-v3/src/Makefile.am	2007-01-10 10:31:21.000000000 -0800
@@ -254,7 +254,9 @@ LTLDFLAGS = $(shell $(SHELL) $(top_srcdi
 # directory to configure libstdc++-v3 to use gcc as the C++
 # compilation driver.
 CXXLINK = $(LIBTOOL) --tag CXX --mode=link $(CXX) \
-	  $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@
+	  $(OPT_LDFLAGS) $(SECTION_LDFLAGS) \
+	  $(DYNAMIC_LIST_CPP_NEW_LDFLAGS) \
+	  $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@
 
 
 # Added bits to build debug library.
--- gcc/libstdc++-v3/src/Makefile.in.symbolic	2006-10-17 07:32:51.000000000 -0700
+++ gcc/libstdc++-v3/src/Makefile.in	2007-01-10 10:34:10.000000000 -0800
@@ -45,9 +45,10 @@ am__aclocal_m4_deps = $(top_srcdir)/../c
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
 	$(top_srcdir)/../config/unwind_ipinfo.m4 \
-	$(top_srcdir)/../libtool.m4 $(top_srcdir)/crossconfig.m4 \
-	$(top_srcdir)/linkage.m4 $(top_srcdir)/acinclude.m4 \
-	$(top_srcdir)/../config/tls.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/../config/lib-ld.m4 $(top_srcdir)/../libtool.m4 \
+	$(top_srcdir)/crossconfig.m4 $(top_srcdir)/linkage.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/../config/tls.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 CONFIG_HEADER = $(top_builddir)/config.h
@@ -147,6 +148,7 @@ CYGPATH_W = @CYGPATH_W@
 C_INCLUDE_DIR = @C_INCLUDE_DIR@
 DEBUG_FLAGS = @DEBUG_FLAGS@
 DEFS = @DEFS@
+DYNAMIC_LIST_CPP_NEW_LDFLAGS = @DYNAMIC_LIST_CPP_NEW_LDFLAGS@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
@@ -211,6 +213,7 @@ SECTION_LDFLAGS = @SECTION_LDFLAGS@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+SYMBOLIC_LDFLAGS = @SYMBOLIC_LDFLAGS@
 SYMVER_FILE = @SYMVER_FILE@
 TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@
 USE_NLS = @USE_NLS@
@@ -437,7 +440,9 @@ LTLDFLAGS = $(shell $(SHELL) $(top_srcdi
 # directory to configure libstdc++-v3 to use gcc as the C++
 # compilation driver.
 CXXLINK = $(LIBTOOL) --tag CXX --mode=link $(CXX) \
-	  $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@
+	  $(OPT_LDFLAGS) $(SECTION_LDFLAGS) \
+	  $(DYNAMIC_LIST_CPP_NEW_LDFLAGS) \
+	  $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@
 
 debugdir = debug
 all: all-am


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