[英]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.