繁体   English   中英

在autoconf中探测符号可见性扩展的最佳实践

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM