diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8466debe6617e0dcd0bd0849c46d596c204c0907..f998afd4503e2d28c3c38281697aee74d76700c7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,17 @@
 Mon Apr 20 14:48:29 1998  Michael Meissner  <meissner@cygnus.com>
 
+	* configure.in (AC_CHECK_FUNCS): Check for strchr and strrchr.
+	* configure: Regenerate.
+	* config.in: Add #undef's for strchr and strrchr.
+
+	* protoize.c (toplevel): If we have rindex, but not strrchr, map
+	rindex to strrchr.
+	(file_could_be_converted): Use strrchr, not rindex since rindex is
+	not defined on Linux systems when _POSIX_SOURCE is defined.
+	(file_normally_convertible): Ditto.
+	(process_aux_info_file): Ditto.
+	(main): Ditto.
+
 	* rs6000.md (mov{sf,df} define_splits): When splitting a move of
 	a constant to an integer register, don't split the insns that do
 	the simple AND and OR operations, rather just split each word, and
diff --git a/gcc/config.in b/gcc/config.in
index 8d0631a11101335896eebbae1325dd09389a59e1..bf2d02f0bb68c904f9e6cb1f428bd448fa4c495f 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -92,12 +92,18 @@
 /* Define if you have the rindex function.  */
 #undef HAVE_RINDEX
 
+/* Define if you have the strchr function.  */
+#undef HAVE_STRCHR
+
 /* Define if you have the setrlimit function.  */
 #undef HAVE_SETRLIMIT
 
 /* Define if you have the strerror function.  */
 #undef HAVE_STRERROR
 
+/* Define if you have the strrchr function.  */
+#undef HAVE_STRRCHR
+
 /* Define if you have the strtoul function.  */
 #undef HAVE_STRTOUL
 
diff --git a/gcc/configure b/gcc/configure
index b68a0c60c3cb31dde1aaca20cde10f279376ce94..5e97fc0b181673bb84d1cd713024205df119c7d0 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -1676,7 +1676,7 @@ fi
 echo "$ac_t""$gcc_cv_header_inttypes_h" 1>&6
 
 for ac_func in strtoul bsearch strerror putenv popen vprintf bcopy bzero bcmp \
-	index rindex kill getrlimit setrlimit atoll atoq sysconf
+	index rindex strchr strrchr kill getrlimit setrlimit atoll atoq sysconf
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
 echo "configure:1683: checking for $ac_func" >&5
diff --git a/gcc/configure.in b/gcc/configure.in
index 1387ed0e130b79f1e6762fe54027cfae0db24338..61bfc9a9d0aa81ca4c7e3a8b39d629a229f4a652 100644
--- a/gcc/configure.in
+++ b/gcc/configure.in
@@ -181,7 +181,7 @@ AC_CACHE_VAL(gcc_cv_header_inttypes_h,
 AC_MSG_RESULT($gcc_cv_header_inttypes_h)
 
 AC_CHECK_FUNCS(strtoul bsearch strerror putenv popen vprintf bcopy bzero bcmp \
-	index rindex kill getrlimit setrlimit atoll atoq sysconf)
+	index rindex strchr strrchr kill getrlimit setrlimit atoll atoq sysconf)
 
 GCC_FUNC_PRINTF_PTR
 
diff --git a/gcc/protoize.c b/gcc/protoize.c
index 699bfe683ecdcafd8a6034659981dc8760920a2a..754d6c23ce8d64dde7b2aa095bca26223a043690 100644
--- a/gcc/protoize.c
+++ b/gcc/protoize.c
@@ -74,6 +74,16 @@ Boston, MA 02111-1307, USA.  */
 #include <setjmp.h>
 #include "gansidecl.h"
 
+/* Some systems like Linux don't declare rindex if _POSIX_SOURCE is declared,
+   but it normally does declare it.  This means that configure thinks we don't
+   need to declare it.  Favor using strrchr if it is available.  */
+
+#ifndef HAVE_STRRCHR
+#ifdef  HAVE_RINDEX
+#define strrchr rindex
+#endif
+#endif
+
 /* Include getopt.h for the sake of getopt_long.
    We don't need the declaration of getopt, and it could conflict
    with something from a system header file, so effectively nullify that.  */
@@ -897,7 +907,7 @@ file_could_be_converted (const char *path)
     char *dir_last_slash;
 
     strcpy (dir_name, path);
-    dir_last_slash = rindex (dir_name, '/');
+    dir_last_slash = strrchr (dir_name, '/');
     if (dir_last_slash)
       *dir_last_slash = '\0';
     else
@@ -931,7 +941,7 @@ file_normally_convertible (const char *path)
     char *dir_last_slash;
 
     strcpy (dir_name, path);
-    dir_last_slash = rindex (dir_name, '/');
+    dir_last_slash = strrchr (dir_name, '/');
     if (dir_last_slash)
       *dir_last_slash = '\0';
     else
@@ -2370,7 +2380,7 @@ start_over: ;
 	char *dir_end;
 	aux_info_relocated_name = xmalloc (base_len + (p-invocation_filename));
 	strcpy (aux_info_relocated_name, base_source_filename);
-	dir_end = rindex (aux_info_relocated_name, '/');
+	dir_end = strrchr (aux_info_relocated_name, '/');
 	if (dir_end)
 	  dir_end++;
 	else
@@ -4575,7 +4585,7 @@ main (argc, argv)
   int c;
   const char *params = "";
 
-  pname = rindex (argv[0], '/');
+  pname = strrchr (argv[0], '/');
   pname = pname ? pname+1 : argv[0];
 
   cwd_buffer = getpwd ();