プログラムを ELF 形式でコンパイルする場合、いつものように gcc
を使います。a.out 形式でコンパイルする場合、gcc -b
i486-linuxaout
としてください。
$ cat >hello.c
main() { printf("hello, world\n"); }
^D
$ gcc -o hello hello.c
$ file hello
hello: ELF 32-bit LSB executable i386 (386 and up) Version 1
$ ./hello
hello, world
さて、そろそろ「a.out 形式のコンパイラが出力するバイナリのデフォルト名
が a.out
なら、ELF コンパイラの出力するバイナリのデフォルト名
は何というの?」という質問に答えるべき時でしょう。答は、「やっぱり
a.out
」なんです。残念でしたか? :-)
libfoo.so
を共有ライブラリとして構築したい場合、基本的な手順
は以下のようになります。
$ gcc -fPIC -c *.c
$ gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o
$ ln -s libfoo.so.1.0 libfoo.so.1
$ ln -s libfoo.so.1 libfoo.so
$ export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
これにより、libfoo.so.1.0
と呼ばれる共有ライブラリと ld 用の
シンボリックリンク(libfoo.so
)、動的リンカ用のシンボリックリン
ク(libfoo.so.1
)が作成されます。ライブラリのテストの際は、最後
に示したように、現在のディレクトリを LD_LIBRARY_PATH
に加えて
試してみましょう。
ライブラリが正しく動くことが確認できれば、適切な場所、例えば
/usr/local/lib
に移し、リンクを張り直しましょう。
libfoo.so
のリンクは libfoo.so.1
へ張られているので、
バージョン番号のマイナーチェンジがあってもリンクを張り直す必要はありま
せん。libfoo.so.1.0
から libfoo.so.1
へのリンクは、
たいていのシステムでは ldconfig
が起動時に更新します。
$ su
# cp libfoo.so.1.0 /usr/local/lib
# /sbin/ldconfig
# ( cd /usr/local/lib ; ln -s libfoo.so.1 libfoo.so )
ELF 環境の中でも古い a.out 形式のバイナリを作成しなければならない
場合があるかも知れません。「普通の」プログラムの場合、必要なことは gcc
を起動する時に -b i486-linuxaout
フラグを使って a.out 用のコン
パイラを起動し、(もし) ld を起動する場合は -m i386linux
フラ
グを使います。a.out 形式の DLL 共有ライブラリを未だに必要とする人は、、
可哀想に。私の知る限りでは、一言で言えば「動きません」。別の方法を御存
知ならばメールで私に教えてください。