ghci在使用外国c调用时给出了ghc恐慌

时间:2017-06-22 10:17:35

标签: haskell linker read-eval-print-loop ffi ghci

我正在尝试在一个项目中使用ghci / stack repl,其中一个模块将外部调用链接到C lib tdsodbc,但我一直在

ghc: panic! (the 'impossible' happened)
  (GHC version 7.10.3 for x86_64-unknown-linux):
    Loading temp shared object failed: /tmp/ghc4628_0/libghc_71.so: undefined symbol: SQLPrepareW

(其中SQLPrepareW在C lib中定义)。使用堆栈构建工作正常。即使在没有实际调用外部函数的情况下,即使在刚刚发生导入外部调用模块的其他模块上也会发生这种情况。它不会在加载时发生,但只要我尝试完全评估repl中的任何函数。

如何判断ghci是否在ghc之外的库中定义了一些函数?

我已经尝试了-l选项(例如stack exec ghci -- -ltdsodbc),但唯一的区别是错误消息中来自同一个lib的不同函数:

ghc: panic! (the 'impossible' happened)
  (GHC version 7.10.3 for x86_64-unknown-linux):
        Loading temp shared object failed: /tmp/ghc24107_0/libghc_25.so: undefined symbol: SQLDriverConnectW

请注意,使用-l时显然正在检查lib,因为如果我拼错它,它会说它无法找到它:

$ stack exec ghci -- -L/usr/lib/x86_64-linux-gnu/odbc  -ltdsodbctypo
Warning (added by new or init): Specified resolver could not satisfy all dependencies. Some external packages have been added as dependencies.
You can suppress this message by removing it from stack.yaml

GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
<command line>: user specified .o/.so/.DLL could not be loaded (libtdsodbctypo.so: cannot open shared object file: No such file or directory)
Whilst trying to load:  (dynamic) tdsodbctypo
Additional directories searched:   /usr/lib/x86_64-linux-gnu/odbc

这是

$ stack --version
Version 1.4.0, Git revision e714f1dd3fade19496d91bd6a017e435a96a6bcd (4640 commits) x86_64 hpack-0.17.0

我也尝试了stack ghci --ghci-options '-ltdsodbc -fobject-code',但它也会因undefined symbol: SQLPrepareW而感到恐慌。

1 个答案:

答案 0 :(得分:0)

freenode上#haskell的好人说,也许我应该尝试将-fobject-code传递给ghci。那不行。我尝试:set:seti查看它是否已设置,但ghci没有显示有关目标代码的任何信息。 (执行:unset -fobject-code只是给了Some flags have not been recognized: -fno-object-code。)

然后今天我碰巧看了我的~/.ghci其他原因,确实:set -fobject-code,即使:set / {{1}没有表明。从我的:seti删除:set -fobject-code消除了恐慌攻击,我现在可以使用导入定义外部函数的模块的模块中的函数:)

实际上从ghci调用任何外来函数会导致段错误(感兴趣的catchsegv log),但至少我现在可以测试纯粹的东西......