mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
Merge #19522: build: fix building libconsensus with reduced exports for Darwin targets
de4238f92f4c067f099663f68d9772105de81d75 build: consolidate reduced export checks (fanquake) 012bdec1b7df01906566a6526e56f27d57d1653b build: add building libconsensus to end-of-configure output (fanquake) 8f360e349e365870b40a6873917c81de714ae41a build: remove ax_gcc_func_attribute macro (fanquake) f054a089ecfbdc4732e6f705a10e93189074f41c build: remove AX_GCC_FUNC_ATTRIBUTE test for dllimport (fanquake) 7cd0a696643a824ab6f6911278f116f01c5af662 build: test for __declspec(dllexport) in configure (fanquake) 1624e17b5430dfe808bb3b1b79dfa53bf45aa053 build: remove duplicate visibility attribute detection (fanquake) Pull request description: Darwin targets do not have a `protected` visibility function attribute, see [LLVM explanation](8e9a505139/clang/lib/Basic/Targets/OSTargets.h (L131)
). This means that the `AX_GCC_FUNC_ATTRIBUTE` check for `visibility` fails: ```bash configure:24513: checking for __attribute__((visibility)) configure:24537: g++ -std=c++11 -o conftest -g -O2 -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS -DMAC_OSX -DOBJC_OLD_DISPATCH_PROTOTYPES=0 -Wl,-headerpad_max_install_names conftest.cpp >&5 conftest.cpp:35:56: warning: target does not support 'protected' visibility; using 'default' [-Wunsupported-visibility] int foo_pro( void ) __attribute__((visibility("protected"))); ^ 1 warning generated. configure:24537: $? = 0 configure:24550: result: no ``` This leads to `EXPORT_SYMBOL` being [defined to nothing](f4de89edfa/src/script/bitcoinconsensus.h (L29)
), as `HAVE_FUNC_ATTRIBUTE_VISIBILITY` is not defined, and when building with reduced exports, you end up with a libbitcoinconsensus.dylib that doesn't export any `_bitcoinconsensus_*` symbols. ```bash ➜ git:(master) nm -C src/.libs/libbitcoinconsensus.dylib | rg _bitcoinconsensus_ ➜ git:(master) ``` We do have a [second check](f4de89edfa/configure.ac (L882)
) for the `visibility` attribute, which works for Darwin as it's only testing for default visibility, however the result of this check isn't used at all. It was added in #4725, along with the `--enable-reduce-exports` option, however when libbitcoinconsensus was added in #5235, it used the results of the added `AX_GCC_FUNC_ATTRIBUTE` calls. This PR removes our usage of the AX_GCC_FUNC_ATTRIBUTE macro entirely, in favour of our own checks in configure. This meant adding a check for `dllexport`, which I've tested as working with both [GCC](https://gcc.gnu.org/onlinedocs/gcc/Microsoft-Windows-Function-Attributes.html) and [Clang](https://releases.llvm.org/10.0.0/tools/clang/docs/AttributeReference.html#dllexport) when building for Windows. I haven't added an equivalent check for `dllimport`, as we weren't actually using the result of that check, we're just testing that `MSC_VER` was defined before using. With these changes building a libbitcoinconsensus with reduced exports, when targeting Darwin, works as expected: ```bash ./autogen.sh ./configure --disable-tests --disable-bench --with-utils=no --with-daemon=no --with-gui=no --disable-wallet --with-libs=yes --enable-reduce-exports make -j8 ... nm -C src/.libs/libbitcoinconsensus.dylib | rg _bitcoinconsensus_ 000000000000a340 T _bitcoinconsensus_verify_script 00000000000097e0 T _bitcoinconsensus_verify_script_with_amount 000000000000a3c0 T _bitcoinconsensus_version ``` ```python >>> import ctypes >>> consensus = ctypes.CDLL("src/.libs/libbitcoinconsensus.dylib") >>> print(consensus.bitcoinconsensus_version()) 1 >>> exit() ``` TODO: Modify a CI job to compile with --enable-reduce-exports and check for symbols in shared lib? ACKs for top commit: laanwj: Code review ACK de4238f92f4c067f099663f68d9772105de81d75 Tree-SHA512: d148f3c55d14dac6e9e5b718cc65bb557bcf6f663218d24bc9044b86281bd5dd3d931ebea79c336a58e8ed50d683218c0a9e75494f2267b91097665043e252ae
This commit is contained in:
parent
88a45d4a9a
commit
318c7263d0
@ -1,223 +0,0 @@
|
|||||||
# ===========================================================================
|
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html
|
|
||||||
# ===========================================================================
|
|
||||||
#
|
|
||||||
# SYNOPSIS
|
|
||||||
#
|
|
||||||
# AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE)
|
|
||||||
#
|
|
||||||
# DESCRIPTION
|
|
||||||
#
|
|
||||||
# This macro checks if the compiler supports one of GCC's function
|
|
||||||
# attributes; many other compilers also provide function attributes with
|
|
||||||
# the same syntax. Compiler warnings are used to detect supported
|
|
||||||
# attributes as unsupported ones are ignored by default so quieting
|
|
||||||
# warnings when using this macro will yield false positives.
|
|
||||||
#
|
|
||||||
# The ATTRIBUTE parameter holds the name of the attribute to be checked.
|
|
||||||
#
|
|
||||||
# If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>.
|
|
||||||
#
|
|
||||||
# The macro caches its result in the ax_cv_have_func_attribute_<attribute>
|
|
||||||
# variable.
|
|
||||||
#
|
|
||||||
# The macro currently supports the following function attributes:
|
|
||||||
#
|
|
||||||
# alias
|
|
||||||
# aligned
|
|
||||||
# alloc_size
|
|
||||||
# always_inline
|
|
||||||
# artificial
|
|
||||||
# cold
|
|
||||||
# const
|
|
||||||
# constructor
|
|
||||||
# constructor_priority for constructor attribute with priority
|
|
||||||
# deprecated
|
|
||||||
# destructor
|
|
||||||
# dllexport
|
|
||||||
# dllimport
|
|
||||||
# error
|
|
||||||
# externally_visible
|
|
||||||
# flatten
|
|
||||||
# format
|
|
||||||
# format_arg
|
|
||||||
# gnu_inline
|
|
||||||
# hot
|
|
||||||
# ifunc
|
|
||||||
# leaf
|
|
||||||
# malloc
|
|
||||||
# noclone
|
|
||||||
# noinline
|
|
||||||
# nonnull
|
|
||||||
# noreturn
|
|
||||||
# nothrow
|
|
||||||
# optimize
|
|
||||||
# pure
|
|
||||||
# unused
|
|
||||||
# used
|
|
||||||
# visibility
|
|
||||||
# warning
|
|
||||||
# warn_unused_result
|
|
||||||
# weak
|
|
||||||
# weakref
|
|
||||||
#
|
|
||||||
# Unsuppored function attributes will be tested with a prototype returning
|
|
||||||
# an int and not accepting any arguments and the result of the check might
|
|
||||||
# be wrong or meaningless so use with care.
|
|
||||||
#
|
|
||||||
# LICENSE
|
|
||||||
#
|
|
||||||
# Copyright (c) 2013 Gabriele Svelto <gabriele.svelto@gmail.com>
|
|
||||||
#
|
|
||||||
# Copying and distribution of this file, with or without modification, are
|
|
||||||
# permitted in any medium without royalty provided the copyright notice
|
|
||||||
# and this notice are preserved. This file is offered as-is, without any
|
|
||||||
# warranty.
|
|
||||||
|
|
||||||
#serial 3
|
|
||||||
|
|
||||||
AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
|
|
||||||
AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1])
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([
|
|
||||||
m4_case([$1],
|
|
||||||
[alias], [
|
|
||||||
int foo( void ) { return 0; }
|
|
||||||
int bar( void ) __attribute__(($1("foo")));
|
|
||||||
],
|
|
||||||
[aligned], [
|
|
||||||
int foo( void ) __attribute__(($1(32)));
|
|
||||||
],
|
|
||||||
[alloc_size], [
|
|
||||||
void *foo(int a) __attribute__(($1(1)));
|
|
||||||
],
|
|
||||||
[always_inline], [
|
|
||||||
inline __attribute__(($1)) int foo( void ) { return 0; }
|
|
||||||
],
|
|
||||||
[artificial], [
|
|
||||||
inline __attribute__(($1)) int foo( void ) { return 0; }
|
|
||||||
],
|
|
||||||
[cold], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[const], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[constructor_priority], [
|
|
||||||
int foo( void ) __attribute__((__constructor__(65535/2)));
|
|
||||||
],
|
|
||||||
[constructor], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[deprecated], [
|
|
||||||
int foo( void ) __attribute__(($1("")));
|
|
||||||
],
|
|
||||||
[destructor], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[dllexport], [
|
|
||||||
__attribute__(($1)) int foo( void ) { return 0; }
|
|
||||||
],
|
|
||||||
[dllimport], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[error], [
|
|
||||||
int foo( void ) __attribute__(($1("")));
|
|
||||||
],
|
|
||||||
[externally_visible], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[flatten], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[format], [
|
|
||||||
int foo(const char *p, ...) __attribute__(($1(printf, 1, 2)));
|
|
||||||
],
|
|
||||||
[format_arg], [
|
|
||||||
char *foo(const char *p) __attribute__(($1(1)));
|
|
||||||
],
|
|
||||||
[gnu_inline], [
|
|
||||||
inline __attribute__(($1)) int foo( void ) { return 0; }
|
|
||||||
],
|
|
||||||
[hot], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[ifunc], [
|
|
||||||
int my_foo( void ) { return 0; }
|
|
||||||
static int (*resolve_foo(void))(void) { return my_foo; }
|
|
||||||
int foo( void ) __attribute__(($1("resolve_foo")));
|
|
||||||
],
|
|
||||||
[leaf], [
|
|
||||||
__attribute__(($1)) int foo( void ) { return 0; }
|
|
||||||
],
|
|
||||||
[malloc], [
|
|
||||||
void *foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[noclone], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[noinline], [
|
|
||||||
__attribute__(($1)) int foo( void ) { return 0; }
|
|
||||||
],
|
|
||||||
[nonnull], [
|
|
||||||
int foo(char *p) __attribute__(($1(1)));
|
|
||||||
],
|
|
||||||
[noreturn], [
|
|
||||||
void foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[nothrow], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[optimize], [
|
|
||||||
__attribute__(($1(3))) int foo( void ) { return 0; }
|
|
||||||
],
|
|
||||||
[pure], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[unused], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[used], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[visibility], [
|
|
||||||
int foo_def( void ) __attribute__(($1("default")));
|
|
||||||
int foo_hid( void ) __attribute__(($1("hidden")));
|
|
||||||
int foo_int( void ) __attribute__(($1("internal")));
|
|
||||||
int foo_pro( void ) __attribute__(($1("protected")));
|
|
||||||
],
|
|
||||||
[warning], [
|
|
||||||
int foo( void ) __attribute__(($1("")));
|
|
||||||
],
|
|
||||||
[warn_unused_result], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[weak], [
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
],
|
|
||||||
[weakref], [
|
|
||||||
static int foo( void ) { return 0; }
|
|
||||||
static int bar( void ) __attribute__(($1("foo")));
|
|
||||||
],
|
|
||||||
[
|
|
||||||
m4_warn([syntax], [Unsupported attribute $1, the test may fail])
|
|
||||||
int foo( void ) __attribute__(($1));
|
|
||||||
]
|
|
||||||
)], [])
|
|
||||||
],
|
|
||||||
dnl GCC doesn't exit with an error if an unknown attribute is
|
|
||||||
dnl provided but only outputs a warning, so accept the attribute
|
|
||||||
dnl only if no warning were issued.
|
|
||||||
[AS_IF([test -s conftest.err],
|
|
||||||
[AS_VAR_SET([ac_var], [no])],
|
|
||||||
[AS_VAR_SET([ac_var], [yes])])],
|
|
||||||
[AS_VAR_SET([ac_var], [no])])
|
|
||||||
])
|
|
||||||
|
|
||||||
AS_IF([test yes = AS_VAR_GET([ac_var])],
|
|
||||||
[AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1,
|
|
||||||
[Define to 1 if the system has the `$1' function attribute])], [])
|
|
||||||
|
|
||||||
AS_VAR_POPDEF([ac_var])
|
|
||||||
])
|
|
35
configure.ac
35
configure.ac
@ -913,10 +913,6 @@ if test x$ac_cv_sys_large_files != x &&
|
|||||||
CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=$ac_cv_sys_large_files"
|
CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=$ac_cv_sys_large_files"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AX_GCC_FUNC_ATTRIBUTE([visibility])
|
|
||||||
AX_GCC_FUNC_ATTRIBUTE([dllexport])
|
|
||||||
AX_GCC_FUNC_ATTRIBUTE([dllimport])
|
|
||||||
|
|
||||||
AC_SEARCH_LIBS([clock_gettime],[rt])
|
AC_SEARCH_LIBS([clock_gettime],[rt])
|
||||||
|
|
||||||
if test "x$enable_gprof" = xyes; then
|
if test "x$enable_gprof" = xyes; then
|
||||||
@ -1078,13 +1074,13 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
|||||||
[ AC_MSG_RESULT(no)]
|
[ AC_MSG_RESULT(no)]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_MSG_CHECKING([for visibility attribute])
|
AC_MSG_CHECKING([for default visibility attribute])
|
||||||
AC_LINK_IFELSE([AC_LANG_SOURCE([
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||||
int foo_def( void ) __attribute__((visibility("default")));
|
int foo(void) __attribute__((visibility("default")));
|
||||||
int main(){}
|
int main(){}
|
||||||
])],
|
])],
|
||||||
[
|
[
|
||||||
AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE,1,[Define if the visibility attribute is supported.])
|
AC_DEFINE(HAVE_DEFAULT_VISIBILITY_ATTRIBUTE,1,[Define if the visibility attribute is supported.])
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@ -1095,6 +1091,18 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for dllexport attribute])
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||||
|
__declspec(dllexport) int foo(void);
|
||||||
|
int main(){}
|
||||||
|
])],
|
||||||
|
[
|
||||||
|
AC_DEFINE(HAVE_DLLEXPORT_ATTRIBUTE,1,[Define if the dllexport attribute is supported.])
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
],
|
||||||
|
[AC_MSG_RESULT(no)]
|
||||||
|
)
|
||||||
|
|
||||||
if test "x$use_thread_local" = xyes || test "x$use_thread_local" = xauto; then
|
if test "x$use_thread_local" = xyes || test "x$use_thread_local" = xauto; then
|
||||||
TEMP_LDFLAGS="$LDFLAGS"
|
TEMP_LDFLAGS="$LDFLAGS"
|
||||||
LDFLAGS="$TEMP_LDFLAGS $PTHREAD_CFLAGS"
|
LDFLAGS="$TEMP_LDFLAGS $PTHREAD_CFLAGS"
|
||||||
@ -1269,12 +1277,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
|||||||
[ AC_MSG_RESULT(no); HAVE_STRONG_GETAUXVAL=0 ]
|
[ AC_MSG_RESULT(no); HAVE_STRONG_GETAUXVAL=0 ]
|
||||||
)
|
)
|
||||||
|
|
||||||
dnl Check for reduced exports
|
|
||||||
if test x$use_reduce_exports = xyes; then
|
|
||||||
AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[RE_CXXFLAGS="-fvisibility=hidden"],
|
|
||||||
[AC_MSG_ERROR([Cannot set default symbol visibility. Use --disable-reduce-exports.])])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for std::system])
|
AC_MSG_CHECKING([for std::system])
|
||||||
AC_LINK_IFELSE(
|
AC_LINK_IFELSE(
|
||||||
[ AC_LANG_PROGRAM(
|
[ AC_LANG_PROGRAM(
|
||||||
@ -1486,8 +1488,10 @@ fi
|
|||||||
BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB"
|
BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl Check for reduced exports
|
||||||
if test x$use_reduce_exports = xyes; then
|
if test x$use_reduce_exports = xyes; then
|
||||||
CXXFLAGS="$CXXFLAGS $RE_CXXFLAGS"
|
AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[CXXFLAGS="$CXXFLAGS -fvisibility=hidden"],
|
||||||
|
[AC_MSG_ERROR([Cannot set hidden symbol visibility. Use --disable-reduce-exports.])],[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_LINK_FLAG([[-Wl,--exclude-libs,ALL]],[RELDFLAGS="-Wl,--exclude-libs,ALL"],,[[$LDFLAG_WERROR]])
|
AX_CHECK_LINK_FLAG([[-Wl,--exclude-libs,ALL]],[RELDFLAGS="-Wl,--exclude-libs,ALL"],,[[$LDFLAG_WERROR]])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -1951,6 +1955,7 @@ echo
|
|||||||
echo "Options used to compile and link:"
|
echo "Options used to compile and link:"
|
||||||
echo " boost process = $with_boost_process"
|
echo " boost process = $with_boost_process"
|
||||||
echo " multiprocess = $build_multiprocess"
|
echo " multiprocess = $build_multiprocess"
|
||||||
|
echo " with libs = $build_bitcoin_libs"
|
||||||
echo " with wallet = $enable_wallet"
|
echo " with wallet = $enable_wallet"
|
||||||
echo " with gui / qt = $bitcoin_enable_qt"
|
echo " with gui / qt = $bitcoin_enable_qt"
|
||||||
if test "x$enable_wallet" != "xno"; then
|
if test "x$enable_wallet" != "xno"; then
|
||||||
|
@ -11,14 +11,12 @@
|
|||||||
#if defined(BUILD_BITCOIN_INTERNAL) && defined(HAVE_CONFIG_H)
|
#if defined(BUILD_BITCOIN_INTERNAL) && defined(HAVE_CONFIG_H)
|
||||||
#include <config/bitcoin-config.h>
|
#include <config/bitcoin-config.h>
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#if defined(DLL_EXPORT)
|
#if defined(HAVE_DLLEXPORT_ATTRIBUTE)
|
||||||
#if defined(HAVE_FUNC_ATTRIBUTE_DLLEXPORT)
|
|
||||||
#define EXPORT_SYMBOL __declspec(dllexport)
|
#define EXPORT_SYMBOL __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
#define EXPORT_SYMBOL
|
#define EXPORT_SYMBOL
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#elif defined(HAVE_DEFAULT_VISIBILITY_ATTRIBUTE)
|
||||||
#elif defined(HAVE_FUNC_ATTRIBUTE_VISIBILITY)
|
|
||||||
#define EXPORT_SYMBOL __attribute__ ((visibility ("default")))
|
#define EXPORT_SYMBOL __attribute__ ((visibility ("default")))
|
||||||
#endif
|
#endif
|
||||||
#elif defined(MSC_VER) && !defined(STATIC_LIBBITCOINCONSENSUS)
|
#elif defined(MSC_VER) && !defined(STATIC_LIBBITCOINCONSENSUS)
|
||||||
|
Loading…
Reference in New Issue
Block a user