diff -Naur p11-kit-0.20.3-orig/common/Makefile.am p11-kit-0.20.3/common/Makefile.am
--- p11-kit-0.20.3-orig/common/Makefile.am	2014-02-13 11:36:35.000000000 +0400
+++ p11-kit-0.20.3/common/Makefile.am	2014-08-08 10:28:38.237400000 +0400
@@ -29,6 +29,7 @@
 	common/lexer.c common/lexer.h \
 	common/message.c common/message.h \
 	common/path.c common/path.h \
+	common/pathtools.c common/pathtools.h \
 	common/pkcs11.h common/pkcs11x.h common/pkcs11i.h \
 	common/url.c common/url.h \
 	$(NULL)
diff -Naur p11-kit-0.23.22-orig/common/meson.build p11-kit-0.23.22/common/meson.build
--- p11-kit-0.23.22-orig/common/meson.build	2014-02-13 11:36:35.000000000 +0400
+++ p11-kit-0.23.22/common/meson.build	2014-08-08 10:28:38.237400000 +0400
@@ -13,6 +13,7 @@
   'lexer.c',
   'message.c',
   'path.c',
+  'pathtools.c',
   'runtime.c',
   'url.c',
   'vsock.c'
diff -Naur p11-kit-0.20.3-orig/common/path.c p11-kit-0.20.3/common/path.c
--- p11-kit-0.20.3-orig/common/path.c	2014-02-13 11:36:36.000000000 +0400
+++ p11-kit-0.20.3/common/path.c	2014-08-07 21:51:47.704600000 +0400
@@ -57,6 +57,7 @@
 #include <shlobj.h>
 #endif
 
+#include "pathtools.h"
 
 char *
 p11_path_base (const char *path)
@@ -323,3 +324,42 @@
 			name[i] = '_';
 	}
 }
+
+char *
+p11_path_relocation(const char *path)
+{
+#if defined(__MINGW32__)
+  char exe_path[PATH_MAX];
+  get_executable_path (NULL, &exe_path[0], sizeof(exe_path)/sizeof(exe_path[0]));
+  if (strrchr (exe_path, '/') != NULL)
+  {
+     strrchr (exe_path, '/')[1] = '\0';
+  }
+  char * rel_to_datadir = get_relative_path(BINDIR, path);
+  strcat (exe_path, rel_to_datadir);
+  simplify_path (&exe_path[0]);
+  return malloc_copy_string(exe_path);
+#else
+  return malloc_copy_string(path);
+#endif
+}
+
+char *
+p11_path_trust_paths(void)
+{
+#if defined(__MINGW32__)
+  static char stored_path[PATH_MAX];
+  static int stored = 0;
+  if (stored == 0)
+  {
+    char const * relocated = get_relocated_path_list(BINDIR, TRUST_PATHS);
+    strncpy (stored_path, relocated, PATH_MAX);
+    stored_path[PATH_MAX-1] = '\0';
+    free ((void *)relocated);
+    stored = 1;
+  }
+  return stored_path;
+#else
+  return (TRUST_PATHS);
+#endif
+}
diff -Naur p11-kit-0.20.3-orig/common/path.h p11-kit-0.20.3/common/path.h
--- p11-kit-0.20.3-orig/common/path.h	2014-02-13 11:36:36.000000000 +0400
+++ p11-kit-0.20.3/common/path.h	2014-08-07 21:09:52.753000000 +0400
@@ -66,4 +66,7 @@
 
 void         p11_path_canon     (char *name);
 
+char *       p11_path_relocation(const char *path);
+char *       p11_path_trust_paths(void);
+
 #endif /* P11_PATH_H__ */
