9107


Implementing a JIT Compiled Language with Haskell and LLVM
(<http://www.stephendiehl.com/llvm/>) を読み進めていたのですが,  
4章のExternal Functions節での, soファイルのリンクがうまくいきません.

> % gcc -fPIC -shared cbits.c -o cbits.so  
>  % ghc cbits.so --make Main.hs -o Main

とするとコンパイルは成功するのですが, 実行すると

> ./Main: error while loading shared libraries: cbits.so: cannot open shared
> object file: No such file or directory

というようなエラーを吐きます.

これが自分で書いたものだけでなく,  
git clone した <https://github.com/sdiehl/kaleidoscope/tree/master/src/chapter4>  
のソースコードでも同様のことが起こります.

一応下記のリンクに書いてある解決策に従ってMain.hsにコードを加えたのですが, 同様のエラーを吐きました.  
<https://stackoverflow.com/questions/29462859/haskell-llvm-general-jit-
calling-a-c-function-on-the-fly-stephen-diehls-tutor>

どのようにすれば, soファイルを正しくリンクできますか?  
また, この場合何が起こっていると考えられますか?

**環境**

> Ubuntu-14.04.2 LTS 64bit
>
> % ldd ./Main  
>  cbits.so => not found
>
> % ghc --version  
>  The Glorious Glasgow Haskell Compilation System, version 7.10.1
>
> % cabal --version  
>  cabal-install version 1.22.2.0  
>  using version 1.22.2.0 of the Cabal library


CC BY-SA 3.0
2015-04-13T07:08:45.940
9103
2015-04-14T04:01:35.233
2020-06-17T08:14:45.997
-1
8528
question
haskell
「Implementing a JIT Compiled Language with Haskell and LLVM」 の4章におけるsoファイルのリンク方法について


> ./Main: error while loading shared libraries: cbits.so: cannot open shared
> object file: No such file or directory

カレントディレクトリに配置されたcbits.soを、Mainの実行時に正しくロードできていません。

とりあえず動かすだけなら、環境変数`LD_LIBRARY_PATH`にカレントディレクトリを追加すれば読み込めると思います。

[code]

    % export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
    
[/code]

GHCユーザガイド [4.13. Using shared
libraries](https://www.haskell.org/platform/doc/2014.2.0.0/ghc/users_guide/using-
shared-libs.html) に、rpathオプションを指定する例が載っていました。例示の通り、カレントディレクトリからロードさせる場合は
`-optl-Wl,-rpath,'$ORIGIN'` 指定でしょうか。

~~もしくは、リンク時のコマンドを少しだけ変更すると、期待通りの動作になるかもしれません。~~

[code]

    % ghc ./cbits.so --make Main.hs -o Main
    
[/code]


CC BY-SA 3.0
2015-04-13T08:03:35.133
9107
2015-04-14T04:01:35.233
2015-04-14T04:01:35.233
49
49
9103
answer