FreeBSD QandA 401

FreeBSD QandA

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 まで お知らせください。