diff -Naur p11-kit-0.20.3-orig/common/pathtools.c p11-kit-0.20.3/common/pathtools.c
--- p11-kit-0.20.3-orig/common/pathtools.c	1970-01-01 03:00:00.000000000 +0300
+++ p11-kit-0.20.3/common/pathtools.c	2014-08-08 09:30:52.000000000 +0400
@@ -0,0 +1,499 @@
+/*
+      .Some useful path tools.
+        .ASCII only for now.
+   .Written by Ray Donnelly in 2014.
+   .Licensed under CC0 (and anything.
+  .else you need to license it under).
+      .No warranties whatsoever.
+  .email: <mingw.android@gmail.com>.
+ */
+
+#if defined(__APPLE__)
+#include <stdlib.h>
+#else
+#include <malloc.h>
+#endif
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#if defined(__linux__) || defined(__CYGWIN__) || defined(__MSYS__)
+#include <alloca.h>
+#endif
+#include <unistd.h>
+
+/* If you don't define this, then get_executable_path()
+   can only use argv[0] which will often not work well */
+#define IMPLEMENT_SYS_GET_EXECUTABLE_PATH
+
+#if defined(IMPLEMENT_SYS_GET_EXECUTABLE_PATH)
+#if defined(__linux__) || defined(__CYGWIN__) || defined(__MSYS__)
+/* Nothing needed, unistd.h is enough. */
+#elif defined(__APPLE__)
+#include <mach-o/dyld.h>
+#elif defined(_WIN32)
+#define WIN32_MEAN_AND_LEAN
+#include <windows.h>
+#include <psapi.h>
+#endif
+#endif /* defined(IMPLEMENT_SYS_GET_EXECUTABLE_PATH) */
+
+#include "pathtools.h"
+
+char *
+malloc_copy_string(char const * original)
+{
+  char * result = (char *) malloc (sizeof (char*) * strlen (original)+1);
+  if (result != NULL)
+  {
+    strcpy (result, original);
+  }
+  return result;
+}
+
+void
+sanitise_path(char * path)
+{
+  size_t path_size = strlen (path);
+
+  /* Replace any '\' with '/' */
+  char * path_p = path;
+  while ((path_p = strchr (path_p, '\\')) != NULL)
+  {
+    *path_p = '/';
+  }
+  /* Replace any '//' with '/' */
+  path_p = path;
+  while ((path_p = strstr (path_p, "//")) != NULL)
+  {
+    memmove (path_p, path_p + 1, path_size--);
+  }
+  return;
+}
+
+char *
+get_relative_path(char const * from_in, char const * to_in)
+{
+  size_t from_size = (from_in == NULL) ? 0 : strlen (from_in);
+  size_t to_size = (to_in == NULL) ? 0 : strlen (to_in);
+  size_t max_size = (from_size + to_size) * 2 + 4;
+  char * scratch_space = (char *) alloca (from_size + 1 + to_size + 1 + max_size + max_size);
+  char * from;
+  char * to;
+  char * common_part;
+  char * result;
+  size_t count;
+
+  /* No to, return "./" */
+  if (to_in == NULL)
+  {
+    return malloc_copy_string ("./");
+  }
+
+  /* If alloca failed or no from was given return a copy of to */
+  if (   from_in == NULL
+      || scratch_space == NULL )
+  {
+    return malloc_copy_string (to_in);
+  }
+
+  from = scratch_space;
+  strcpy (from, from_in);
+  to = from + from_size + 1;
+  strcpy (to, to_in);
+  common_part = to + to_size + 1;
+  result = common_part + max_size;
+  simplify_path (from);
+  simplify_path (to);
+
+  result[0] = '\0';
+
+  size_t match_size_dirsep = 0;  /* The match size up to the last /. Always wind back to this - 1 */
+  size_t match_size = 0;         /* The running (and final) match size. */
+  size_t largest_size = (from_size > to_size) ? from_size : to_size;
+  int to_final_is_slash = (to[to_size-1] == '/') ? 1 : 0;
+  char from_c;
+  char to_c;
+  for (match_size = 0; match_size < largest_size; ++match_size)
+  {
+    /* To simplify the logic, always pretend the strings end with '/' */
+    from_c = (match_size < from_size) ? from[match_size] : '/';
+    to_c =   (match_size <   to_size) ?   to[match_size] : '/';
+
+    if (from_c != to_c)
+    {
+      if (from_c != '\0' || to_c != '\0')
+      {
+        match_size = match_size_dirsep;
+      }
+      break;
+    }
+    else if (from_c == '/')
+    {
+      match_size_dirsep = match_size;
+    }
+  }
+  strncpy (common_part, from, match_size);
+  common_part[match_size] = '\0';
+  from += match_size;
+  to += match_size;
+  size_t ndotdots = 0;
+  char const* from_last = from + strlen(from) - 1;
+  while ((from = strchr (from, '/')) && from != from_last)
+  {
+    ++ndotdots;
+    ++from;
+  }
+  for (count = 0; count < ndotdots; ++count)
+  {
+    strcat(result, "../");
+  }
+  if (strlen(to) > 0)
+  {
+    strcat(result, to+1);
+  }
+  /* Make sure that if to ends with '/' result does the same, and
+     vice-versa. */
+  size_t size_result = strlen(result);
+  if ((to_final_is_slash == 1)
+      && (!size_result || result[size_result-1] != '/'))
+  {
+    strcat (result, "/");
+  }
+  else if (!to_final_is_slash
+           && size_result && result[size_result-1] == '/')
+  {
+    result[size_result-1] = '\0';
+  }
+
+  return malloc_copy_string (result);
+}
+
+void
+simplify_path(char * path)
+{
+  ssize_t n_toks = 1; /* in-case we need an empty initial token. */
+  ssize_t i, j;
+  size_t tok_size;
+  size_t in_size = strlen (path);
+  int it_ended_with_a_slash = (path[in_size - 1] == '/') ? 1 : 0;
+  char * result = path;
+  sanitise_path(result);
+  char * result_p = result;
+
+  do
+  {
+    ++n_toks;
+    ++result_p;
+  } while ((result_p = strchr (result_p, '/')) != NULL);
+
+  result_p = result;
+  char const ** toks = (char const **) alloca (sizeof (char const*) * n_toks);
+  n_toks = 0;
+  do
+  {
+    if (result_p > result)
+    {
+      *result_p++ = '\0';
+    }
+    else if (*result_p == '/')
+    {
+      /* A leading / creates an empty initial token. */
+      toks[n_toks++] = result_p;
+      *result_p++ = '\0';
+    }
+    toks[n_toks++] = result_p;
+  } while ((result_p = strchr (result_p, '/')) != NULL);
+
+  /* Remove all non-leading '.' and any '..' we can match
+     with an earlier forward path (i.e. neither '.' nor '..') */
+  for (i = 1; i < n_toks; ++i)
+  {
+    int removals[2] = { -1, -1 };
+    if ( strcmp (toks[i], "." ) == 0)
+    {
+      removals[0] = i;
+    }
+    else if ( strcmp (toks[i], ".." ) == 0)
+    {
+      /* Search backwards for a forward path to collapse.
+         If none are found then the .. also stays. */
+      for (j = i - 1; j > -1; --j)
+      {
+        if ( strcmp (toks[j], "." )
+          && strcmp (toks[j], ".." ) )
+        {
+          removals[0] = j;
+          removals[1] = i;
+          break;
+        }
+      }
+    }
+    for (j = 0; j < 2; ++j)
+    {
+      if (removals[j] >= 0) /* Can become -2 */
+      {
+        --n_toks;
+        memmove (&toks[removals[j]], &toks[removals[j]+1], (n_toks - removals[j])*sizeof (char*));
+        --i;
+        if (!j)
+        {
+          --removals[1];
+        }
+      }
+    }
+  }
+  result_p = result;
+  for (i = 0; i < n_toks; ++i)
+  {
+    tok_size = strlen(toks[i]);
+    memmove (result_p, toks[i], tok_size);
+    result_p += tok_size;
+    if ((!i || tok_size) && ((i < n_toks - 1) || it_ended_with_a_slash == 1))
+    {
+      *result_p = '/';
+      ++result_p;
+    }
+  }
+  *result_p = '\0';
+}
+
+/* Returns actual_to by calculating the relative path from -> to and
+   applying that to actual_from. An assumption that actual_from is a
+   dir is made, and it may or may not end with a '/' */
+char const *
+get_relocated_path (char const * from, char const * to, char const * actual_from)
+{
+  char const * relative_from_to = get_relative_path (from, to);
+  char * actual_to = (char *) malloc (strlen(actual_from) + 2 + strlen(relative_from_to));
+  return actual_to;
+}
+
+int
+get_executable_path(char const * argv0, char * result, ssize_t max_size)
+{
+  char * system_result = (char *) alloca (max_size);
+  ssize_t system_result_size = -1;
+  ssize_t result_size = -1;
+
+  if (system_result != NULL)
+  {
+#if defined(IMPLEMENT_SYS_GET_EXECUTABLE_PATH)
+#if defined(__linux__) || defined(__CYGWIN__) || defined(__MSYS__)
+    system_result_size = readlink("/proc/self/exe", system_result, max_size);
+#elif defined(__APPLE__)
+    uint32_t bufsize = (uint32_t)max_size;
+    if (_NSGetExecutablePath(system_result, &bufsize) == 0)
+    {
+      system_result_size = (ssize_t)bufsize;
+    }
+#elif defined(_WIN32)
+    unsigned long bufsize = (unsigned long)max_size;
+    system_result_size = GetModuleFileNameA(NULL, system_result, bufsize);
+    if (system_result_size == 0 || system_result_size == (ssize_t)bufsize)
+    {
+      /* Error, possibly not enough space. */
+      system_result_size = -1;
+    }
+    else
+    {
+      /* Early conversion to unix slashes instead of more changes
+         everywhere else .. */
+      char * winslash;
+      system_result[system_result_size] = '\0';
+      while ((winslash = strchr (system_result, '\\')) != NULL)
+      {
+        *winslash = '/';
+      }
+    }
+#else
+#warning "Don't know how to get executable path on this system"
+#endif
+#endif /* defined(IMPLEMENT_SYS_GET_EXECUTABLE_PATH) */
+  }
+  /* Use argv0 as a default in-case of failure */
+  if (system_result_size != -1)
+  {
+    strncpy (result, system_result, system_result_size);
+    result[system_result_size] = '\0';
+  }
+  else
+  {
+    if (argv0 != NULL)
+    {
+      strncpy (result, argv0, max_size);
+      result[max_size-1] = '\0';
+    }
+    else
+    {
+      result[0] = '\0';
+    }
+  }
+  result_size = strlen (result);
+  return result_size;
+}
+
+char const *
+strip_n_prefix_folders(char const * path, size_t n)
+{
+  if (path == NULL)
+  {
+    return NULL;
+  }
+
+  if (path[0] != '/')
+  {
+    return path;
+  }
+
+  char const * last = path;
+  while (n-- && path != NULL)
+  {
+    last = path;
+    path = strchr (path + 1, '/');
+  }
+  return (path == NULL) ? last : path;
+}
+
+void
+strip_n_suffix_folders(char * path, size_t n)
+{
+  if (path == NULL)
+  {
+    return;
+  }
+  while (n--)
+  {
+    if (strrchr (path + 1, '/'))
+    {
+      *strrchr (path + 1, '/') = '\0';
+    }
+    else
+    {
+      return;
+    }
+  }
+  return;
+}
+
+size_t
+split_path_list(char const * path_list, char split_char, char *** arr)
+{
+  size_t path_count;
+  size_t path_list_size;
+  char const * path_list_p;
+
+  path_list_p = path_list;
+  if (path_list == NULL || path_list[0] == '\0')
+  {
+    return 0;
+  }
+  path_list_size = strlen (path_list);
+
+  path_count = 0;
+  do
+  {
+    ++path_count;
+    ++path_list_p;
+  }
+  while ((path_list_p = strchr (path_list_p, split_char)) != NULL);
+
+  /* allocate everything in one go. */
+  char * all_memory = (char *) malloc (sizeof (char *) * path_count + strlen(path_list) + 1);
+  if (all_memory == NULL)
+    return 0;
+  *arr = (char **)all_memory;
+  all_memory += sizeof (char *) * path_count;
+
+  path_count = 0;
+  path_list_p = path_list;
+  char const * next_path_list_p = 0;
+  do
+  {
+    next_path_list_p = strchr (path_list_p, split_char);
+    if (next_path_list_p != NULL)
+    {
+      ++next_path_list_p;
+    }
+    size_t this_size = (next_path_list_p != NULL)
+                       ? next_path_list_p - path_list_p - 1
+                       : &path_list[path_list_size] - path_list_p;
+    memcpy (all_memory, path_list_p, this_size);
+    all_memory[this_size] = '\0';
+    (*arr)[path_count++] = all_memory;
+    all_memory += this_size + 1;
+  } while ((path_list_p = next_path_list_p) != NULL);
+
+  return path_count;
+}
+
+char *
+get_relocated_path_list(char const * from, char const * to_path_list)
+{
+  char exe_path[MAX_PATH];
+  char * temp;
+  get_executable_path (NULL, &exe_path[0], sizeof (exe_path) / sizeof (exe_path[0]));
+  if ((temp = strrchr (exe_path, '/')) != NULL)
+  {
+    temp[1] = '\0';
+  }
+
+  char **arr = NULL;
+  /* Ask Alexey why he added this. Are we not 100% sure
+     that we're dealing with unix paths here? */
+  char split_char = ':';
+  if (strchr (to_path_list, ';'))
+  {
+    split_char = ';';
+  }
+  size_t count = split_path_list (to_path_list, split_char, &arr);
+  int result_size = 1 + (count - 1); /* count - 1 is for ; delim. */
+  size_t exe_path_size = strlen (exe_path);
+  size_t i;
+  /* Space required is:
+     count * (exe_path_size + strlen (rel_to_datadir))
+     rel_to_datadir upper bound is:
+     (count * strlen (from)) + (3 * num_slashes (from))
+     + strlen(arr[i]) + 1.
+     .. pathalogically num_slashes (from) is strlen (from)
+     (from = ////////) */
+  size_t space_required = (count * (exe_path_size + 4 * strlen (from))) + count - 1;
+  for (i = 0; i < count; ++i)
+  {
+    space_required += strlen (arr[i]);
+  }
+  char * scratch = (char *) alloca (space_required);
+  if (scratch == NULL)
+    return NULL;
+  for (i = 0; i < count; ++i)
+  {
+    char * rel_to_datadir = get_relative_path (from, arr[i]);
+    scratch[0] = '\0';
+    arr[i] = scratch;
+    strcat (scratch, exe_path);
+    strcat (scratch, rel_to_datadir);
+    simplify_path (arr[i]);
+    size_t arr_i_size = strlen (arr[i]);
+    result_size += arr_i_size;
+    scratch = arr[i] + arr_i_size + 1;
+  }
+  char * result = (char *) malloc (result_size);
+  if (result == NULL)
+  {
+    return NULL;
+  }
+  result[0] = '\0';
+  for (i = 0; i < count; ++i)
+  {
+    strcat (result, arr[i]);
+    if (i != count-1)
+    {
+#if defined(_WIN32)
+      strcat (result, ";");
+#else
+      strcat (result, ":");
+#endif
+    }
+  }
+  free ((void*)arr);
+  return result;
+}
diff -Naur p11-kit-0.20.3-orig/common/pathtools.h p11-kit-0.20.3/common/pathtools.h
--- p11-kit-0.20.3-orig/common/pathtools.h	1970-01-01 03:00:00.000000000 +0300
+++ p11-kit-0.20.3/common/pathtools.h	2014-08-08 09:30:52.000000000 +0400
@@ -0,0 +1,49 @@
+/*
+      .Some useful path tools.
+        .ASCII only for now.
+   .Written by Ray Donnelly in 2014.
+   .Licensed under CC0 (and anything.
+  .else you need to license it under).
+      .No warranties whatsoever.
+  .email: <mingw.android@gmail.com>.
+ */
+
+#ifndef PATHTOOLS_H
+#define PATHTOOLS_H
+
+#include <unistd.h>
+#if defined(__APPLE__)
+#include <stdlib.h>
+#else
+#include <malloc.h>
+#endif
+#include <stdio.h>
+
+char * malloc_copy_string(char const * original);
+
+/* In-place replaces any '\' with '/' and any '//' with '/' */
+void sanitise_path(char * path);
+
+/* Uses a host OS specific function to determine the path of the executable,
+   if IMPLEMENT_SYS_GET_EXECUTABLE_PATH is defined, otherwise uses argv0. */
+int get_executable_path(char const * argv0, char * result, ssize_t max_size);
+
+/* Where possible, in-place removes occourances of '.' and 'path/..' */
+void simplify_path(char * path);
+
+/* Allocates (via malloc) and returns the path to get from from to to. */
+char * get_relative_path(char const * from, char const * to);
+
+size_t split_path_list(char const * path_list, char split_char, char *** arr);
+
+/* Advances path along by the amount that removes n prefix folders. */
+char const *
+strip_n_prefix_folders(char const * path, size_t n);
+
+/* NULL terminates path to remove n suffix folders. */
+void
+strip_n_suffix_folders(char * path, size_t n);
+
+char * get_relocated_path_list(char const * from, char const * to_path_list);
+
+#endif /* PATHTOOLS_H */
diff -Naur p11-kit-0.20.3-orig/p11-kit/modules.c p11-kit-0.20.3/p11-kit/modules.c
--- p11-kit-0.20.3-orig/p11-kit/modules.c	2014-07-04 17:48:45.000000000 +0400
+++ p11-kit-0.20.3/p11-kit/modules.c	2014-08-07 21:07:43.886200000 +0400
@@ -348,8 +348,9 @@
 	return_val_if_fail (mod != NULL, CKR_HOST_MEMORY);
 
 	if (!p11_path_absolute (path)) {
-		p11_debug ("module path is relative, loading from: %s", P11_MODULE_PATH);
-		path = expand = p11_path_build (P11_MODULE_PATH, path, NULL);
+		char * mods_path = p11_path_relocation(P11_MODULE_PATH);
+		p11_debug ("module path is relative, loading from: %s", mods_path);
+		path = expand = p11_path_build (mods_path, path, NULL);
 		return_val_if_fail (path != NULL, CKR_HOST_MEMORY);
 	}
 
