[gnutls-devel] [PATCH] Fix library build on Chrome Native Client (NaCl)

Kevin Cernekee cernekee at gmail.com
Sun Apr 17 20:12:18 CEST 2016

GnuTLS seems to mostly work under NaCl, but two items needed to be

1) Automatically running gnutls_global_init() from the library
constructor won't work, because /dev/urandom isn't available until
the app initializes libnacl_io.  If the app wants to use the
nacl_io_init_ppapi() API, this can only be called once the PP_Instance
object is created, which happens after the library constructor runs.

2) Some supported toolchains define DT_UNKNOWN but do not define
_DIRENT_HAVE_D_TYPE (and do not have the d_type field).  On other
platforms GnuTLS may need to second-guess what the library is reporting,
but on NaCl this is unsafe.

For GnuTLS 3.4.x I'm carrying this as an out-of-tree patch[1], but it
would be nice if it was incorporated into 3.5.x.

Builds of the tools (certtool and such) under NaCl are untested and
probably require additional work.

[1] https://codereview.chromium.org/1892223002
 lib/global.c            | 8 ++++++++
 lib/x509/verify-high2.c | 2 +-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/lib/global.c b/lib/global.c
index f55851e7ea94..96c48ae040b0 100644
--- a/lib/global.c
+++ b/lib/global.c
@@ -57,7 +57,15 @@
 int __attribute__((weak)) _gnutls_global_init_skip(void);
 int _gnutls_global_init_skip(void)
+#ifdef __native_client__
+	/* _gnutls_rnd_init() will fail if nacl_io_init() or
+	 * nacl_io_init_ppapi() has not run yet.  Only the app can invoke
+	 * the latter function (and only one can be called).
+	 */
+	return 1;
 	return 0;
 inline static int _gnutls_global_init_skip(void)
diff --git a/lib/x509/verify-high2.c b/lib/x509/verify-high2.c
index e79aedc72de4..96f0ff6c274b 100644
--- a/lib/x509/verify-high2.c
+++ b/lib/x509/verify-high2.c
@@ -37,7 +37,7 @@
 #include <dirent.h>
+#if !defined(_DIRENT_HAVE_D_TYPE) && !defined(__native_client__)
 # ifdef DT_UNKNOWN
 #  define _DIRENT_HAVE_D_TYPE
 # endif

More information about the Gnutls-devel mailing list