diff --git a/src/builtin.cmod b/src/builtin.cmod
index e343435720f666a8a280a5e7067d03127baaedc6..ff67301aec373d9f8b66239e5407df74ad2f35b0 100644
--- a/src/builtin.cmod
+++ b/src/builtin.cmod
@@ -2213,7 +2213,7 @@ PIKEFUN string|mapping _getenv (void|string var)
       if (!entry)
 	push_int (0);
       else {
-	char *eq = STRCHR (entry, '=');
+	char *eq = strchr (entry, '=');
 	/* There should always be a '=' in the entry, but you never know.. */
 	push_string (make_shared_string (eq ? eq + 1 : entry));
       }
@@ -2241,7 +2241,7 @@ PIKEFUN string|mapping _getenv (void|string var)
 #endif /* !USE_SETENV */
 
     while (--n >= 0) {
-      char *entry = environ[n], *eq = STRCHR (entry, '=');
+      char *entry = environ[n], *eq = strchr (entry, '=');
       if (eq) { /* gnu libc getenv ignores variables without '='. */
 	struct pike_string *var = make_shared_binary_string (entry, eq - entry);
 	struct pike_string *val = make_shared_string (eq + 1);
@@ -2284,7 +2284,7 @@ PIKEFUN void _putenv (string var, void|string val)
 
   if (var->size_shift)
     SIMPLE_ARG_TYPE_ERROR ("putenv", 1, "string(0..255)");
-  if (string_has_null (var) || STRCHR (var->str, '='))
+  if (string_has_null (var) || strchr (var->str, '='))
     SIMPLE_ARG_ERROR ("putenv", 1, "Variable name cannot contain '=' or NUL.");
 
   if (val) {
diff --git a/src/configure.in b/src/configure.in
index 1bfdc77c0fe2407052b10ae8c74a664ff4760066..4bfd0f47a501423977e6cca96918dcec02b398f3 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -4554,7 +4554,6 @@ AC_CHECK_FUNCS( \
  sigaction \
  sigvec \
  strcasecmp \
- strchr \
  strerror \
  times \
  tzset \
diff --git a/src/cpp.c b/src/cpp.c
index 40f49c580f7feffff503100fe53bf8fd1f481249..ee481cef70fdeef96aec7365e6d9cac8d5227143 100644
--- a/src/cpp.c
+++ b/src/cpp.c
@@ -3634,7 +3634,7 @@ void init_cpp()
 void add_predefine(const char *s)
 {
   struct pike_predef_s *tmp=ALLOC_STRUCT(pike_predef_s);
-  char * pos=STRCHR(s,'=');
+  char * pos=strchr(s,'=');
   if(pos)
   {
     tmp->name=xalloc(pos-s+1);
diff --git a/src/interpret.c b/src/interpret.c
index 14f3f57a51b51286ec098d2b6aff954079afc4fc..fe5d38fef907622e8dfc9b2e42e1e3796927854f 100644
--- a/src/interpret.c
+++ b/src/interpret.c
@@ -887,7 +887,7 @@ static INLINE void low_debug_instr_prologue (PIKE_INSTR_T instr)
     filep = get_line(Pike_fp->pc,Pike_fp->context->prog,&linep);
     if (filep && !filep->size_shift) {
       file = filep->str;
-      while((f=STRCHR(file,'/')))
+      while((f=strchr(file,'/')))
 	file=f+1;
     }
     fprintf(stderr,"- %s:%4ld:%p(%"PRINTPTRDIFFT"d): "
@@ -1823,9 +1823,9 @@ static void do_trace_call(INT32 args, dynamic_buffer *old_buf)
       file = "...";
     else {
       file = filep->str;
-      while((f = STRCHR(file, '/'))
+      while((f = strchr(file, '/'))
 #ifdef __NT__
-	    || (f = STRCHR(file, '\\'))
+	    || (f = strchr(file, '\\'))
 #endif /* __NT__ */
 	    )
 	file=f+1;
@@ -1908,7 +1908,7 @@ static void do_trace_return (int got_retval, dynamic_buffer *old_buf)
       file = "...";
     else {
       file = filep->str;
-      while((f=STRCHR(file,'/')))
+      while((f=strchr(file,'/')))
 	file=f+1;
     }
   }else{
diff --git a/src/modules/Regexp/pike_regexp.c b/src/modules/Regexp/pike_regexp.c
index abf85061a14a9389aa763ca574d63919bc966b5d..e07097433d747340f3f0012d3c948460c32991f0 100644
--- a/src/modules/Regexp/pike_regexp.c
+++ b/src/modules/Regexp/pike_regexp.c
@@ -797,7 +797,7 @@ int pike_regexec(regexp *prog, char *string)
     /* If there is a "must appear" string, look for it. */
     if (prog->regmust != (char *)NULL) {
 	s = string;
-	while ((s = STRCHR(s, prog->regmust[0])) != (char *)NULL) {
+	while ((s = strchr(s, prog->regmust[0])) != (char *)NULL) {
 	    if (strncmp(s, prog->regmust, prog->regmlen) == 0)
 		break;		/* Found it. */
 	    s++;
@@ -816,7 +816,7 @@ int pike_regexec(regexp *prog, char *string)
     s = string;
     if (prog->regstart != '\0')
 	/* We know what char it must start with. */
-	while ((s = STRCHR(s, prog->regstart)) != (char *)NULL) {
+	while ((s = strchr(s, prog->regstart)) != (char *)NULL) {
 	    if (regtry(prog, s))
 		return (1);
 	    s++;
@@ -953,13 +953,13 @@ char           *prog;
 	    break;
 	case ANYOF:
 	    if (*reginput == '\0' || 
-		 STRCHR(OPERAND(scan), *reginput) == (char *)NULL)
+		 strchr(OPERAND(scan), *reginput) == (char *)NULL)
 		return (0);
 	    reginput++;
 	    break;
 	case ANYBUT:
 	    if (*reginput == '\0' || 
-		 STRCHR(OPERAND(scan), *reginput) != (char *)NULL)
+		 strchr(OPERAND(scan), *reginput) != (char *)NULL)
 		return (0);
 	    reginput++;
 	    break;
@@ -1106,13 +1106,13 @@ char           *p;
 	}
 	break;
     case ANYOF:
-	while (*scan != '\0' && STRCHR(opnd, *scan) != (char *)NULL) {
+	while (*scan != '\0' && strchr(opnd, *scan) != (char *)NULL) {
 	    count++;
 	    scan++;
 	}
 	break;
     case ANYBUT:
-	while (*scan != '\0' && STRCHR(opnd, *scan) == (char *)NULL) {
+	while (*scan != '\0' && strchr(opnd, *scan) == (char *)NULL) {
 	    count++;
 	    scan++;
 	}
diff --git a/src/pike_memory.c b/src/pike_memory.c
index 5e1dd549b422812aaaac5ba838645da60905c079..ea2ed29eee8775c904a43d6be10d0434b685bee5 100644
--- a/src/pike_memory.c
+++ b/src/pike_memory.c
@@ -2354,16 +2354,16 @@ static void parse_location (struct memloc *l, struct parsed_location *pl)
   const char *p;
   pl->file = LOCATION_NAME (l->location);
 
-  p = STRCHR (pl->file, ' ');
+  p = strchr (pl->file, ' ');
   if (p)
     pl->extra = p;
   else
-    pl->extra = STRCHR (pl->file, 0);
+    pl->extra = strchr (pl->file, 0);
 
-  p = STRCHR (pl->file, ':');
+  p = strchr (pl->file, ':');
   if (p && p < pl->extra) {
     const char *pp;
-    while ((pp = STRCHR (p + 1, ':')) && pp < pl->extra) p = pp;
+    while ((pp = strchr (p + 1, ':')) && pp < pl->extra) p = pp;
     pl->line = strtol (p + 1, NULL, 10);
     pl->file_len = p - pl->file;
   }
@@ -2931,7 +2931,7 @@ static LOCATION low_dynamic_location(char type, const char *file,
     {
 
       if (name) {
-	char *s = STRCHR (str->str + len + 2, ' ');
+	char *s = strchr (str->str + len + 2, ' ');
 	if (!s) continue;
 	s++;
 	if (strcmp (s, name)) continue;
diff --git a/src/port.c b/src/port.c
index 1c562db1d589fa089a791c883ff2d3b7ef02b5a7..16308899fdb230423c7097ccb2650840f2a6ef84 100644
--- a/src/port.c
+++ b/src/port.c
@@ -262,14 +262,6 @@ PMOD_EXPORT int STRCASECMP(const char *a,const char *b)
 }
 #endif
 
-#if !defined(HAVE_INDEX) && !defined(HAVE_STRCHR)
-PMOD_EXPORT char *STRCHR(char *s,int c)
-{
-  for(;*s;s++) if(*s==c) return s;
-  return NULL;
-}
-#endif
-
 #ifndef HAVE_VSPRINTF
 PMOD_EXPORT int VSPRINTF(char *buf,const char *fmt,va_list args)
 {
@@ -281,7 +273,7 @@ PMOD_EXPORT int VSPRINTF(char *buf,const char *fmt,va_list args)
   char *fmt2p;
 
   fmt2[0]='%';
-  for(;(s=STRCHR(fmt,'%'));fmt=s)
+  for(;(s=strchr(fmt,'%'));fmt=s)
   {
     memcpy(buf,fmt,s-fmt);
     buf+=s-fmt;
diff --git a/src/port.h b/src/port.h
index 4c7fffea17a7d6534b77354a3cce2166cd0afe50..3f286a4f68c57e33a6d6a69740e271011942597e 100644
--- a/src/port.h
+++ b/src/port.h
@@ -185,13 +185,10 @@ PMOD_EXPORT int STRCASECMP(const char *a,const char *b);
 #define HAVE_MEMCHR 1
 #define MEMCHR(X,Y,Z) memchr(X,Y,Z)
 
-#ifndef HAVE_STRCHR
-PMOD_EXPORT char *STRCHR(char *s,int c);
-#else
-#  define STRCHR strchr
-#  ifdef STRCHR_DECL_MISSING
-char *STRCHR(char *s,int c);
-#  endif
+#define HAVE_STRCHR 1
+#define STRCHR strchr
+#ifdef STRCHR_DECL_MISSING
+char *strchr(const char *s,int c);
 #endif
 
 #define HAVE_VFPRINTF 1
diff --git a/src/program.c b/src/program.c
index 7243d469a13f9537a68fc1c0aa39909cc79dbff0..c3e742d638bbb53c876c1ccf1f98c9939ecca3e3 100644
--- a/src/program.c
+++ b/src/program.c
@@ -2419,10 +2419,10 @@ struct pike_string *find_program_name(struct program *p, INT_TYPE *line)
   {
     char *tmp=dmalloc_find_name(p);
     if (tmp) {
-      char *p = STRCHR (tmp, ':');
+      char *p = strchr (tmp, ':');
       if (p) {
 	char *pp;
-	while ((pp = STRCHR (p + 1, ':'))) p = pp;
+	while ((pp = strchr (p + 1, ':'))) p = pp;
 	*line = atoi (p + 1);
 	return make_shared_binary_string (tmp, p - tmp);
       }
diff --git a/src/signal_handler.c b/src/signal_handler.c
index c3c6d63e4e48ed9c65c13b62fd62cccc9e7949cb..b65d31cbcf1221db421ec8f4f56e47c7e1246aff 100644
--- a/src/signal_handler.c
+++ b/src/signal_handler.c
@@ -2854,8 +2854,8 @@ void f_create_process(INT32 args)
             ITEM(cmd)[e].u.string->str[0] != '"' ||
             ITEM(cmd)[e].u.string->str[ITEM(cmd)[e].u.string->len-1] != '"')
           {
-            quote=STRCHR(ITEM(cmd)[e].u.string->str,'"') ||
-              STRCHR(ITEM(cmd)[e].u.string->str,' ');
+            quote=strchr(ITEM(cmd)[e].u.string->str,'"') ||
+              strchr(ITEM(cmd)[e].u.string->str,' ');
           }
 
 	if(quote)
@@ -3061,7 +3061,7 @@ void f_create_process(INT32 args)
     {
       if(e)
         low_my_putchar(' ', &storage.cmd_buf);
-      if(STRCHR(STR0(ITEM(cmd)[e].u.string),'"') || STRCHR(STR0(ITEM(cmd)[e].u.string),' ')) {
+      if(strchr(STR0(ITEM(cmd)[e].u.string),'"') || strchr(STR0(ITEM(cmd)[e].u.string),' ')) {
         low_my_putchar('"', &storage.cmd_buf);
 	for(d=0;d<ITEM(cmd)[e].u.string->len;d++)
 	{