1# mmap(2) blacklisting. Some platforms provide the mmap library routine 2# but don't support all of the features we need from it. 3AC_DEFUN([AC_FUNC_MMAP_BLACKLIST], 4[ 5AC_CHECK_HEADER([sys/mman.h], 6 [libffi_header_sys_mman_h=yes], [libffi_header_sys_mman_h=no]) 7AC_CHECK_FUNC([mmap], [libffi_func_mmap=yes], [libffi_func_mmap=no]) 8if test "$libffi_header_sys_mman_h" != yes \ 9 || test "$libffi_func_mmap" != yes; then 10 ac_cv_func_mmap_file=no 11 ac_cv_func_mmap_dev_zero=no 12 ac_cv_func_mmap_anon=no 13else 14 AC_CACHE_CHECK([whether read-only mmap of a plain file works], 15 ac_cv_func_mmap_file, 16 [# Add a system to this blacklist if 17 # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a 18 # memory area containing the same data that you'd get if you applied 19 # read() to the same fd. The only system known to have a problem here 20 # is VMS, where text files have record structure. 21 case "$host_os" in 22 vms* | ultrix*) 23 ac_cv_func_mmap_file=no ;; 24 *) 25 ac_cv_func_mmap_file=yes;; 26 esac]) 27 AC_CACHE_CHECK([whether mmap from /dev/zero works], 28 ac_cv_func_mmap_dev_zero, 29 [# Add a system to this blacklist if it has mmap() but /dev/zero 30 # does not exist, or if mmapping /dev/zero does not give anonymous 31 # zeroed pages with both the following properties: 32 # 1. If you map N consecutive pages in with one call, and then 33 # unmap any subset of those pages, the pages that were not 34 # explicitly unmapped remain accessible. 35 # 2. If you map two adjacent blocks of memory and then unmap them 36 # both at once, they must both go away. 37 # Systems known to be in this category are Windows (all variants), 38 # VMS, and Darwin. 39 case "$host_os" in 40 vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00) 41 ac_cv_func_mmap_dev_zero=no ;; 42 *) 43 ac_cv_func_mmap_dev_zero=yes;; 44 esac]) 45 46 # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for. 47 AC_CACHE_CHECK([for MAP_ANON(YMOUS)], ac_cv_decl_map_anon, 48 [AC_TRY_COMPILE( 49[#include <sys/types.h> 50#include <sys/mman.h> 51#include <unistd.h> 52 53#ifndef MAP_ANONYMOUS 54#define MAP_ANONYMOUS MAP_ANON 55#endif 56], 57[int n = MAP_ANONYMOUS;], 58 ac_cv_decl_map_anon=yes, 59 ac_cv_decl_map_anon=no)]) 60 61 if test $ac_cv_decl_map_anon = no; then 62 ac_cv_func_mmap_anon=no 63 else 64 AC_CACHE_CHECK([whether mmap with MAP_ANON(YMOUS) works], 65 ac_cv_func_mmap_anon, 66 [# Add a system to this blacklist if it has mmap() and MAP_ANON or 67 # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) 68 # doesn't give anonymous zeroed pages with the same properties listed 69 # above for use of /dev/zero. 70 # Systems known to be in this category are Windows, VMS, and SCO Unix. 71 case "$host_os" in 72 vms* | cygwin* | pe | mingw* | sco* | udk* ) 73 ac_cv_func_mmap_anon=no ;; 74 *) 75 ac_cv_func_mmap_anon=yes;; 76 esac]) 77 fi 78fi 79 80if test $ac_cv_func_mmap_file = yes; then 81 AC_DEFINE(HAVE_MMAP_FILE, 1, 82 [Define if read-only mmap of a plain file works.]) 83fi 84if test $ac_cv_func_mmap_dev_zero = yes; then 85 AC_DEFINE(HAVE_MMAP_DEV_ZERO, 1, 86 [Define if mmap of /dev/zero works.]) 87fi 88if test $ac_cv_func_mmap_anon = yes; then 89 AC_DEFINE(HAVE_MMAP_ANON, 1, 90 [Define if mmap with MAP_ANON(YMOUS) works.]) 91fi 92]) 93 94dnl ---------------------------------------------------------------------- 95dnl This whole bit snagged from libstdc++-v3, via libatomic. 96 97dnl 98dnl LIBFFI_ENABLE 99dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING) 100dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c) 101dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER) 102dnl 103dnl See docs/html/17_intro/configury.html#enable for documentation. 104dnl 105m4_define([LIBFFI_ENABLE],[dnl 106m4_define([_g_switch],[--enable-$1])dnl 107m4_define([_g_help],[AC_HELP_STRING(_g_switch$3,[$4 @<:@default=$2@:>@])])dnl 108 AC_ARG_ENABLE($1,_g_help, 109 m4_bmatch([$5], 110 [^permit ], 111 [[ 112 case "$enableval" in 113 m4_bpatsubst([$5],[permit ])) ;; 114 *) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;; 115 dnl Idea for future: generate a URL pointing to 116 dnl "onlinedocs/configopts.html#whatever" 117 esac 118 ]], 119 [^$], 120 [[ 121 case "$enableval" in 122 yes|no) ;; 123 *) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;; 124 esac 125 ]], 126 [[$5]]), 127 [enable_]m4_bpatsubst([$1],-,_)[=][$2]) 128m4_undefine([_g_switch])dnl 129m4_undefine([_g_help])dnl 130]) 131 132dnl 133dnl If GNU ld is in use, check to see if tricky linker opts can be used. If 134dnl the native linker is in use, all variables will be defined to something 135dnl safe (like an empty string). 136dnl 137dnl Defines: 138dnl SECTION_LDFLAGS='-Wl,--gc-sections' if possible 139dnl OPT_LDFLAGS='-Wl,-O1' if possible 140dnl LD (as a side effect of testing) 141dnl Sets: 142dnl with_gnu_ld 143dnl libat_ld_is_gold (possibly) 144dnl libat_gnu_ld_version (possibly) 145dnl 146dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will 147dnl set libat_gnu_ld_version to 12345. Zeros cause problems. 148dnl 149AC_DEFUN([LIBFFI_CHECK_LINKER_FEATURES], [ 150 # If we're not using GNU ld, then there's no point in even trying these 151 # tests. Check for that first. We should have already tested for gld 152 # by now (in libtool), but require it now just to be safe... 153 test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' 154 test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' 155 AC_REQUIRE([AC_PROG_LD]) 156 AC_REQUIRE([AC_PROG_AWK]) 157 158 # The name set by libtool depends on the version of libtool. Shame on us 159 # for depending on an impl detail, but c'est la vie. Older versions used 160 # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on 161 # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually 162 # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't 163 # set (hence we're using an older libtool), then set it. 164 if test x${with_gnu_ld+set} != xset; then 165 if test x${ac_cv_prog_gnu_ld+set} != xset; then 166 # We got through "ac_require(ac_prog_ld)" and still not set? Huh? 167 with_gnu_ld=no 168 else 169 with_gnu_ld=$ac_cv_prog_gnu_ld 170 fi 171 fi 172 173 # Start by getting the version number. I think the libtool test already 174 # does some of this, but throws away the result. 175 libat_ld_is_gold=no 176 if $LD --version 2>/dev/null | grep 'GNU gold'> /dev/null 2>&1; then 177 libat_ld_is_gold=yes 178 fi 179 changequote(,) 180 ldver=`$LD --version 2>/dev/null | 181 sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'` 182 changequote([,]) 183 libat_gnu_ld_version=`echo $ldver | \ 184 $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'` 185 186 # Set --gc-sections. 187 if test "$with_gnu_ld" = "notbroken"; then 188 # GNU ld it is! Joy and bunny rabbits! 189 190 # All these tests are for C++; save the language and the compiler flags. 191 # Need to do this so that g++ won't try to link in libstdc++ 192 ac_test_CFLAGS="${CFLAGS+set}" 193 ac_save_CFLAGS="$CFLAGS" 194 CFLAGS='-x c++ -Wl,--gc-sections' 195 196 # Check for -Wl,--gc-sections 197 # XXX This test is broken at the moment, as symbols required for linking 198 # are now in libsupc++ (not built yet). In addition, this test has 199 # cored on solaris in the past. In addition, --gc-sections doesn't 200 # really work at the moment (keeps on discarding used sections, first 201 # .eh_frame and now some of the glibc sections for iconv). 202 # Bzzzzt. Thanks for playing, maybe next time. 203 AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections]) 204 AC_TRY_RUN([ 205 int main(void) 206 { 207 try { throw 1; } 208 catch (...) { }; 209 return 0; 210 } 211 ], [ac_sectionLDflags=yes],[ac_sectionLDflags=no], [ac_sectionLDflags=yes]) 212 if test "$ac_test_CFLAGS" = set; then 213 CFLAGS="$ac_save_CFLAGS" 214 else 215 # this is the suspicious part 216 CFLAGS='' 217 fi 218 if test "$ac_sectionLDflags" = "yes"; then 219 SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" 220 fi 221 AC_MSG_RESULT($ac_sectionLDflags) 222 fi 223 224 # Set linker optimization flags. 225 if test x"$with_gnu_ld" = x"yes"; then 226 OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" 227 fi 228 229 AC_SUBST(SECTION_LDFLAGS) 230 AC_SUBST(OPT_LDFLAGS) 231]) 232 233 234dnl 235dnl If GNU ld is in use, check to see if tricky linker opts can be used. If 236dnl the native linker is in use, all variables will be defined to something 237dnl safe (like an empty string). 238dnl 239dnl Defines: 240dnl SECTION_LDFLAGS='-Wl,--gc-sections' if possible 241dnl OPT_LDFLAGS='-Wl,-O1' if possible 242dnl LD (as a side effect of testing) 243dnl Sets: 244dnl with_gnu_ld 245dnl libat_ld_is_gold (possibly) 246dnl libat_gnu_ld_version (possibly) 247dnl 248dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will 249dnl set libat_gnu_ld_version to 12345. Zeros cause problems. 250dnl 251AC_DEFUN([LIBFFI_CHECK_LINKER_FEATURES], [ 252 # If we're not using GNU ld, then there's no point in even trying these 253 # tests. Check for that first. We should have already tested for gld 254 # by now (in libtool), but require it now just to be safe... 255 test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' 256 test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' 257 AC_REQUIRE([AC_PROG_LD]) 258 AC_REQUIRE([AC_PROG_AWK]) 259 260 # The name set by libtool depends on the version of libtool. Shame on us 261 # for depending on an impl detail, but c'est la vie. Older versions used 262 # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on 263 # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually 264 # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't 265 # set (hence we're using an older libtool), then set it. 266 if test x${with_gnu_ld+set} != xset; then 267 if test x${ac_cv_prog_gnu_ld+set} != xset; then 268 # We got through "ac_require(ac_prog_ld)" and still not set? Huh? 269 with_gnu_ld=no 270 else 271 with_gnu_ld=$ac_cv_prog_gnu_ld 272 fi 273 fi 274 275 # Start by getting the version number. I think the libtool test already 276 # does some of this, but throws away the result. 277 libat_ld_is_gold=no 278 if $LD --version 2>/dev/null | grep 'GNU gold'> /dev/null 2>&1; then 279 libat_ld_is_gold=yes 280 fi 281 libat_ld_is_lld=no 282 if $LD --version 2>/dev/null | grep 'LLD '> /dev/null 2>&1; then 283 libat_ld_is_lld=yes 284 fi 285 changequote(,) 286 ldver=`$LD --version 2>/dev/null | 287 sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'` 288 changequote([,]) 289 libat_gnu_ld_version=`echo $ldver | \ 290 $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'` 291 292 # Set --gc-sections. 293 if test "$with_gnu_ld" = "notbroken"; then 294 # GNU ld it is! Joy and bunny rabbits! 295 296 # All these tests are for C++; save the language and the compiler flags. 297 # Need to do this so that g++ won't try to link in libstdc++ 298 ac_test_CFLAGS="${CFLAGS+set}" 299 ac_save_CFLAGS="$CFLAGS" 300 CFLAGS='-x c++ -Wl,--gc-sections' 301 302 # Check for -Wl,--gc-sections 303 # XXX This test is broken at the moment, as symbols required for linking 304 # are now in libsupc++ (not built yet). In addition, this test has 305 # cored on solaris in the past. In addition, --gc-sections doesn't 306 # really work at the moment (keeps on discarding used sections, first 307 # .eh_frame and now some of the glibc sections for iconv). 308 # Bzzzzt. Thanks for playing, maybe next time. 309 AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections]) 310 AC_TRY_RUN([ 311 int main(void) 312 { 313 try { throw 1; } 314 catch (...) { }; 315 return 0; 316 } 317 ], [ac_sectionLDflags=yes],[ac_sectionLDflags=no], [ac_sectionLDflags=yes]) 318 if test "$ac_test_CFLAGS" = set; then 319 CFLAGS="$ac_save_CFLAGS" 320 else 321 # this is the suspicious part 322 CFLAGS='' 323 fi 324 if test "$ac_sectionLDflags" = "yes"; then 325 SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" 326 fi 327 AC_MSG_RESULT($ac_sectionLDflags) 328 fi 329 330 # Set linker optimization flags. 331 if test x"$with_gnu_ld" = x"yes"; then 332 OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" 333 fi 334 335 AC_SUBST(SECTION_LDFLAGS) 336 AC_SUBST(OPT_LDFLAGS) 337]) 338 339 340dnl 341dnl Add version tags to symbols in shared library (or not), additionally 342dnl marking other symbols as private/local (or not). 343dnl 344dnl --enable-symvers=style adds a version script to the linker call when 345dnl creating the shared library. The choice of version script is 346dnl controlled by 'style'. 347dnl --disable-symvers does not. 348dnl + Usage: LIBFFI_ENABLE_SYMVERS[(DEFAULT)] 349dnl Where DEFAULT is either 'yes' or 'no'. Passing `yes' tries to 350dnl choose a default style based on linker characteristics. Passing 351dnl 'no' disables versioning. 352dnl 353AC_DEFUN([LIBFFI_ENABLE_SYMVERS], [ 354 355LIBFFI_ENABLE(symvers,yes,[=STYLE], 356 [enables symbol versioning of the shared library], 357 [permit yes|no|gnu*|sun]) 358 359# If we never went through the LIBFFI_CHECK_LINKER_FEATURES macro, then we 360# don't know enough about $LD to do tricks... 361AC_REQUIRE([LIBFFI_CHECK_LINKER_FEATURES]) 362 363# Turn a 'yes' into a suitable default. 364if test x$enable_symvers = xyes ; then 365 # FIXME The following test is too strict, in theory. 366 if test $enable_shared = no || test "x$LD" = x; then 367 enable_symvers=no 368 else 369 if test $with_gnu_ld = yes ; then 370 enable_symvers=gnu 371 else 372 case ${target_os} in 373 # Sun symbol versioning exists since Solaris 2.5. 374 solaris2.[[5-9]]* | solaris2.1[[0-9]]*) 375 enable_symvers=sun ;; 376 *) 377 enable_symvers=no ;; 378 esac 379 fi 380 fi 381fi 382 383# Check if 'sun' was requested on non-Solaris 2 platforms. 384if test x$enable_symvers = xsun ; then 385 case ${target_os} in 386 solaris2*) 387 # All fine. 388 ;; 389 *) 390 # Unlikely to work. 391 AC_MSG_WARN([=== You have requested Sun symbol versioning, but]) 392 AC_MSG_WARN([=== you are not targetting Solaris 2.]) 393 AC_MSG_WARN([=== Symbol versioning will be disabled.]) 394 enable_symvers=no 395 ;; 396 esac 397fi 398 399# Check to see if libgcc_s exists, indicating that shared libgcc is possible. 400if test $enable_symvers != no; then 401 AC_MSG_CHECKING([for shared libgcc]) 402 ac_save_CFLAGS="$CFLAGS" 403 CFLAGS=' -lgcc_s' 404 AC_TRY_LINK(, [return 0;], libat_shared_libgcc=yes, libat_shared_libgcc=no) 405 CFLAGS="$ac_save_CFLAGS" 406 if test $libat_shared_libgcc = no; then 407 cat > conftest.c <<EOF 408int main (void) { return 0; } 409EOF 410changequote(,)dnl 411 libat_libgcc_s_suffix=`${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \ 412 -shared -shared-libgcc -o conftest.so \ 413 conftest.c -v 2>&1 >/dev/null \ 414 | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'` 415changequote([,])dnl 416 rm -f conftest.c conftest.so 417 if test x${libat_libgcc_s_suffix+set} = xset; then 418 CFLAGS=" -lgcc_s$libat_libgcc_s_suffix" 419 AC_TRY_LINK(, [return 0;], libat_shared_libgcc=yes) 420 CFLAGS="$ac_save_CFLAGS" 421 fi 422 fi 423 AC_MSG_RESULT($libat_shared_libgcc) 424fi 425 426# For GNU ld, we need at least this version. The format is described in 427# LIBFFI_CHECK_LINKER_FEATURES above. 428libat_min_gnu_ld_version=21400 429# XXXXXXXXXXX libat_gnu_ld_version=21390 430 431# Check to see if unspecified "yes" value can win, given results above. 432# Change "yes" into either "no" or a style name. 433if test $enable_symvers != no && test $libat_shared_libgcc = yes; then 434 if test $with_gnu_ld = yes; then 435 if test $libat_gnu_ld_version -ge $libat_min_gnu_ld_version ; then 436 enable_symvers=gnu 437 elif test $libat_ld_is_gold = yes ; then 438 enable_symvers=gnu 439 elif test $libat_ld_is_lld = yes ; then 440 enable_symvers=gnu 441 else 442 # The right tools, the right setup, but too old. Fallbacks? 443 AC_MSG_WARN(=== Linker version $libat_gnu_ld_version is too old for) 444 AC_MSG_WARN(=== full symbol versioning support in this release of GCC.) 445 AC_MSG_WARN(=== You would need to upgrade your binutils to version) 446 AC_MSG_WARN(=== $libat_min_gnu_ld_version or later and rebuild GCC.) 447 if test $libat_gnu_ld_version -ge 21200 ; then 448 # Globbing fix is present, proper block support is not. 449 dnl AC_MSG_WARN([=== Dude, you are soooo close. Maybe we can fake it.]) 450 dnl enable_symvers=??? 451 AC_MSG_WARN([=== Symbol versioning will be disabled.]) 452 enable_symvers=no 453 else 454 # 2.11 or older. 455 AC_MSG_WARN([=== Symbol versioning will be disabled.]) 456 enable_symvers=no 457 fi 458 fi 459 elif test $enable_symvers = sun; then 460 : All interesting versions of Sun ld support sun style symbol versioning. 461 else 462 # just fail for now 463 AC_MSG_WARN([=== You have requested some kind of symbol versioning, but]) 464 AC_MSG_WARN([=== either you are not using a supported linker, or you are]) 465 AC_MSG_WARN([=== not building a shared libgcc_s (which is required).]) 466 AC_MSG_WARN([=== Symbol versioning will be disabled.]) 467 enable_symvers=no 468 fi 469fi 470if test $enable_symvers = gnu; then 471 AC_DEFINE(LIBFFI_GNU_SYMBOL_VERSIONING, 1, 472 [Define to 1 if GNU symbol versioning is used for libatomic.]) 473fi 474 475AM_CONDITIONAL(LIBFFI_BUILD_VERSIONED_SHLIB, test $enable_symvers != no) 476AM_CONDITIONAL(LIBFFI_BUILD_VERSIONED_SHLIB_GNU, test $enable_symvers = gnu) 477AM_CONDITIONAL(LIBFFI_BUILD_VERSIONED_SHLIB_SUN, test $enable_symvers = sun) 478AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers) 479]) 480