aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2014-08-19 10:40:28 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2014-08-19 10:54:35 +0200
commit691e9d28b57133f9b5ba993816652a5b63592b5f (patch)
tree3e1eef1cc716d81d97097cbef4e931b58c281d87
parent03673295496888839bc928c59f4291b6e2b2fbb1 (diff)
parente432a5f08d75480753cf3cf81d656f0e1dd4da79 (diff)
Merge pull request #4725
e432a5f build: add option for reducing exports (v2) (Cory Fields)
-rw-r--r--configure.ac78
-rw-r--r--src/Makefile.am3
-rw-r--r--src/Makefile.qt.include2
-rw-r--r--src/Makefile.qttest.include2
-rw-r--r--src/Makefile.test.include1
5 files changed, 84 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac
index 7db6ebac0e..601ccf0a79 100644
--- a/configure.ac
+++ b/configure.ac
@@ -90,6 +90,12 @@ AC_ARG_ENABLE([hardening],
[use_hardening=$enableval],
[use_hardening=yes])
+AC_ARG_ENABLE([reduce-exports],
+ [AS_HELP_STRING([--enable-reduce-exports],
+ [attempt to reduce exported symbols in the resulting executables (default is yes)])],
+ [use_reduce_exports=$enableval],
+ [use_reduce_exports=auto])
+
AC_ARG_ENABLE([ccache],
[AS_HELP_STRING([--enable-ccache],
[use ccache for building (default is yes if ccache is found)])],
@@ -396,6 +402,36 @@ AC_TRY_COMPILE([#include <sys/socket.h>],
AC_SEARCH_LIBS([clock_gettime],[rt])
+AC_MSG_CHECKING([for visibility attribute])
+AC_LINK_IFELSE([AC_LANG_SOURCE([
+ int foo_def( void ) __attribute__((visibility("default")));
+ int main(){}
+ ])],
+ [
+ AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE,1,[Define if the visibility attribute is supported.])
+ AC_MSG_RESULT(yes)
+ ],
+ [
+ AC_MSG_RESULT(no)
+ if test x$use_reduce_exports = xyes; then
+ AC_MSG_ERROR([Cannot find a working visibility attribute. Use --disable-reduced-exports.])
+ fi
+ AC_MSG_WARN([Cannot find a working visibility attribute. Disabling reduced exports.])
+ use_reduce_exports=no
+ ]
+)
+
+if test x$use_reduce_exports != xno; then
+ AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[RE_CXXFLAGS="-fvisibility=hidden"],
+ [
+ if test x$use_reduce_exports = xyes; then
+ AC_MSG_ERROR([Cannot set default symbol visibility. Use --disable-reduced-exports.])
+ fi
+ AC_MSG_WARN([Cannot set default symbol visibility. Disabling reduced exports.])
+ use_reduce_exports=no
+ ])
+fi
+
LEVELDB_CPPFLAGS=
LIBLEVELDB=
LIBMEMENV=
@@ -426,6 +462,40 @@ AX_BOOST_PROGRAM_OPTIONS
AX_BOOST_THREAD
AX_BOOST_CHRONO
+
+if test x$use_reduce_exports != xno; then
+ AC_MSG_CHECKING([for working boost reduced exports])
+ TEMP_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
+ AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[
+ @%:@include <boost/version.hpp>
+ ]], [[
+ #if BOOST_VERSION >= 104900
+ // Everything is okay
+ #else
+ # error Boost version is too old
+ #endif
+ ]])],[
+ AC_MSG_RESULT(yes)
+ ],[:
+ if test x$use_reduce_exports = xauto; then
+ use_reduce_exports=no
+ else
+ if test x$use_reduce_exports = xyes; then
+ AC_MSG_ERROR([boost versions < 1.49 are known to be broken with reduced exports. Use --disable-reduced-exports.])
+ fi
+ fi
+ AC_MSG_RESULT(no)
+ AC_MSG_WARN([boost versions < 1.49 are known to have symbol visibility issues. Disabling reduced exports.])
+ ])
+ CPPFLAGS="$TEMP_CPPFLAGS"
+fi
+
+if test x$use_reduce_exports != xno; then
+ CXXFLAGS="$CXXFLAGS $RE_CXXFLAGS"
+ AX_CHECK_LINK_FLAG([[-Wl,--exclude-libs,ALL]], [RELDFLAGS="-Wl,--exclude-libs,ALL"])
+fi
+
if test x$use_tests = xyes; then
if test x$HEXDUMP = x; then
@@ -672,6 +742,13 @@ else
AC_MSG_RESULT([no])
fi
+AC_MSG_CHECKING([whether to reduce exports])
+if test x$use_reduce_exports != xno; then
+ AC_MSG_RESULT([yes])
+else
+ AC_MSG_RESULT([no])
+fi
+
if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then
AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-daemon --with-gui or --enable-tests])
fi
@@ -704,6 +781,7 @@ AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE)
AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR)
+AC_SUBST(RELDFLAGS)
AC_SUBST(LIBTOOL_LDFLAGS)
AC_SUBST(USE_UPNP)
AC_SUBST(USE_QRCODE)
diff --git a/src/Makefile.am b/src/Makefile.am
index 9a8aeabddf..6c67dee7d5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -262,6 +262,7 @@ endif
bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS)
bitcoind_CPPFLAGS = $(BITCOIN_INCLUDES)
+bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS)
# bitcoin-cli binary #
bitcoin_cli_LDADD = \
@@ -299,10 +300,12 @@ endif
bitcoin_tx_SOURCES = bitcoin-tx.cpp
bitcoin_tx_CPPFLAGS = $(BITCOIN_INCLUDES)
#
+bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS)
if TARGET_WINDOWS
bitcoin_cli_SOURCES += bitcoin-cli-res.rc
endif
+bitcoin_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS)
CLEANFILES = leveldb/libleveldb.a leveldb/libmemenv.a *.gcda *.gcno
diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include
index 9a333d5c76..28d7053fc4 100644
--- a/src/Makefile.qt.include
+++ b/src/Makefile.qt.include
@@ -362,7 +362,7 @@ qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL)
if USE_LIBSECP256K1
qt_bitcoin_qt_LDADD += secp256k1/libsecp256k1.la
endif
-qt_bitcoin_qt_LDFLAGS = $(AM_LDFLAGS) $(QT_LDFLAGS)
+qt_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS)
#locale/foo.ts -> locale/foo.qm
QT_QM=$(QT_TS:.ts=.qm)
diff --git a/src/Makefile.qttest.include b/src/Makefile.qttest.include
index ee8edb994e..2cba5b7e1e 100644
--- a/src/Makefile.qttest.include
+++ b/src/Makefile.qttest.include
@@ -36,7 +36,7 @@ qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBIT
if USE_LIBSECP256K1
qt_test_test_bitcoin_qt_LDADD += secp256k1/libsecp256k1.la
endif
-qt_test_test_bitcoin_qt_LDFLAGS = $(AM_LDFLAGS) $(QT_LDFLAGS)
+qt_test_test_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS)
CLEAN_BITCOIN_QT_TEST = $(TEST_QT_MOC_CPP) qt/test/*.gcda qt/test/*.gcno
diff --git a/src/Makefile.test.include b/src/Makefile.test.include
index b5fee08223..b54c9be664 100644
--- a/src/Makefile.test.include
+++ b/src/Makefile.test.include
@@ -75,6 +75,7 @@ if USE_LIBSECP256K1
endif
test_test_bitcoin_LDADD += $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS)
+test_test_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS)
nodist_test_test_bitcoin_SOURCES = $(GENERATED_TEST_FILES)