簡體   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