--- coregrind/m_ume/main.c.orig
+++ coregrind/m_ume/main.c
@@ -49,7 +49,7 @@
 } ExeHandler;
 
 static ExeHandler exe_handlers[] = {
-#  if defined(VGO_linux) || defined(VGO_solaris) || defined(VGO_freebsd)
+#  if defined(VGO_linux) || defined(VGO_solaris) || defined(VGO_freebsd) || defined(VGO_openbsd)
    { VG_(match_ELF),    VG_(load_ELF) },
 #  elif defined(VGO_darwin)
    { VG_(match_macho),  VG_(load_macho) },
@@ -77,6 +77,19 @@
       return res;
    }
    fd = sr_Res(res);
+
+#if defined(VGO_openbsd)
+   extern Int VG_(fd_hard_limit);
+   void ML_(record_fd_open_with_given_name)(ThreadId tid, Int fd, char *pathname);
+
+   // Track opened files by Valgrind so that we can look up filenames for mapped
+   // vnodes via the recorded table, instead of relying on procfs or kvm.  This is
+   // possible as all executables and related files (dynamic linkder etc.) are all
+   // opened by host (Valgrind).
+   VG_(fd_hard_limit) = 10;
+   ML_(record_fd_open_with_given_name)(-1, fd, exe_name);
+   VG_(fd_hard_limit) = -1;
+#endif
 
    // Check we have execute permissions
    ret = VG_(check_executable)(&is_setuid, exe_name, allow_setuid);
