on master help sign in
First check for exact filename when dynamically loading C lib
ace080cDavid Christiansen
src/Util/DynamicLinker.hs+7−2
@@ -5,6 +5,7 @@ module Util.DynamicLinker where
5
5
6import Foreign.LibFFI
6import Foreign.LibFFI
7import Foreign.Ptr (nullPtr, FunPtr, nullFunPtr,castPtrToFunPtr)
7import Foreign.Ptr (nullPtr, FunPtr, nullFunPtr,castPtrToFunPtr)
8+import System.Directory
8#ifndef WINDOWS
9#ifndef WINDOWS
9import System.Posix.DynamicLinker
10import System.Posix.DynamicLinker
10#else
11#else
@@ -32,7 +33,9 @@ data DynamicLib = Lib { lib_name :: String
32
33
33#ifndef WINDOWS
34#ifndef WINDOWS
34tryLoadLib :: String -> IO (Maybe DynamicLib)
35tryLoadLib :: String -> IO (Maybe DynamicLib)
35−tryLoadLib lib = do handle <- dlopen (lib ++ "." ++ hostDynamicLibExt) [RTLD_NOW]
36+tryLoadLib lib = do exactName <- doesFileExist lib
37+ let filename = if exactName then lib else lib ++ "." ++ hostDynamicLibExt
38+ handle <- dlopen filename [RTLD_NOW]
36 if undl handle == nullPtr
39 if undl handle == nullPtr
37 then return Nothing
40 then return Nothing
38 else return . Just $ Lib lib handle
41 else return . Just $ Lib lib handle
@@ -45,7 +48,9 @@ tryLoadFn fn (Lib _ h) = do cFn <- dlsym h fn
45 else return . Just $ Fun fn cFn
48 else return . Just $ Fun fn cFn
46#else
49#else
47tryLoadLib :: String -> IO (Maybe DynamicLib)
50tryLoadLib :: String -> IO (Maybe DynamicLib)
48−tryLoadLib lib = do handle <- loadLibrary (lib ++ "." ++ hostDynamicLibExt)
51+tryLoadLib lib = do exactName <- doesFileExist lib
52+ let filename = if exactName then lib else lib ++ "." ++ hostDynamicLibExt
53+ handle <- loadLibrary filename
49 if handle == nullPtr
54 if handle == nullPtr
50 then return Nothing
55 then return Nothing
51 else return . Just $ Lib lib handle
56 else return . Just $ Lib lib handle