[英]Best practices for probing for symbol visibility extensions in autoconf
我想將內部符號的符號隱藏添加到具有基於autoconf的構建系統的現有庫中。 什么是探測本地編譯器等效的最佳方法-fvisibility=hidden
和__attribute__ ((visibility("default")))
?
我認為沒有一個標准的宏,但是你可以根據需要擴展以支持其他編譯器,例如__hidden
用於Sun編譯器:
AC_CACHE_CHECK([for __attribute__((visibility("hidden")))],
ac_cv_hidden_visibility_attribute, [
echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1; }' > conftest.c
ac_cv_hidden_visibility_attribute=no
if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD);
then
if grep '\.hidden.*foo' conftest.s >/dev/null;
then
ac_cv_hidden_visibility_attribute=yes
fi
fi
rm -f conftest.*
])
if test $ac_cv_hidden_visibility_attribute = yes;
then
AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1,
[Define if __attribute__((visibility("hidden"))) is supported.])
fi
生成的config.h
:
/* Define if __attribute__((visibility("hidden"))) is supported. */
#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1
For -fvisibility=hidden
我使用這個autoconf-archive宏:
AX_COMPILER_FLAGS([AM_CFLAGS],[AM_LDFLAGS],[$ax_is_release],[-fvisibility=hidden])
請參閱https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html ,但https://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html或http://www.gnu。也可以使用org / software / autoconf-archive / ax_gcc_func_attribute.html 。 AX_COMPILER_FLAGS還會針對警告標志執行大部分操作。 對於$ax_is_release
請參見AX_IS_RELEASE
。
對於屬性,我使用此檢查:
AC_CACHE_CHECK([for __attribute__((visibility("default")))],
ac_cv_attribute_visibility_default, [
ac_cv_attribute_visibility_default=no
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[ int __attribute__ ((visibility ("default"))) foo (void) { return 1; } ]], [])],
[ac_cv_attribute_visibility_default=yes])
])
if test x$ac_cv_attribute_visibility_default = xyes;
then
AC_DEFINE(HAVE_ATTRIBUTE_VISIBILITY_DEFAULT, 1,
[Define if __attribute__((visibility("default"))) is supported.])
fi
您可以嘗試使用宏__hiden
<sys/cdefs.h>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.