diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 5.1.3 (2018-01-06)
+
+* Add bindings to `loadLibraryPermamently` and `getSymbolAddressInProcess`.
+
 ## 5.1.2 (2017-12-19)
 
 * Reupload of 5.1.1 since [Hackage broke](https://github.com/haskell/hackage-server/issues/643) during the original upload.
diff --git a/llvm-hs.cabal b/llvm-hs.cabal
--- a/llvm-hs.cabal
+++ b/llvm-hs.cabal
@@ -1,5 +1,5 @@
 name: llvm-hs
-version: 5.1.2
+version: 5.1.3
 license: BSD3
 license-file: LICENSE
 author: Anthony Cowley, Stephen Diehl, Moritz Kiefer <moritz.kiefer@purelyfunctional.org>, Benjamin S. Scarlet
@@ -156,6 +156,7 @@
     LLVM.Internal.FFI.Constant
     LLVM.Internal.FFI.Context
     LLVM.Internal.FFI.DataLayout
+    LLVM.Internal.FFI.DynamicLibrary
     LLVM.Internal.FFI.ExecutionEngine
     LLVM.Internal.FFI.Function
     LLVM.Internal.FFI.GlobalAlias
@@ -177,6 +178,7 @@
     LLVM.Internal.FFI.PassManager
     LLVM.Internal.FFI.PtrHierarchy
     LLVM.Internal.FFI.RawOStream
+    LLVM.Internal.FFI.RTDyldMemoryManager
     LLVM.Internal.FFI.ShortByteString
     LLVM.Internal.FFI.SMDiagnostic
     LLVM.Internal.FFI.Target
@@ -185,6 +187,8 @@
     LLVM.Internal.FFI.Type
     LLVM.Internal.FFI.User
     LLVM.Internal.FFI.Value
+    LLVM.Internal.Linking
+    LLVM.Linking
     LLVM.Module
     LLVM.OrcJIT
     LLVM.PassManager
@@ -221,6 +225,7 @@
     src/LLVM/Internal/FFI/OrcJITC.cpp
     src/LLVM/Internal/FFI/RawOStreamC.cpp
     src/LLVM/Internal/FFI/PassManagerC.cpp
+    src/LLVM/Internal/FFI/RTDyldMemoryManager.cpp
     src/LLVM/Internal/FFI/SMDiagnosticC.cpp
     src/LLVM/Internal/FFI/TargetC.cpp
     src/LLVM/Internal/FFI/TypeC.cpp
diff --git a/src/LLVM/Internal/FFI/DynamicLibrary.hs b/src/LLVM/Internal/FFI/DynamicLibrary.hs
new file mode 100644
--- /dev/null
+++ b/src/LLVM/Internal/FFI/DynamicLibrary.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+
+-- | FFI functions for handling the DynamicLibrary class
+module LLVM.Internal.FFI.DynamicLibrary where
+
+import LLVM.Prelude
+
+import Foreign.C
+
+import LLVM.Internal.FFI.LLVMCTypes
+
+-- | <https://llvm.org/doxygen/Support_8h.html#a6fc1331c1a6d2cc6f0fda94f4a4636f9>
+foreign import ccall safe "LLVMLoadLibraryPermanently" loadLibraryPermanently ::
+  CString -> IO LLVMBool
diff --git a/src/LLVM/Internal/FFI/RTDyldMemoryManager.cpp b/src/LLVM/Internal/FFI/RTDyldMemoryManager.cpp
new file mode 100644
--- /dev/null
+++ b/src/LLVM/Internal/FFI/RTDyldMemoryManager.cpp
@@ -0,0 +1,14 @@
+#define __STDC_LIMIT_MACROS
+
+#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
+
+using namespace llvm;
+
+extern "C" {
+
+uint64_t LLVM_Hs_GetSymbolAddressInProcess(const char *name) {
+    std::string nameStr(name);
+    return RTDyldMemoryManager::getSymbolAddressInProcess(nameStr);
+}
+
+}
diff --git a/src/LLVM/Internal/FFI/RTDyldMemoryManager.hs b/src/LLVM/Internal/FFI/RTDyldMemoryManager.hs
new file mode 100644
--- /dev/null
+++ b/src/LLVM/Internal/FFI/RTDyldMemoryManager.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+
+-- | FFI functions for handling the RTDyldMemoryManager class
+module LLVM.Internal.FFI.RTDyldMemoryManager where
+
+import LLVM.Prelude
+
+import Data.Word
+import Foreign.C.String
+
+-- | <https://llvm.org/doxygen/classllvm_1_1RTDyldMemoryManager.html#a5fee247bdc0c5af393b66bfd73a0a347>
+foreign import ccall safe "LLVM_Hs_GetSymbolAddressInProcess" getSymbolAddressInProcess ::
+  CString -> IO Word64
diff --git a/src/LLVM/Internal/Linking.hs b/src/LLVM/Internal/Linking.hs
new file mode 100644
--- /dev/null
+++ b/src/LLVM/Internal/Linking.hs
@@ -0,0 +1,30 @@
+module LLVM.Internal.Linking
+  ( loadLibraryPermanently
+  , getSymbolAddressInProcess
+  )where
+
+import LLVM.Prelude
+
+import qualified Data.ByteString as BS
+import Foreign.C.String
+import Foreign.Ptr
+import LLVM.Internal.Coding
+import qualified LLVM.Internal.FFI.DynamicLibrary as DL
+import qualified LLVM.Internal.FFI.RTDyldMemoryManager as Dyld
+import LLVM.Internal.OrcJIT
+
+-- | Get the address of the given symbol in
+--   the current process' address space.
+getSymbolAddressInProcess
+  :: MangledSymbol -> IO WordPtr
+getSymbolAddressInProcess (MangledSymbol sym)
+  = fromIntegral <$> BS.useAsCString sym Dyld.getSymbolAddressInProcess
+
+-- | Loads the given dynamic library permanently. If 'Nothing'
+--   is given, this will make the symbols from the current
+--   process available.
+loadLibraryPermanently
+  :: Maybe FilePath
+  -> IO Bool
+loadLibraryPermanently (Just fp) = decodeM =<< withCString fp DL.loadLibraryPermanently
+loadLibraryPermanently Nothing = decodeM =<< DL.loadLibraryPermanently nullPtr
diff --git a/src/LLVM/Linking.hs b/src/LLVM/Linking.hs
new file mode 100644
--- /dev/null
+++ b/src/LLVM/Linking.hs
@@ -0,0 +1,7 @@
+-- | Utility functions for resolving external symbols
+module LLVM.Linking
+  ( loadLibraryPermanently
+  , getSymbolAddressInProcess
+  ) where
+
+import LLVM.Internal.Linking
