diff --git a/pkgs/development/libraries/mesa/default.nix b/pkgs/development/libraries/mesa/default.nix
index 3475a5997ea..5ff884fd3c1 100644
--- a/pkgs/development/libraries/mesa/default.nix
+++ b/pkgs/development/libraries/mesa/default.nix
@@ -26,7 +26,7 @@ if ! lists.elem stdenv.system platforms.mesaPlatforms then
 else
 
 let
-  version = "13.0.0";
+  version = "12.0.3";
   branch  = head (splitString "." version);
   driverLink = "/run/opengl-driver" + optionalString stdenv.isi686 "-32";
 in
@@ -40,7 +40,7 @@ stdenv.mkDerivation {
       "ftp://ftp.freedesktop.org/pub/mesa/older-versions/${branch}.x/${version}/mesa-${version}.tar.xz"
       "https://launchpad.net/mesa/trunk/${version}/+download/mesa-${version}.tar.xz"
     ];
-    sha256 = "09yp4wh89srxqqzsnrqgw4gmx68mgxic5nbrprl6l1l2zzmv9vcl";
+    sha256 = "1dc86dd9b51272eee1fad3df65e18cda2e556ef1bc0b6e07cd750b9757f493b1";
   };
 
   prePatch = "patchShebangs .";
@@ -51,7 +51,11 @@ stdenv.mkDerivation {
   patches = [
     ./glx_ro_text_segm.patch # fix for grsecurity/PaX
     ./symlink-drivers.patch
-  ];
+  ] ++ optional stdenv.isLinux
+      (substituteAll {
+        src = ./dlopen-absolute-paths.diff;
+        libudev = systemd.lib;
+      });
 
   postPatch = ''
     substituteInPlace src/egl/main/egldriver.c \
diff --git a/pkgs/development/libraries/mesa/dlopen-absolute-paths.diff b/pkgs/development/libraries/mesa/dlopen-absolute-paths.diff
new file mode 100644
index 00000000000..9a522657223
--- /dev/null
+++ b/pkgs/development/libraries/mesa/dlopen-absolute-paths.diff
@@ -0,0 +1,22 @@
+diff --git a/loader.c b/loader.c
+index 4fdf3c2..69ea22d 100644
+--- a/src/loader/loader.c
++++ b/src/loader/loader.c
+@@ -112,7 +112,7 @@ static void *udev_handle = NULL;
+ static void *
+ udev_dlopen_handle(void)
+ {
+-   char name[80];
++   char name[256];
+    unsigned flags = RTLD_NOLOAD | RTLD_LOCAL | RTLD_LAZY;
+    int version;
+ 
+@@ -126,7 +126,7 @@ udev_dlopen_handle(void)
+    /* First try opening an already linked libudev, then try loading one */
+    do {
+       for (version = 1; version >= 0; version--) {
+-         snprintf(name, sizeof(name), "libudev.so.%d", version);
++         snprintf(name, sizeof(name), "@libudev@/lib/libudev.so.%d", version);
+          udev_handle = dlopen(name, flags);
+          if (udev_handle)
+             return udev_handle;