FreeBSD QandA 401
Q. a.out 形式のシェアドライブラリを作成、利用する例があったら教えてください。
A. 以下に例を説明します。
まず、同じディレクトリに shared.c、test_shared.c を以下の内容で作成
します。
以下は shared.c (共有ライブラリ) の内容です。
----------------- ここから ---------
int
shared(int a)
{
a *= 5;
return(a);
}
----------------- ここまで ---------
以下は test_shared.c (ライブラリを使用する実行ファイル) の内容です。
----------------- ここから ---------
#include <stdio.h>
extern int shared(int);
int
main(void)
{
int a;
printf("number ?:");
scanf("%d", &a);
printf("result: %d\n", shared(a));
return(0);
}
----------------- ここまで ---------
まず、シェアドライブラリを構成するオブジェクトを作成します。オプション
-fpic はシェアドライブラリを構成するオブジェクトを作成するために必要
です。オプション -c はリンクを行わないでソースをコンパイルするために
必要です。
% gcc -fpic -o libshared.SO -c shared.c
次にシェアドライブラリを作成します。
% gcc -shared -Wl,-soname,libshared.so.1 -o libshared.so.1 libshared.SO
そして、ld(1) に見つけてもらうために リンクを張ります。
% ln -s libshared.so.1 libshared.so
最後に、このシェアドライブラリを利用する実行バイナリを作成します。
% gcc -L. -lshared -Wl,-rpath=. -o main test_shared.c
さあ、実行してみましょう。"number ?:" の後に数字を入力してください。こ
こでは 5 を入力しています。
% ./main
number ?:5
result: 25
ダイナミックリンクが本当に行われているか、shared.c を変更し、
libshared.so.1.0 を再作成して、main を実行するとその変更が反映される
ことを確認しましょう。たとえば、shared.c の "a *= 5;" を "a *= 10;" に
変更します。
----参考----
コンパイル時に -fpic を付ける意味
[FreeBSD-tech-jp 2036]
<URL:[BROKEN!] http://hawk.ise.chuo-u.ac.jp/student/person/tshiozak/FreeBSD/shlib1/>
Linux とは違い、FreeBSD では lib${name}.so.X だけ作ればよい。
[FreeBSD-users-jp 60134]
-rpath や $LD_RUN_PATH の $LD_LIBRARY_PATH との違い。
共有ライブラリとのリンクから実行までの過程。
推奨されるライブラリ作成の手順。
[FreeBSD-users-jp 60135]
Executable and Linkable Format (ELF) V1.1
<URL:http://developer.intel.com/vtune/tis.htm>
The Linux Japanese FAQ Project
ELF HOW-TO, GCC HOW-TO など。
<URL:http://www.linux.or.jp/JF/JFdocs/INDEX-programming.html>
間違い・追加情報を見付けた場合は、
修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで
お知らせください。