Лучшие практики для исследования расширений видимости символов в autoconf - PullRequest
3 голосов
/ 13 мая 2011

Я хотел бы добавить скрытие символов для внутренних символов в существующую библиотеку с системой сборки на основе autoconf. Какой лучший способ проверить эквивалент локального компилятора для -fvisibility=hidden и __attribute__ ((visibility("default")))?

Ответы [ 3 ]

4 голосов
/ 14 мая 2011

Я не думаю, что есть стандартный макрос для этого, но вот кое-что, что вы должны иметь возможность расширять для поддержки других компиляторов по мере необходимости, например, __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
0 голосов
/ 02 июня 2018

Для -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
0 голосов
/ 11 февраля 2016

Вы можете попробовать использовать <sys/cdefs.h> с макросом __hiden

...