summaryrefslogtreecommitdiffstats
path: root/m4/visibility.m4
diff options
context:
space:
mode:
Diffstat (limited to 'm4/visibility.m4')
-rw-r--r--m4/visibility.m4140
1 files changed, 140 insertions, 0 deletions
diff --git a/m4/visibility.m4 b/m4/visibility.m4
new file mode 100644
index 0000000..48188cd
--- /dev/null
+++ b/m4/visibility.m4
@@ -0,0 +1,140 @@
+AC_DEFUN([SUDO_SYMBOL_VISIBILITY], [
+ dnl
+ dnl Check for symbol visibility support.
+ dnl This test relies on AC_LANG_WERROR
+ dnl
+ if test -n "$GCC"; then
+ AX_CHECK_COMPILE_FLAG([-fvisibility=hidden], [
+ AC_DEFINE(HAVE_DSO_VISIBILITY)
+ AX_APPEND_FLAG([-fvisibility=hidden], [CFLAGS])
+ LT_LDEXPORTS=
+ LT_LDDEP=
+ ])
+ else
+ case "$host_os" in
+ hpux*)
+ AX_CHECK_COMPILE_FLAG([-Bhidden_def], [
+ # HP-UX cc may not allow __declspec(dllexport) to be
+ # used in conjunction with #pragma HP_DEFINED_EXTERNAL
+ # when redefining standard libc functions.
+ AC_CACHE_CHECK([whether __declspec(dllexport) can be used when overriding libc functions],
+ [sudo_cv_var_hpux_declspec_libc_function],
+ [
+ _CFLAGS="$CFLAGS"
+ CFLAGS="${CFLAGS} -Bhidden_def"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <stdlib.h>
+ __declspec(dllexport) char * getenv(const char *n) { return NULL; }]])], [
+ sudo_cv_var_hpux_declspec_libc_function=yes
+ ], [
+ sudo_cv_var_hpux_declspec_libc_function=no
+ ])
+ CFLAGS="$_CFLAGS"
+ ]
+ )
+ if test "$sudo_cv_var_hpux_declspec_libc_function" = "yes"; then
+ AC_DEFINE(HAVE_DSO_VISIBILITY)
+ AX_APPEND_FLAG([-Bhidden_def], [CFLAGS])
+ LT_LDEXPORTS=
+ LT_LDDEP=
+ fi
+ ])
+ ;;
+ solaris2*)
+ AX_CHECK_COMPILE_FLAG([-xldscope=hidden], [
+ AC_DEFINE(HAVE_DSO_VISIBILITY)
+ AX_APPEND_FLAG([-xldscope=hidden], [CFLAGS])
+ LT_LDEXPORTS=
+ LT_LDDEP=
+ ])
+ ;;
+ esac
+ fi
+
+ dnl
+ dnl Check whether ld supports version scripts (most ELF linkers).
+ dnl If possible, we use this even if the compiler has symbol visibility
+ dnl support so we will notice mismatches between the exports file and
+ dnl sudo_dso_public annotations in the source code.
+ dnl This test relies on AC_LANG_WERROR
+ dnl
+ if test "$lt_cv_prog_gnu_ld" = "yes"; then
+ AC_CACHE_CHECK([whether ld supports anonymous map files],
+ [sudo_cv_var_gnu_ld_anon_map],
+ [
+ sudo_cv_var_gnu_ld_anon_map=no
+ cat > conftest.map <<-EOF
+ {
+ global: foo;
+ local: *;
+ };
+ EOF
+ _CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $lt_prog_compiler_pic"
+ _LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_prog_compiler_pic -shared -Wl,--version-script,./conftest.map"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foo;]], [[]])],
+ [sudo_cv_var_gnu_ld_anon_map=yes])
+ CFLAGS="$_CFLAGS"
+ LDFLAGS="$_LDFLAGS"
+ rm -f conftest.map
+ ]
+ )
+ if test "$sudo_cv_var_gnu_ld_anon_map" = "yes"; then
+ LT_LDDEP="\$(shlib_map)"; LT_LDEXPORTS="-Wl,--version-script,\$(shlib_map)"
+ fi
+ else
+ case "$host_os" in
+ solaris2*)
+ AC_CACHE_CHECK([whether ld supports anonymous map files],
+ [sudo_cv_var_solaris_ld_anon_map],
+ [
+ sudo_cv_var_solaris_ld_anon_map=no
+ cat > conftest.map <<-EOF
+ {
+ global: foo;
+ local: *;
+ };
+ EOF
+ _CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $lt_prog_compiler_pic"
+ _LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -shared -Wl,-M,./conftest.map"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foo;]], [[]])],
+ [sudo_cv_var_solaris_ld_anon_map=yes])
+ CFLAGS="$_CFLAGS"
+ LDFLAGS="$_LDFLAGS"
+ rm -f conftest.map
+ ]
+ )
+ if test "$sudo_cv_var_solaris_ld_anon_map" = "yes"; then
+ LT_LDDEP="\$(shlib_map)"; LT_LDEXPORTS="-Wl,-M,\$(shlib_map)"
+ fi
+ ;;
+ hpux*)
+ AC_CACHE_CHECK([whether ld supports controlling exported symbols],
+ [sudo_cv_var_hpux_ld_symbol_export],
+ [
+ sudo_cv_var_hpux_ld_symbol_export=no
+ echo "+e foo" > conftest.opt
+ _CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $lt_prog_compiler_pic"
+ _LDFLAGS="$LDFLAGS"
+ if test -n "$GCC"; then
+ LDFLAGS="$LDFLAGS -shared -Wl,-c,./conftest.opt"
+ else
+ LDFLAGS="$LDFLAGS -b -Wl,-c,./conftest.opt"
+ fi
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foo;]], [[]])],
+ [sudo_cv_var_hpux_ld_symbol_export=yes])
+ CFLAGS="$_CFLAGS"
+ LDFLAGS="$_LDFLAGS"
+ rm -f conftest.opt
+ ]
+ )
+ if test "$sudo_cv_var_hpux_ld_symbol_export" = "yes"; then
+ LT_LDDEP="\$(shlib_opt)"; LT_LDEXPORTS="-Wl,-c,\$(shlib_opt)"
+ fi
+ ;;
+ esac
+ fi
+])