diff --git a/src/configure.in b/src/configure.in
index 5aa19b759f40f061593bc83ebbdd26013150fe25..70b4203dfebe514a0c70a0d733b0a22ea65cd053 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -673,7 +673,9 @@ case "$pike_cv_sys_os" in
       fi
    ;;
   Darwin*)
+   # macOS lacks prototypes for these with _POSIX_C_SOURCE
    ac_cv_func_getpagesize="no"
+   ac_cv_func_chroot="no"
    ;;
 esac
 
@@ -4565,6 +4567,7 @@ AC_CHECK_FUNCS( \
  _crypt \
  poll \
  accept4 \
+ chroot \
  closefrom \
  crypt \
  fdwalk \
diff --git a/src/modules/system/configure.in b/src/modules/system/configure.in
index 91de08647349ecd4ac368565914ddd2406dade3c..4a19a8bcaa8a46fd741192f3b5af912d994d5913 100644
--- a/src/modules/system/configure.in
+++ b/src/modules/system/configure.in
@@ -91,7 +91,7 @@ AC_HAVE_FUNCS(syslog link symlink readlink resolvepath realpath chown lchown \
 	getpwnam getspnam getgrnam getpwuid getgrgid \
 	getgrent setgrent endgrent getpwent setpwent endpwent \
 	gethostname gethostbyname getservbyname \
-	chroot fchroot uname sysinfo sync \
+	fchroot uname sysinfo sync \
         getgrnam_r getgrent_r getgrgid_r \
         getpwnam_r getpwent_r getpwuid_r \
 	getspnam_r innetgr utime _utime lutimes sleep usleep nanosleep \
diff --git a/src/signal_handler.c b/src/signal_handler.c
index dae00fb4d6a52557ecb0e6873d98ddcd37a982d8..39dedacf3b8ae3c92e0e6e49c5882ebd81b48c2f 100644
--- a/src/signal_handler.c
+++ b/src/signal_handler.c
@@ -4111,6 +4111,7 @@ void f_create_process(INT32 args)
 #endif /* _sys_nsig */
       }
 
+#ifdef HAVE_CHROOT
       if(mchroot)
       {
 	if( chroot( mchroot ) )
@@ -4129,6 +4130,7 @@ void f_create_process(INT32 args)
 	  PROCERROR(PROCE_CHDIR, 1);
 	}
       }
+#endif
 
       if(tmp_cwd)
       {