mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-30 05:23:49 +08:00
binutils: Add AC_FUNC_MMAP to configure.ac
Add AC_FUNC_MMAP to configure.ac so that HAVE_MMAP will be checked in objdump.c and mmap is used if available. * configure.ac (AC_FUNC_MMAP): New. * config.in: Regenerated. * configure: Likewise.
This commit is contained in:
parent
e8bf1ce461
commit
34156b2386
@ -1,3 +1,9 @@
|
||||
2018-11-02 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* configure.ac (AC_FUNC_MMAP): New.
|
||||
* config.in: Regenerated.
|
||||
* configure: Likewise.
|
||||
|
||||
2018-11-02 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* readelf.c (process_section_headers): Don't warn on a zero
|
||||
|
@ -94,6 +94,9 @@
|
||||
/* Define to 1 if you have the `getc_unlocked' function. */
|
||||
#undef HAVE_GETC_UNLOCKED
|
||||
|
||||
/* Define to 1 if you have the `getpagesize' function. */
|
||||
#undef HAVE_GETPAGESIZE
|
||||
|
||||
/* Does <utime.h> define struct utimbuf? */
|
||||
#undef HAVE_GOOD_UTIME_H
|
||||
|
||||
@ -127,6 +130,9 @@
|
||||
/* Define to 1 if you have the `mkstemp' function. */
|
||||
#undef HAVE_MKSTEMP
|
||||
|
||||
/* Define to 1 if you have a working `mmap' system call. */
|
||||
#undef HAVE_MMAP
|
||||
|
||||
/* Define to 1 if you have the `sbrk' function. */
|
||||
#undef HAVE_SBRK
|
||||
|
||||
|
209
binutils/configure
vendored
209
binutils/configure
vendored
@ -629,6 +629,7 @@ ac_includes_default="\
|
||||
# include <unistd.h>
|
||||
#endif"
|
||||
|
||||
ac_header_list=
|
||||
ac_subst_vars='am__EXEEXT_FALSE
|
||||
am__EXEEXT_TRUE
|
||||
LTLIBOBJS
|
||||
@ -2497,6 +2498,9 @@ $as_echo "$as_me: creating cache $cache_file" >&6;}
|
||||
>$cache_file
|
||||
fi
|
||||
|
||||
as_fn_append ac_header_list " stdlib.h"
|
||||
as_fn_append ac_header_list " unistd.h"
|
||||
as_fn_append ac_header_list " sys/param.h"
|
||||
# Check that the precious variables saved in the cache have kept the same
|
||||
# value.
|
||||
ac_cache_corrupted=false
|
||||
@ -11519,7 +11523,7 @@ else
|
||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||
lt_status=$lt_dlunknown
|
||||
cat > conftest.$ac_ext <<_LT_EOF
|
||||
#line 11522 "configure"
|
||||
#line 11526 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
#if HAVE_DLFCN_H
|
||||
@ -11625,7 +11629,7 @@ else
|
||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||
lt_status=$lt_dlunknown
|
||||
cat > conftest.$ac_ext <<_LT_EOF
|
||||
#line 11628 "configure"
|
||||
#line 11632 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
#if HAVE_DLFCN_H
|
||||
@ -13539,6 +13543,207 @@ _ACEOF
|
||||
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
for ac_header in $ac_header_list
|
||||
do :
|
||||
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
||||
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
|
||||
"
|
||||
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
|
||||
_ACEOF
|
||||
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
for ac_func in getpagesize
|
||||
do :
|
||||
ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize"
|
||||
if test "x$ac_cv_func_getpagesize" = xyes; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_GETPAGESIZE 1
|
||||
_ACEOF
|
||||
|
||||
fi
|
||||
done
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
|
||||
$as_echo_n "checking for working mmap... " >&6; }
|
||||
if ${ac_cv_func_mmap_fixed_mapped+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
if test "$cross_compiling" = yes; then :
|
||||
ac_cv_func_mmap_fixed_mapped=no
|
||||
else
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
$ac_includes_default
|
||||
/* malloc might have been renamed as rpl_malloc. */
|
||||
#undef malloc
|
||||
|
||||
/* Thanks to Mike Haertel and Jim Avera for this test.
|
||||
Here is a matrix of mmap possibilities:
|
||||
mmap private not fixed
|
||||
mmap private fixed at somewhere currently unmapped
|
||||
mmap private fixed at somewhere already mapped
|
||||
mmap shared not fixed
|
||||
mmap shared fixed at somewhere currently unmapped
|
||||
mmap shared fixed at somewhere already mapped
|
||||
For private mappings, we should verify that changes cannot be read()
|
||||
back from the file, nor mmap's back from the file at a different
|
||||
address. (There have been systems where private was not correctly
|
||||
implemented like the infamous i386 svr4.0, and systems where the
|
||||
VM page cache was not coherent with the file system buffer cache
|
||||
like early versions of FreeBSD and possibly contemporary NetBSD.)
|
||||
For shared mappings, we should conversely verify that changes get
|
||||
propagated back to all the places they're supposed to be.
|
||||
|
||||
Grep wants private fixed already mapped.
|
||||
The main things grep needs to know about mmap are:
|
||||
* does it exist and is it safe to write into the mmap'd area
|
||||
* how to use it (BSD variants) */
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H
|
||||
char *malloc ();
|
||||
#endif
|
||||
|
||||
/* This mess was copied from the GNU getpagesize.h. */
|
||||
#ifndef HAVE_GETPAGESIZE
|
||||
# ifdef _SC_PAGESIZE
|
||||
# define getpagesize() sysconf(_SC_PAGESIZE)
|
||||
# else /* no _SC_PAGESIZE */
|
||||
# ifdef HAVE_SYS_PARAM_H
|
||||
# include <sys/param.h>
|
||||
# ifdef EXEC_PAGESIZE
|
||||
# define getpagesize() EXEC_PAGESIZE
|
||||
# else /* no EXEC_PAGESIZE */
|
||||
# ifdef NBPG
|
||||
# define getpagesize() NBPG * CLSIZE
|
||||
# ifndef CLSIZE
|
||||
# define CLSIZE 1
|
||||
# endif /* no CLSIZE */
|
||||
# else /* no NBPG */
|
||||
# ifdef NBPC
|
||||
# define getpagesize() NBPC
|
||||
# else /* no NBPC */
|
||||
# ifdef PAGESIZE
|
||||
# define getpagesize() PAGESIZE
|
||||
# endif /* PAGESIZE */
|
||||
# endif /* no NBPC */
|
||||
# endif /* no NBPG */
|
||||
# endif /* no EXEC_PAGESIZE */
|
||||
# else /* no HAVE_SYS_PARAM_H */
|
||||
# define getpagesize() 8192 /* punt totally */
|
||||
# endif /* no HAVE_SYS_PARAM_H */
|
||||
# endif /* no _SC_PAGESIZE */
|
||||
|
||||
#endif /* no HAVE_GETPAGESIZE */
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
char *data, *data2, *data3;
|
||||
const char *cdata2;
|
||||
int i, pagesize;
|
||||
int fd, fd2;
|
||||
|
||||
pagesize = getpagesize ();
|
||||
|
||||
/* First, make a file with some known garbage in it. */
|
||||
data = (char *) malloc (pagesize);
|
||||
if (!data)
|
||||
return 1;
|
||||
for (i = 0; i < pagesize; ++i)
|
||||
*(data + i) = rand ();
|
||||
umask (0);
|
||||
fd = creat ("conftest.mmap", 0600);
|
||||
if (fd < 0)
|
||||
return 2;
|
||||
if (write (fd, data, pagesize) != pagesize)
|
||||
return 3;
|
||||
close (fd);
|
||||
|
||||
/* Next, check that the tail of a page is zero-filled. File must have
|
||||
non-zero length, otherwise we risk SIGBUS for entire page. */
|
||||
fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600);
|
||||
if (fd2 < 0)
|
||||
return 4;
|
||||
cdata2 = "";
|
||||
if (write (fd2, cdata2, 1) != 1)
|
||||
return 5;
|
||||
data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L);
|
||||
if (data2 == MAP_FAILED)
|
||||
return 6;
|
||||
for (i = 0; i < pagesize; ++i)
|
||||
if (*(data2 + i))
|
||||
return 7;
|
||||
close (fd2);
|
||||
if (munmap (data2, pagesize))
|
||||
return 8;
|
||||
|
||||
/* Next, try to mmap the file at a fixed address which already has
|
||||
something else allocated at it. If we can, also make sure that
|
||||
we see the same garbage. */
|
||||
fd = open ("conftest.mmap", O_RDWR);
|
||||
if (fd < 0)
|
||||
return 9;
|
||||
if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_FIXED, fd, 0L))
|
||||
return 10;
|
||||
for (i = 0; i < pagesize; ++i)
|
||||
if (*(data + i) != *(data2 + i))
|
||||
return 11;
|
||||
|
||||
/* Finally, make sure that changes to the mapped area do not
|
||||
percolate back to the file as seen by read(). (This is a bug on
|
||||
some variants of i386 svr4.0.) */
|
||||
for (i = 0; i < pagesize; ++i)
|
||||
*(data2 + i) = *(data2 + i) + 1;
|
||||
data3 = (char *) malloc (pagesize);
|
||||
if (!data3)
|
||||
return 12;
|
||||
if (read (fd, data3, pagesize) != pagesize)
|
||||
return 13;
|
||||
for (i = 0; i < pagesize; ++i)
|
||||
if (*(data + i) != *(data3 + i))
|
||||
return 14;
|
||||
close (fd);
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_run "$LINENO"; then :
|
||||
ac_cv_func_mmap_fixed_mapped=yes
|
||||
else
|
||||
ac_cv_func_mmap_fixed_mapped=no
|
||||
fi
|
||||
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
|
||||
conftest.$ac_objext conftest.beam conftest.$ac_ext
|
||||
fi
|
||||
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5
|
||||
$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; }
|
||||
if test $ac_cv_func_mmap_fixed_mapped = yes; then
|
||||
|
||||
$as_echo "#define HAVE_MMAP 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
rm -f conftest.mmap conftest.txt
|
||||
|
||||
for ac_func in sbrk utimes setmode getc_unlocked strcoll setlocale
|
||||
do :
|
||||
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||
|
@ -130,6 +130,7 @@ AC_CHECK_HEADERS(string.h strings.h stdlib.h unistd.h fcntl.h sys/file.h limits.
|
||||
AC_HEADER_SYS_WAIT
|
||||
ACX_HEADER_STRING
|
||||
AC_FUNC_ALLOCA
|
||||
AC_FUNC_MMAP
|
||||
AC_CHECK_FUNCS(sbrk utimes setmode getc_unlocked strcoll setlocale)
|
||||
AC_CHECK_FUNC([mkstemp],
|
||||
AC_DEFINE([HAVE_MKSTEMP], 1,
|
||||
|
Loading…
Reference in New Issue
Block a user