chroot("/home/hibari")

備忘録とかに使えそうなノート

自分でビルドした任意のライブラリにリンクさせる

 

今回はお試しで短期的に使うレベルの話なので長期的に使用することは考慮していない.

デフォルトでインストールされているライブラリではなく,自分でソースコードからビルドしたライブラリにリンクさせたい.

 

振り返ると大したことはしていないが,すぐに忘れそうなので備忘録.

 

きっかけは,/usr/lib64に入っているライブラリのバージョンが古かったので新しいバージョンのライブラリをちょっと使いたかったというもの.そしてついでにいろんなバージョンも試そうと思った.

 

 

対象はGNU MPライブラリ.

The GNU MP Bignum Library

 

自分のワークディレクトリにver6.1.2ダウンロードして解凍,ビルド,インストール.

/install/dest/dirにインストールすることを仮定.

$ tar -Jxvf gmp-6.1.2.tar.xz; cd gmp-6.1.2

$ ./configure --prefix=/install/dest/dir 

$ make -j8

$ make check -j4

$ make install

makeのjオプションの数に深い意味はない.

以下は/install/dest/dirをlsしたもの.インストールされているのを確認.ここにあるライブラリにリンクさせる.

$ ls
include lib share

 

環境変数LD_PRELOADを変更する.

$ export LD_PRELOAD=/install/dest/dir/lib/libgmp.so

 

ワークディレクトリ内で,ソースコードには通常通り#include <gmp.h>を記述する.

明示的にヘッダファイルを指定するために以下のようにコンパイルする.

パスを記述するオプションはI(大文字アイ)で,使用するライブラリの指定はl(小文字エル)を使用する.

$ gcc -I/install/dest/dir/include -lgmp test.c -o test

 

共有ライブラリの依存関係を調べて指定のライブラリパスに通っているかの確認.

$ ldd test

linux-vdso.so.1 =>  (0x00007ffd727cd000)

/install/dest/dir/lib/libgmp.so (0x00007fce37ba3000)

(中略)

 

libc.so.6 => /lib64/libc.so.6 (0x00007fce37047000)

 

ちなみに,LD_PRELOADで指定せずにコンパイルしたときにはデフォルトでインストールされているライブラリにリンクされる.

$ ldd test

linux-vdso.so.1 =>  (0x00007f8f435ed000)

libgmp.so.10 => /lib64/libgmp.so.10 (0x00007f8f4334d000)

(中略)

libc.so.6 => /lib64/libc.so.6 (0x00007f8f42818000)

 

別でインストールした別バージョンのライブラリを使うときにはLD_PRELOADを書き換えてコンパイルし直すとそこにリンクさせることができるのが確認できた.

今回は自分で手打ちでexportをしているため,ログアウトしたらその環境変数は消える.