diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 67cb99602c2345f7bf3cc58d8d76a670dcddcb5a..cd87d9484872fc701736182f21abee539425e692 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@
+2013-07-22  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	PR c++/57920
+	* src/c++11/random.cc (random_device::_M_getval): If possible, use
+	read instead of std::fread.
+	* include/std/random: Do not include <cstdio> unnecessarily.
+
 2013-07-21  Tim Shen  <timshen91@gmail.com>
 
 	Partially implement regex_search.
diff --git a/libstdc++-v3/include/std/random b/libstdc++-v3/include/std/random
index ceb38252cd9392af1afa90a8a678caab400d9378..84b176154b9b4e0787004525d45c81f577ae04bc 100644
--- a/libstdc++-v3/include/std/random
+++ b/libstdc++-v3/include/std/random
@@ -36,7 +36,6 @@
 #else
 
 #include <cmath>
-#include <cstdio>
 #include <cstdlib>
 #include <string>
 #include <iosfwd>
diff --git a/libstdc++-v3/src/c++11/random.cc b/libstdc++-v3/src/c++11/random.cc
index 2bd713260a211f213e3ac6f55aa96296fe77bb7b..1646786882adbb9ac68b7c599cdab0b273232fca 100644
--- a/libstdc++-v3/src/c++11/random.cc
+++ b/libstdc++-v3/src/c++11/random.cc
@@ -30,6 +30,11 @@
 # include <cpuid.h>
 #endif
 
+#include <cstdio>
+
+#ifdef _GLIBCXX_HAVE_UNISTD_H
+# include <unistd.h>
+#endif
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
@@ -126,8 +131,12 @@ namespace std _GLIBCXX_VISIBILITY(default)
 #endif
 
     result_type __ret;
+#ifdef _GLIBCXX_HAVE_UNISTD_H
+    read(fileno(_M_file), reinterpret_cast<void*>(&__ret), sizeof(result_type));
+#else
     std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type),
 	       1, _M_file);
+#endif
     return __ret;
   }