Use glibc's getrandom() instead of syscall when glibc > 2.25.

Fixes #3432

Signed-off-by: okhowang(王沛文) <okhowang@tencent.com>
diff --git a/library/entropy_poll.c b/library/entropy_poll.c
index 4bf660e..0f992f3 100644
--- a/library/entropy_poll.c
+++ b/library/entropy_poll.c
@@ -18,9 +18,15 @@
  */
 
 #if defined(__linux__)
+#if !defined(_GNU_SOURCE)
 /* Ensure that syscall() is available even when compiling with -std=c99 */
 #define _GNU_SOURCE
 #endif
+#include <features.h>
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 25)
+#define HAVE_SYS_RANDOM 1
+#endif
+#endif
 
 #include "common.h"
 
@@ -86,10 +92,16 @@
 
 /*
  * Test for Linux getrandom() support.
- * Since there is no wrapper in the libc yet, use the generic syscall wrapper
+ * When the C library is GNU libc and its version is greater than 2.25,
+ * include sys/random.h to use getrandom(),
+ * otherwise use the generic use the generic syscall wrapper
  * available in GNU libc and compatible libc's (eg uClibc).
  */
-#if ((defined(__linux__) && defined(__GLIBC__)) || defined(__midipix__))
+#if HAVE_SYS_RANDOM
+#include <sys/random.h>
+#include <errno.h>
+#define HAVE_GETRANDOM
+#elif (defined(__linux__) && defined(__GLIBC__)) || defined(__midipix__)
 #include <unistd.h>
 #include <sys/syscall.h>
 #if defined(SYS_getrandom)
@@ -155,7 +167,11 @@
     ((void) data);
 
 #if defined(HAVE_GETRANDOM)
+#if HAVE_SYS_RANDOM
+    ret = getrandom(output, len, 0);
+#else
     ret = getrandom_wrapper( output, len, 0 );
+#endif
     if( ret >= 0 )
     {
         *olen = ret;