LoginSignup
0
0

More than 5 years have passed since last update.

x10のプログラムをstatic linkする

Posted at

x10で書かれたプログラムをビルドされたバイナリ形式で配布して、ユーザーがx10ランタイムをインストールしなくても使えるようにしたい。
デフォルトではx10のランタイムは共有ライブラリにdynamic linkされるので、それをstaticにリンクする方法。

前提条件

  • x10 2.6.1
  • Native x10 (JavaではなくC++のバックエンド)
  • Linux

デフォルトでの挙動

x10の公式サイトから配布されているx10コンパイラ(x10c)は、x10プログラムをコンパイルした後、x10のランタイムライブラリとdynamic linkする。

$ x10c++ -d build -o hello.out Hello.x10
$ ldd hello.out    # lddコマンドでどの共有ライブラリにリンクされているか表示される
        ...
    libx10.so =>  /home/..../x10/x10.dist/stdlib/lib/libx10.so
    libgc.so.1 => /home/..../x10/x10.dist/lib/libgc.so.1
    ...
    libx10rt_sockets.so => /home/..../x10/x10.dist/lib/libx10rt_sockets.so
        ...

この通り、libx10.so, libgc.so, libx10rt_sockets.soの3つのファイル動的リンクされている。
一般のLinux環境ではこれらの共有ライブラリが無いので、これらをstatic linkしたい。

方法

配布されているコンパイラは.aファイルを持っていないので、x10コンパイラとランタイムをソースからビルドする必要がある。
その際に環境変数X10_STATIC_LIB=1をセットすると静的なランタイムライブラリがビルドされる。

git clone git@github.com:x10-lang/x10.git
cd x10
# 必要であれば特定のタグをcheckout
cd x10.dist
export X10_STATIC_LIB=1     # static libraryを利用するためのフラグを環境変数で指定
ant dist                    # 必要に応じて -Davailable.procs=... -Doptimize=true -DNO_CHECKS=true
ls lib                      # lib/以下に.aファイルができているはず
ls stdlib/lib               # 同上

これでstatic linkする準備は整った。
しかし、この状態でコンパイルをしてもlibgcだけが動的リンクされたままになってしまう。
(これはx10のバグかもしれないのでgithubでissueを立てた。)

強制的にstatic linkするためにlibgc.so*を削除して.aだけ存在するようにする

rm -f lib/libgc.so*

これ以降x10c++でコンパイルすればstatic linkされるようになる。

注意事項

この方法はmacOS(clang利用)の場合、リンカオプションが適切にセットされないようでうまくいかない。(これもx10のバグ?)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0