@@ -567,15 +568,18 @@
 		return CKR_OK;
 
 	/* Load the global configuration files */
-	config = _p11_conf_load_globals (p11_config_system_file, p11_config_user_file, &mode);
+	char * system_conf = p11_path_relocation(p11_config_system_file);
+	config = _p11_conf_load_globals (system_conf, p11_config_user_file, &mode);
 	if (config == NULL)
 		return CKR_GENERAL_ERROR;
 
 	assert (mode != CONF_USER_INVALID);
 
+  char * pack_mod_path = p11_path_relocation(p11_config_package_modules);
+  char * sys_mod_path = p11_path_relocation(p11_config_system_modules);
 	configs = _p11_conf_load_modules (mode,
-	                                  p11_config_package_modules,
-	                                  p11_config_system_modules,
+	                                  pack_mod_path,
+	                                  sys_mod_path,
 	                                  p11_config_user_modules);
 	if (configs == NULL) {
 		rv = CKR_GENERAL_ERROR;
diff -Naur p11-kit-0.20.3-orig/trust/module.c p11-kit-0.20.3/trust/module.c
--- p11-kit-0.20.3-orig/trust/module.c	2014-02-13 11:36:36.000000000 +0400
+++ p11-kit-0.20.3/trust/module.c	2014-08-07 21:08:57.310600000 +0400
@@ -195,14 +195,16 @@
 	 * strings will not change arbitrarily.
 	 */
 
+    const char * _datadir = p11_path_relocation(P11_DEFAULT_TRUST_PREFIX);
+    const char * _sysconfigir = p11_path_relocation(P11_SYSTEM_TRUST_PREFIX);
 	struct {
 		const char *prefix;
 		const char *label;
 		int flags;
 	} labels[] = {
 		{ "~/", "User Trust", P11_TOKEN_FLAG_NONE },
-		{ P11_DEFAULT_TRUST_PREFIX, "Default Trust", P11_TOKEN_FLAG_WRITE_PROTECTED },
-		{ P11_SYSTEM_TRUST_PREFIX, "System Trust", P11_TOKEN_FLAG_NONE },
+		{ _datadir, "Default Trust", P11_TOKEN_FLAG_WRITE_PROTECTED },
+		{ _sysconfigir, "System Trust", P11_TOKEN_FLAG_NONE },
 		{ NULL },
 	};
 
@@ -391,7 +393,8 @@
 			                            NULL, p11_session_free);
 
 			gl.tokens = p11_array_new ((p11_destroyer)p11_token_free);
