diff --git a/Makefile.am b/Makefile.am
index 1641bdf6..173b7c6f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -26,6 +26,8 @@ UTIL_FILES = \
endian.hpp \
except.cpp \
except.hpp \
+ exe.cpp \
+ exe.hpp \
extent.cpp \
extent.hpp \
fixed.cpp \
diff --git a/exe.cpp b/exe.cpp
new file mode 100644
index 00000000..fc1ac3c3
--- /dev/null
+++ b/exe.cpp
@@ -0,0 +1,62 @@
+/*
+ * This file is part of libgim.
+ *
+ * libgim is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * libgim is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with libgim. If not, see .
+ *
+ * Copyright 2010-2012 Danny Robson
+ */
+
+
+#include "exe.hpp"
+
+#include "platform.hpp"
+
+#ifdef PLATFORM_LINUX
+
+#include "types.hpp"
+#include "except.hpp"
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+boost::filesystem::path
+util::image_path (void) {
+ static const char PROC_SELF[] = "/proc/self/exe";
+
+ // We can't use lstat to check the size of the link in proc, as Linux
+ // will return 0 for most entries under proc. Instead we've got to
+ // iterate for a correct size.
+
+ std::vector resolved (256);
+
+retry:
+ const auto written = readlink (PROC_SELF, resolved.data (), resolved.size ());
+ if (written < 0)
+ errno_error::throw_code ();
+
+ if (sign_cast (written) == resolved.size ()) {
+ resolved.resize (resolved.size () * 2);
+ goto retry;
+ }
+
+ return boost::filesystem::path (resolved.data (), resolved.data () + written);
+}
+
+#else
+ #error "Unknown platform"
+#endif
diff --git a/exe.hpp b/exe.hpp
new file mode 100644
index 00000000..0f9de036
--- /dev/null
+++ b/exe.hpp
@@ -0,0 +1,29 @@
+/*
+ * This file is part of libgim.
+ *
+ * libgim is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * libgim is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with libgim. If not, see .
+ *
+ * Copyright 2010-2012 Danny Robson
+ */
+
+#ifndef __UTIL_EXE_HPP
+#define __UTIL_EXE_HPP
+
+#include
+
+namespace util {
+ boost::filesystem::path image_path (void);
+}
+
+#endif