diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 850c8a1341b1a81075bccae36fef75faf02658cd..b8f238e777445cf07c3d1d8403be78a19c3c4f2c 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,10 @@
+2018-08-13  Janne Blomqvist  <jb@gcc.gnu.org>
+
+	* configure.ac: Check for getentropy.
+	* intrinsics/random.c (getosrandom): Use getentropy if available.
+	* config.h.in: Regenerated.
+	* configure: Regenerated.
+
 2018-07-31  Andre Vieira  <andre.simoesdiasvieira@arm.com>
 
 	Revert 'AsyncI/O patch committed'
diff --git a/libgfortran/config.h.in b/libgfortran/config.h.in
index 0274e5d9c4ca7adcf6b3ee765a9abe0f2714b996..9ad64d57ab91f1cb8b61a56e39201a941faa91ee 100644
--- a/libgfortran/config.h.in
+++ b/libgfortran/config.h.in
@@ -453,6 +453,9 @@
 /* Define to 1 if you have the `getegid' function. */
 #undef HAVE_GETEGID
 
+/* Define to 1 if you have the `getentropy' function. */
+#undef HAVE_GETENTROPY
+
 /* Define to 1 if you have the `geteuid' function. */
 #undef HAVE_GETEUID
 
diff --git a/libgfortran/configure b/libgfortran/configure
index 91fce8fecd080e7fa969c76c875482c9446331a4..42b4c0b5cb4dcdfbb811fe71919802fb8b13d980 100755
--- a/libgfortran/configure
+++ b/libgfortran/configure
@@ -2570,6 +2570,7 @@ as_fn_append ac_func_list " snprintf"
 as_fn_append ac_func_list " ftruncate"
 as_fn_append ac_func_list " chsize"
 as_fn_append ac_func_list " chdir"
+as_fn_append ac_func_list " getentropy"
 as_fn_append ac_func_list " getlogin"
 as_fn_append ac_func_list " gethostname"
 as_fn_append ac_func_list " kill"
@@ -12512,7 +12513,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12515 "configure"
+#line 12516 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12618,7 +12619,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12621 "configure"
+#line 12622 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -16775,6 +16776,8 @@ done
 
 
 
+
+
 
 
 
diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac
index bf6d3634dda3acbc1d03d8c7825e60289967b116..900c7466decba1810833f276192b302b036d51d2 100644
--- a/libgfortran/configure.ac
+++ b/libgfortran/configure.ac
@@ -312,7 +312,8 @@ if test "${hardwire_newlib:-0}" -eq 1; then
    fi
 else
    AC_CHECK_FUNCS_ONCE(getrusage times mkstemp strtof strtold snprintf \
-   ftruncate chsize chdir getlogin gethostname kill link symlink sleep ttyname \
+   ftruncate chsize chdir getentropy getlogin gethostname kill link symlink \
+   sleep ttyname \
    alarm access fork setmode fcntl \
    gettimeofday stat fstat lstat getpwuid vsnprintf dup \
    getcwd localtime_r gmtime_r getpwuid_r ttyname_r clock_gettime \
diff --git a/libgfortran/intrinsics/random.c b/libgfortran/intrinsics/random.c
index 234c5ff95fdaeb50c89ade0f7d5c742824d54383..229fa6995c0ba365de989c433e66bc606846aeec 100644
--- a/libgfortran/intrinsics/random.c
+++ b/libgfortran/intrinsics/random.c
@@ -310,11 +310,10 @@ getosrandom (void *buf, size_t buflen)
     rand_s (&b[i]);
   return buflen;
 #else
-  /*
-     TODO: When glibc adds a wrapper for the getrandom() system call
-     on Linux, one could use that.
-
-     TODO: One could use getentropy() on OpenBSD.  */
+#ifdef HAVE_GETENTROPY
+  if (getentropy (buf, buflen) == 0)
+    return 0;
+#endif
   int flags = O_RDONLY;
 #ifdef O_CLOEXEC
   flags |= O_CLOEXEC;