diff --git a/package/libglib2/glib2.36.3_nommu.patch b/package/libglib2/glib2.36.3_nommu.patch
new file mode 100644
index 0000000..192e8af
--- /dev/null
+++ b/package/libglib2/glib2.36.3_nommu.patch
@@ -0,0 +1,354 @@
+diff -Nur glib-2.36.3/configure.ac glib-2.36.3_new/configure.ac
+--- glib-2.36.3/configure.ac	2013-06-10 06:53:13.000000000 +0800
++++ glib-2.36.3_new/configure.ac	2013-10-21 19:25:28.806513398 +0800
+@@ -580,7 +580,7 @@
+ # Checks for library functions.
+ AC_FUNC_VPRINTF
+ AC_FUNC_ALLOCA
+-AC_CHECK_FUNCS(mmap posix_memalign memalign valloc fsync pipe2 issetugid)
++AC_CHECK_FUNCS(mmap posix_memalign memalign valloc fsync pipe2 issetugid fork)
+ AC_CHECK_FUNCS(atexit on_exit timegm gmtime_r)
+ 
+ AC_CACHE_CHECK([for __libc_enable_secure], glib_cv_have_libc_enable_secure,
+diff -Nur glib-2.36.3/gio/gtestdbus.c glib-2.36.3_new/gio/gtestdbus.c
+--- glib-2.36.3/gio/gtestdbus.c	2013-06-03 07:20:49.000000000 +0800
++++ glib-2.36.3_new/gio/gtestdbus.c	2013-10-21 21:23:04.350552212 +0800
+@@ -245,7 +245,11 @@
+           g_assert_not_reached ();
+         }
+ 
++#ifdef HAVE_FORK
+       switch (fork ())
++#else
++      switch (vfork ())
++#endif
+         {
+         case -1:
+           g_warning ("fork() failed: %m");
+diff -Nur glib-2.36.3/gio/tests/gdbus-non-socket.c glib-2.36.3_new/gio/tests/gdbus-non-socket.c
+--- glib-2.36.3/gio/tests/gdbus-non-socket.c	2013-06-10 06:03:17.000000000 +0800
++++ glib-2.36.3_new/gio/tests/gdbus-non-socket.c	2013-10-22 00:07:55.686606621 +0800
+@@ -151,7 +151,11 @@
+   g_assert (G_IS_INPUT_STREAM (g_io_stream_get_input_stream (streams[1])));
+   g_assert (G_IS_OUTPUT_STREAM (g_io_stream_get_output_stream (streams[1])));
+ 
++#ifdef HAVE_FORK
+   switch ((first_child = fork ()))
++#else
++  switch ((first_child = vfork ()))
++#endif
+     {
+     case -1:
+       g_assert_not_reached ();
+@@ -271,7 +275,11 @@
+ 
+   g_object_unref (connection);
+   g_main_loop_unref (loop);
++#ifdef HAVE_FORK
+   exit (0);
++#else
++  _exit (0);
++#endif
+ }
+ 
+ #else /* G_OS_UNIX */
+diff -Nur glib-2.36.3/gio/tests/socket.c glib-2.36.3_new/gio/tests/socket.c
+--- glib-2.36.3/gio/tests/socket.c	2013-06-03 07:20:53.000000000 +0800
++++ glib-2.36.3_new/gio/tests/socket.c	2013-10-21 23:54:59.222602354 +0800
+@@ -756,7 +756,11 @@
+   status = socketpair (PF_UNIX, SOCK_STREAM, 0, sv);
+   g_assert_cmpint (status, ==, 0);
+ 
++#ifdef HAVE_FORK
+   pid = fork ();
++#else
++  pid = vfork ();
++#endif
+   g_assert_cmpint (pid, >=, 0);
+ 
+   /* Child: close its copy of the write end of the pipe, receive it
+@@ -787,7 +791,11 @@
+ 	len = write (fd, TEST_DATA, sizeof (TEST_DATA));
+       while (len == -1 && errno == EINTR);
+       g_assert_cmpint (len, ==, sizeof (TEST_DATA));
++#ifdef HAVE_FORK
+       exit (0);
++#else
++      _exit (0);
++#endif
+     }
+   else
+     {
+diff -Nur glib-2.36.3/glib/gbacktrace.c glib-2.36.3_new/glib/gbacktrace.c
+--- glib-2.36.3/glib/gbacktrace.c	2013-06-03 07:20:49.000000000 +0800
++++ glib-2.36.3_new/glib/gbacktrace.c	2013-10-21 20:55:48.758543214 +0800
+@@ -242,7 +242,11 @@
+   args[1] = (gchar*) prg_name;
+   args[2] = buf;
+ 
++#ifdef HAVE_FORK
+   pid = fork ();
++#else
++  pid = vfork ();
++#endif
+   if (pid == 0)
+     {
+       stack_trace (args);
+@@ -295,7 +299,11 @@
+       _exit (0);
+     }
+ 
++#ifdef HAVE_FORK
+   pid = fork ();
++#else
++  pid = vfork ();
++#endif
+   if (pid == 0)
+     {
+       close (0); dup (in_fd[0]);   /* set the stdin to the in pipe */
+diff -Nur glib-2.36.3/glib/gspawn.c glib-2.36.3_new/glib/gspawn.c
+--- glib-2.36.3/glib/gspawn.c	2013-06-10 06:03:18.000000000 +0800
++++ glib-2.36.3_new/glib/gspawn.c	2013-10-21 19:39:13.410517935 +0800
+@@ -1332,7 +1332,11 @@
+   if (standard_error && !make_pipe (stderr_pipe, error))
+     goto cleanup_and_fail;
+ 
++#ifdef HAVE_FORK
+   pid = fork ();
++#else
++  pid = vfork ();
++#endif
+ 
+   if (pid < 0)
+     {
+@@ -1382,7 +1386,11 @@
+            */
+           GPid grandchild_pid;
+ 
++#ifdef HAVE_FORK
+           grandchild_pid = fork ();
++#else
++          grandchild_pid = vfork ();
++#endif
+ 
+           if (grandchild_pid < 0)
+             {
+diff -Nur glib-2.36.3/glib/gtestutils.c glib-2.36.3_new/glib/gtestutils.c
+--- glib-2.36.3/glib/gtestutils.c	2013-06-10 06:03:18.000000000 +0800
++++ glib-2.36.3_new/glib/gtestutils.c	2013-10-21 19:40:56.330518502 +0800
+@@ -2204,7 +2204,11 @@
+   if (pipe (stdout_pipe) < 0 || pipe (stderr_pipe) < 0 || pipe (stdtst_pipe) < 0)
+     g_error ("failed to create pipes to fork test program: %s", g_strerror (errno));
+   signal (SIGCHLD, SIG_DFL);
++#ifdef HAVE_FORK
+   test_trap_last_pid = fork ();
++#else
++  test_trap_last_pid = vfork ();
++#endif
+   if (test_trap_last_pid < 0)
+     g_error ("failed to fork test program: %s", g_strerror (errno));
+   if (test_trap_last_pid == 0)  /* child */
+diff -Nur glib-2.36.3/tests/child-test.c glib-2.36.3_new/tests/child-test.c
+--- glib-2.36.3/tests/child-test.c	2013-06-10 06:03:18.000000000 +0800
++++ glib-2.36.3_new/tests/child-test.c	2013-10-21 20:56:50.358543552 +0800
+@@ -77,7 +77,11 @@
+ 
+   return pid;
+ #else
++#ifdef HAVE_FORK
+   pid = fork ();
++#else
++  pid = vfork ();
++#endif
+   if (pid < 0)
+     exit (1);
+ 
+diff -Nur glib-2.36.3/tests/timeloop-basic.c glib-2.36.3_new/tests/timeloop-basic.c
+--- glib-2.36.3/tests/timeloop-basic.c	2013-06-03 07:20:49.000000000 +0800
++++ glib-2.36.3_new/tests/timeloop-basic.c	2013-10-22 00:04:26.130605473 +0800
+@@ -26,7 +26,11 @@
+   if (pipe(fds) < 0)
+     {
+       fprintf (stderr, "Cannot create pipe %s\n", strerror (errno));
++#ifdef HAVE_FORK
+       exit (1);
++#else
++      _exit (1);
++#endif
+     }
+ }
+ 
+@@ -89,7 +93,11 @@
+   val = 0;
+   write_all (out_fd, (char *)&val, sizeof (val));
+ 
++#ifdef HAVE_FORK
+   exit (0);
++#else
++  _exit (0);
++#endif
+ }
+ 
+ int
+@@ -100,7 +108,11 @@
+   if (!read_all (source, (char *)&val, sizeof(val)))
+     {
+       fprintf (stderr,"Unexpected EOF\n");
++#ifdef HAVE_FORK
+       exit (1);
++#else
++      _exit (1);
++#endif
+     }
+ 
+   if (val)
+@@ -128,7 +140,11 @@
+   my_pipe (in_fds);
+   my_pipe (out_fds);
+ 
++#ifdef HAVE_FORK
+   pid = fork ();
++#else
++  pid = vfork ();
++#endif
+ 
+   if (pid > 0)			/* Parent */
+     {
+@@ -151,7 +167,11 @@
+   else				/* Error */
+     {
+       fprintf (stderr,"Cannot fork: %s\n", strerror (errno));
++#ifdef HAVE_FORK
+       exit (1);
++#else
++      _exit (1);
++#endif
+     }
+ }
+ 
+diff -Nur glib-2.36.3/tests/timeloop.c glib-2.36.3_new/tests/timeloop.c
+--- glib-2.36.3/tests/timeloop.c	2013-06-03 07:20:49.000000000 +0800
++++ glib-2.36.3_new/tests/timeloop.c	2013-10-22 00:00:00.290604006 +0800
+@@ -23,7 +23,11 @@
+   if (pipe(fds) < 0)
+     {
+       fprintf (stderr, "Cannot create pipe %s\n", g_strerror (errno));
++#ifdef HAVE_FORK
+       exit (1);
++#else
++      _exit (1);
++#endif
+     }
+ 
+   channels[0] = g_io_channel_unix_new (fds[0]);
+@@ -94,7 +98,11 @@
+   write_all (out_channel, (char *)&val, sizeof (val));
+   g_timer_destroy (timer);
+ 
++#ifdef HAVE_FORK
+   exit (0);
++#else
++  _exit (0);
++#endif
+ }
+ 
+ static gboolean
+@@ -108,7 +116,11 @@
+   if (!read_all (source, (char *)&val, sizeof(val)))
+     {
+       fprintf (stderr, "Unexpected EOF\n");
++#ifdef HAVE_FORK
+       exit (1);
++#else
++      _exit (1);
++#endif
+     }
+ 
+   if (val)
+@@ -143,7 +155,11 @@
+   io_pipe (in_channels);
+   io_pipe (out_channels);
+ 
++#ifdef HAVE_FORK
+   pid = fork ();
++#else
++  pid = vfork ();
++#endif
+ 
+   if (pid > 0)			/* Parent */
+     {
+@@ -165,7 +181,11 @@
+   else				/* Error */
+     {
+       fprintf (stderr, "Cannot fork: %s\n", g_strerror (errno));
++#ifdef HAVE_FORK
+       exit (1);
++#else
++      _exit (1);
++#endif
+     }
+ }
+ 
+diff -Nur glib-2.36.3/tests/timeloop-closure.c glib-2.36.3_new/tests/timeloop-closure.c
+--- glib-2.36.3/tests/timeloop-closure.c	2013-06-10 06:03:18.000000000 +0800
++++ glib-2.36.3_new/tests/timeloop-closure.c	2013-10-22 00:06:19.054606092 +0800
+@@ -24,7 +24,11 @@
+   if (pipe(fds) < 0)
+     {
+       fprintf (stderr, "Cannot create pipe %s\n", g_strerror (errno));
++#ifdef HAVE_FORK
+       exit (1);
++#else
++      _exit (1);
++#endif
+     }
+ 
+   channels[0] = g_io_channel_unix_new (fds[0]);
+@@ -95,7 +99,11 @@
+   write_all (out_channel, (char *)&val, sizeof (val));
+   g_timer_destroy (timer);
+ 
++#ifdef HAVE_FORK
+   exit (0);
++#else
++  _exit (0);
++#endif
+ }
+ 
+ static gboolean
+@@ -109,7 +117,11 @@
+   if (!read_all (source, (char *)&val, sizeof(val)))
+     {
+       fprintf (stderr, "Unexpected EOF\n");
++#ifdef HAVE_FORK
+       exit (1);
++#else
++      _exit (1);
++#endif
+     }
+ 
+   if (val)
+@@ -145,7 +157,11 @@
+   io_pipe (in_channels);
+   io_pipe (out_channels);
+ 
++#ifdef HAVE_FORK
+   pid = fork ();
++#else
++  pid = vfork ();
++#endif
+ 
+   if (pid > 0)			/* Parent */
+     {
+@@ -169,7 +185,11 @@
+   else				/* Error */
+     {
+       fprintf (stderr, "Cannot fork: %s\n", g_strerror (errno));
++#ifdef HAVE_FORK
+       exit (1);
++#else
++      _exit (1);
++#endif
+     }
+ }
+ 
