2013年7月10日水曜日

静的ライブラリから動的ライブラリを作る

先日Linuxの静的ライブラリ(*.a)を動的ライブラリ(*.so)に変換する必要に迫られました。
最初は豆鉄砲喰らった鳩になってしまったのですが、
ネット検索していくうちに、よく考えたら簡単なことだと気がつきました。

そもそも静的ライブラリ(*.a)は複数のオブジェクトファイル(*.o)を
単に1つにまとめただけのファイルで、
コンパイラで作成したオブジェクトファイルや静的ライブラリをリンカは同列に扱います。
正確に言えば、静的ライブラリはコンパイラで作成したオブジェクトファイルを
arコマンドでまとめたものとなります。

となるとオブジェクトファイルを共有ライブラリ(*.so)に変換するのはリンカの仕事なので、
静的ライブラリを共有ライブラリに変換するのも同様にリンカの仕事ということになります。

具体的にはそれなりのCのソースコード(ここでは"test.c")を共有ライブラリにするには
$ gcc -shared -o libtest.so test.c
を実行すればいいのですが、静的ライブラリ(ここでは"libtest.a")を共有ライブラリにするには
$ ld -shared -o libtest.so --whole-archive libtest.a
を実行すればいいということになります。
大体の環境では
$ gcc -shared -o libtest.so --whole-archive libtest.a
で問題ないということでこれが正解です。
別解として、
$ ar x libtest.a
で複数のオブジェクトファイルに展開した上で、改めて共有ライブラリを作ることができます。
例えばlibtest.aに含まれるtest1.o、test2.o、test3.oが展開されたなら、
$ ld -shared test1.o test2.o test3.o -o libtest.so
で生成できます。

0 件のコメント:

コメントを投稿