Рекомендации по поиску расширений видимости символов в autoconf

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


person bdonlan    schedule 13.05.2011    source источник


Ответы (3)


Я не думаю, что для этого существует стандартный макрос, но вот что-то, что вы должны иметь возможность расширить для поддержки других компиляторов по мере необходимости, например. __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
person samplebias    schedule 14.05.2011

Для -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
person rurban    schedule 02.06.2018
comment
Разве это не определит HAVE_ATTRIBUTE_VISIBILITY_DEFAULT на Cygwin и MinGW? - person yugr; 02.06.2018
comment
Югр: ты прав, хороший улов. Там нужно использовать declspec. Но я делаю это в своем заголовке перед проверкой HAVE_ATTRIBUTE_VISIBILITY_DEFAULT. - person rurban; 02.06.2018
comment
IIRC, атрибут видимости был добавлен в GCC 4.0, а более старые версии выдают предупреждение только при обнаружении неподдерживаемого атрибута. Поэтому вы должны скомпилировать с -Werror. - person nwellnhof; 26.06.2020

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

person Baligh    schedule 11.02.2016
comment
Там нет __hidden, по крайней мере, в Ubuntu 16.04. И я не смог найти его в исходном коде Glibc. - person yugr; 14.05.2018