-			if (gl.tokens && !create_tokens_inlock (gl.tokens, gl.paths ? gl.paths : TRUST_PATHS))
+			char * tr_path = p11_path_trust_paths();
+			if (gl.tokens && !create_tokens_inlock (gl.tokens, gl.paths ? gl.paths : tr_path))
 				gl.tokens = NULL;
 
 			if (gl.sessions == NULL || gl.tokens == NULL) {
diff -Naur p11-kit-0.21.3-orig/trust/extract.c p11-kit-0.21.3/trust/extract.c
--- p11-kit-0.21.3-orig/trust/extract.c	2013-06-21 20:49:16.000000000 +0400
+++ p11-kit-0.21.3/trust/extract.c	2014-08-07 11:59:59.028400000 +0400
@@ -298,14 +298,15 @@
 	 * For compatibility with people who deployed p11-kit 0.18.x
 	 * before trust stuff was put into its own branch.
 	 */
-	path = p11_path_build (PRIVATEDIR, "p11-kit-extract-trust", NULL);
+	const char * _privdir = p11_path_relocation(PRIVATEDIR);
+	path = p11_path_build (_privdir, "p11-kit-extract-trust", NULL);
 	return_val_if_fail (path != NULL, 1);
 	execv (path, argv);
 	error = errno;
 
 	if (error == ENOENT) {
 		free (path);
-		path = p11_path_build (PRIVATEDIR, "trust-extract-compat", NULL);
+		path = p11_path_build (_privdir, "trust-extract-compat", NULL);
 		return_val_if_fail (path != NULL, 1);
 		execv (path, argv);
 		error = errno;
diff -Naur p11-kit-0.20.3-orig/trust/p11-kit-trust.module p11-kit-0.20.3/trust/p11-kit-trust.module
--- p11-kit-0.20.3-orig/trust/p11-kit-trust.module	2013-06-21 20:49:16.000000000 +0400
+++ p11-kit-0.20.3/trust/p11-kit-trust.module	2014-08-07 11:59:59.028400000 +0400
@@ -1,7 +1,7 @@
 # See pkcs11.conf(5) to understand this file
 
 # This is a module config for the 'included' p11-kit trust module
-module: p11-kit-trust.so
+module: p11-kit-trust.dll
 
 # This setting affects the order that trust policy and other information
 # is looked up when going across various modules. Other trust policy modules
diff -Naur p11-kit-0.20.3-orig/p11-kit/p11-kit.c p11-kit-0.20.3/p11-kit/p11-kit.c
--- p11-kit-0.20.3-orig/p11-kit/p11-kit.c	2014-07-04 14:48:45.000000000 +0100
+++ p11-kit-0.20.3/p11-kit/p11-kit.c	2014-08-27 17:42:24.949805700 +0100
@@ -74,7 +74,7 @@
 	args = calloc (argc + 2, sizeof (char *));
 	return_val_if_fail (args != NULL, 1);
 
-	args[0] = BINDIR "/trust";
+	args[0] = p11_path_relocation(BINDIR "/trust");
 	memcpy (args + 1, argv, sizeof (char *) * argc);
 	args[argc + 1] = NULL;
 
@@ -83,6 +83,7 @@
 	/* At this point we have no command */
 	p11_message_err (errno, "couldn't run trust tool");
 
+	free (argv[0]);
 	free (args);
 	return 2;
 }
@@ -113,7 +113,7 @@
 
 	private_dir = secure_getenv ("P11_KIT_PRIVATEDIR");
 	if (!private_dir || !private_dir[0])
-		private_dir = PRIVATEDIR;
+		private_dir = p11_path_relocation(PRIVATEDIR);
 
 	/* Add our libexec directory to the path */
 	path = p11_path_build (private_dir, filename, NULL);
