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

发布于 2024-11-07 03:10:17 字数 155 浏览 8 评论 0原文

我想使用基于 autoconf 的构建系统将内部符号的符号隐藏添加到现有库中。探测 -fvisibility=hidden__attribute__ ((visibility("default"))) 的本地编译器等效项的最佳方法是什么?

I'd like to add symbol hiding for internal symbols to an existing library with an autoconf-based build system. What's the best way to probe for the local compiler's equivalent for -fvisibility=hidden and __attribute__ ((visibility("default")))?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

葮薆情 2024-11-14 03:10:17

我认为没有一个标准的宏,但是您应该能够根据需要扩展它以支持其他编译器,例如 Sun 编译器的 __hidden

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

I don't think there is a standard macro for this, but here is something which you should be able to extend to support other compilers as needed, e.g. __hidden for Sun compilers:

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

The resulting config.h:

/* Define if __attribute__((visibility("hidden"))) is supported. */
#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1
心房敞 2024-11-14 03:10:17

对于 -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

For -fvisibility=hidden I use this autoconf-archive macro:

AX_COMPILER_FLAGS([AM_CFLAGS],[AM_LDFLAGS],[$ax_is_release],[-fvisibility=hidden])

See https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html,
but https://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html or http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html can also be used. AX_COMPILER_FLAGS does most of what you'll need regarding warnings flags also. For the $ax_is_release see AX_IS_RELEASE also there.

For the attribute I use this check:

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
沙沙粒小 2024-11-14 03:10:17

您可以尝试将 与宏 __hiden 一起使用

You can try to use <sys/cdefs.h> with macro __hiden

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文