aboutsummaryrefslogtreecommitdiff
path: root/libiberty/aclocal.m4
diff options
context:
space:
mode:
authorghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4>2000-04-28 01:42:43 +0000
committerghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4>2000-04-28 01:42:43 +0000
commitb3524c8f62bb28ea9ac8bb9e9a8add363a467922 (patch)
treeb17419ab155b4e9009d38da21cac2f8c357d799b /libiberty/aclocal.m4
parentf0e2ad08921206fe3e9faab3938e93e7bb183b25 (diff)
* aclocal.m4: New file with new test libiberty_AC_FUNC_STRNCMP.
* configure.in (AC_CHECK_HEADERS): Add sys/mman.h fcntl.h. (libiberty_AC_FUNC_STRNCMP): Invoke. * strncmp.c: New file. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33498 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libiberty/aclocal.m4')
-rw-r--r--libiberty/aclocal.m471
1 files changed, 71 insertions, 0 deletions
diff --git a/libiberty/aclocal.m4 b/libiberty/aclocal.m4
new file mode 100644
index 00000000000..b6a38d60522
--- /dev/null
+++ b/libiberty/aclocal.m4
@@ -0,0 +1,71 @@
+dnl See whether strncmp reads past the end of its string parameters.
+dnl On some versions of SunOS4 at least, strncmp reads a word at a time
+dnl but erroneously reads past the end of strings. This can cause
+dnl a SEGV in some cases.
+AC_DEFUN(libiberty_AC_FUNC_STRNCMP,
+[AC_REQUIRE([AC_FUNC_MMAP])
+AC_CACHE_CHECK([for working strncmp], ac_cv_func_strncmp_works,
+[AC_TRY_RUN([
+/* Test by Jim Wilson and Kaveh Ghazi.
+ Check whether strncmp reads past the end of its string parameters. */
+#include <sys/types.h>
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_SYS_MMAN_H
+#include <sys/mman.h>
+#endif
+
+#ifndef MAP_ANON
+#ifdef MAP_ANONYMOUS
+#define MAP_ANON MAP_ANONYMOUS
+#else
+#define MAP_ANON MAP_FILE
+#endif
+#endif
+
+#ifndef MAP_FILE
+#define MAP_FILE 0
+#endif
+#ifndef O_RDONLY
+#define O_RDONLY 0
+#endif
+
+#define MAP_LEN 0x10000
+
+main ()
+{
+#if defined(HAVE_MMAP) || defined(HAVE_MMAP_ANYWHERE)
+ char *p;
+ int dev_zero;
+
+ dev_zero = open ("/dev/zero", O_RDONLY);
+ if (dev_zero < 0)
+ exit (1);
+
+ p = (char *) mmap (0, MAP_LEN, PROT_READ|PROT_WRITE,
+ MAP_ANON|MAP_PRIVATE, dev_zero, 0);
+ if (p == (char *)-1)
+ exit (2);
+ else
+ {
+ char *string = "__si_type_info";
+ char *q = (char *) p + MAP_LEN - strlen (string) - 2;
+ char *r = (char *) p + 0xe;
+
+ strcpy (q, string);
+ strcpy (r, string);
+ strncmp (r, q, 14);
+ }
+#endif /* HAVE_MMAP || HAVE_MMAP_ANYWHERE */
+ exit (0);
+}
+], ac_cv_func_strncmp_works=yes, ac_cv_func_strncmp_works=no,
+ ac_cv_func_strncmp_works=no)
+rm -f core core.* *.core])
+if test $ac_cv_func_strncmp_works = no ; then
+ LIBOBJS="$LIBOBJS strncmp.o"
+fi
+])