This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
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