In message <_A388@delegate-ja.ML_> on 02/10/10(13:51:44) you 野村 真路 <pk4aqbrv6-au47wksucm6o.ml@delegate.org> wrote: |お世話になっております。野村です。 ... |Delegate のコンパイル環境(gccコンパイラにて)と |稼働環境(gccコンパイラ 未)が異なり、 |稼働環境にはコンパイル環境時のライブラリが存在しない場合、 |稼働環境にて、Delegateを正常起動させる方法は、 |どのような方法がございますでしょうか。 一般的に、 1) 使用するライブラリを組み込む(静的にリンクする) ○何処へ持っていっても動く ×実行ファイルは大きくなる ×静的ライブラリが用意されてない場合がある ×組み込み配布が著作権上許可されてない場合がある 2) 必要な動的ライブラリを実行環境上に用意する ○実行ファイルは自体小さくて済む ×動的ライブラリがないと動かない ×root権限で/libやら/usr/libをいじらないといけない のどちらかかと思います。 どのような動的ライブラリが必要とされているかは、通常実際に実行した時の エラーメッセージ等に表示されると思います。参照されるライブラリの一覧を 見る方法はOSによって異なりますが、例えばLinuxでは、以下のような感じです。 % ldd src/delegated linux-gate.so.1 => (0x00ae9000) libnsl.so.1 => /lib/libnsl.so.1 (0x0022e000) libdl.so.2 => /lib/libdl.so.2 (0x0046b000) libutil.so.1 => /lib/libutil.so.1 (0x06063000) libpthread.so.0 => /lib/libpthread.so.0 (0x00471000) libpam.so.0 => /lib/libpam.so.0 (0x00795000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x02000000) libc.so.6 => /lib/libc.so.6 (0x002fd000) /lib/ld-linux.so.2 (0x002df000) libaudit.so.0 => /lib/libaudit.so.0 (0x007a3000) libm.so.6 => /lib/libm.so.6 (0x00442000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x020ed000) % ls -l src/d*d -rwxr-xr-x 1 yutaka yutaka 4172668 Feb 11 06:13 src/delegated % size src/d*d text data bss dec hex filename 3774073 60580 245000 000000X 3e4125 src/delegated % file src/d*d src/delegated: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped 全てのライブラリを静的にリンクしてしまう方法は、OSによりますが、リンカの オプションとして -Bstatic とか -static とか指定します。 そのためには、src/DELEGATE_CONF の中に、 LDOPTS=-static -Bstatic などと書きます。ただ、これはうまくいかない場合があり、またバイナリがかなり 大きくなります。 一方、問題のライブラリだけ静的にリンクするには、ライブラリの指定を -lxxx の かわりに、/path/of/libxxx.a のように、静的ライブラリを指定してやる方法が あります。 例えば libstdc++.so.6 を動的に参照しないようにするとします。在処を調べると、 % find /usr -ls | grep stdc++.a 1444305 1976 -rw-r--r-- 1 root root 2011770 May 27 2008 /usr/lib/gcc/i386-redhat-linux/4.1.1/libstdc++.a ということなので、これを使用することにします。 デフォルトでのmakeをしてできる src/Makefile.go の中から、参照されている ライブラリを調べます。 % grep ^NETLIB= src/Makefile.go NETLIB=-lnsl -ldl -lutil -lpthread -lpam -lstdc++ そこで、src/DELEGATE_CONF の中に、-lstdc++ の代わりに NETLIB=-lnsl -ldl -lutil -lpthread -lpam /usr/lib/gcc/i386-redhat-linux/4.1.1/libstdc++.a などと書いて、makeします。すると、以下のようになります。 % ldd src/delegated linux-gate.so.1 => (0x00c03000) libnsl.so.1 => /lib/libnsl.so.1 (0x0022e000) libdl.so.2 => /lib/libdl.so.2 (0x0046b000) libutil.so.1 => /lib/libutil.so.1 (0x06063000) libpthread.so.0 => /lib/libpthread.so.0 (0x00471000) libpam.so.0 => /lib/libpam.so.0 (0x00795000) libc.so.6 => /lib/libc.so.6 (0x002fd000) /lib/ld-linux.so.2 (0x002df000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x020ed000) libaudit.so.0 => /lib/libaudit.so.0 (0x007a3000) % ls -l src/d*d -rwxr-xr-x 1 yutaka yutaka 4218871 Feb 11 07:06 src/delegated % size src/d*d text data bss dec hex filename 3809802 62672 261000 000000X 3f152a src/delegated % file src/d*d src/delegated: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 9 9 ┌─┐┬┌──┬┐ //\^^ ( e ); {Do the more with the less -- B. Fuller} ├─┤│└─┐│ / 877m\_< >_ <URL:http://www.delegate.org/delegate/> ┴ └┴──┘┴────────────────────────────── 佐藤豊@情報技術研究部門.産業技術総合研究所(独立行政法人)