実行可能形式そのものに共有ライブラリパスを指定させる

はじめに

 共有ライブラリの場所は、LD_LIBLARY_PATHだけだと思っていたが、実行可能形式そのものに指定することもできると知った。それを試した。
今回試すために使ったファイル群を下記に置く。
https://github.com/tomohikoseven/rpath

実行可能形式に指定する方法

 gcc でのリンク時に rpath を指定して行う。具体的には以下。

all:main.o fibso
	$(CC) -Xlinker -rpath -Xlinker ./ -o fib main.o libfib.so
#	$(CC) -Xlinker -rpath -Xlinker /home/andre/work/liba/fib-1.0.0 -o fib main.o libfib.so

下のほうはコメントアウトになっているが、気にしない。要は、絶対パスでも相対パスでもOKであるということ。

記述形式は、[ -Xlinker -rpath -Xlinker xxx(パス) ]である。

ここで注意したいのは、共有ライブラリの名称をきちんと書くこと。
つまり、[ -fib ]ではなく[ libfib.so ]であること。

試した結果

 実際に実行可能形式を作成し、ldd コマンドで共有ライブラリへのパスが通っているのか見てみた。

 andre@andre-VirtualBox:~/work/liba/fib-1.0.0$ ll
 合計 40
 drwxrwxr-x 2 andre andre 4096 2012-09-09 16:17 ./
 drwxrwxr-x 3 andre andre 4096 2012-09-09 16:06 ../
 -rw-rw-r-- 1 andre andre  322 2012-09-09 16:04 Makefile
 -rwxrwxr-x 1 andre andre 8108 2012-09-09 16:05 fib*
 -rw-rw-r-- 1 andre andre  260 2012-09-09 15:36 fib.c
 -rwxrwxr-x 1 andre andre 7450 2012-09-09 16:05 libfib.so*
 -rw-rw-r-- 1 andre andre  130 2012-09-09 16:05 main.c
 -rw-rw-r-- 1 andre andre 2400 2012-09-09 16:05 main.o

andre@andre-VirtualBox:~/work/liba/fib-1.0.0$ ldd fib
	linux-gate.so.1 =>  (0x0034b000)
	libfib.so => ./libfib.so (0x00e03000)                          ★ 共有ライブラリが通っている
	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
	/lib/ld-linux.so.2 (0x00610000)
andre@andre-VirtualBox:~/work/liba/fib-1.0.0$ ./fib
fib(6):13                                                              ★ 実行できる
andre@andre-VirtualBox:~/work/liba/fib-1.0.0$ echo $LD_LIBRARY_PATH
                                                                       ★ LD_LIBRARY_PATH は空
andre@andre-VirtualBox:~/work/liba/fib-1.0.0$ mv libfib.so ../         ★ libfib.so の場所を変える
andre@andre-VirtualBox:~/work/liba/fib-1.0.0$ ldd fib
	linux-gate.so.1 =>  (0x003f5000)
	libfib.so => not found                                         ★ 共有ライブラリが通っていない
	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x007a6000)
	/lib/ld-linux.so.2 (0x0038a000)
andre@andre-VirtualBox:~/work/liba/fib-1.0.0$ ./fib
./fib: error while loading shared libraries: libfib.so: cannot open shared object file: No such file or directory
                                                                       ★ 共有ライブラリのロードに失敗している

Makefile

Makefile の中身だけ、重要なので、下記に示す。後のファイルはGithubからダウンロードしてください。

andre@andre-VirtualBox:~/work/liba/fib-1.0.0$ cat Makefile 
CC = gcc
CFLAGS=-g

all:main.o fibso
	$(CC) -Xlinker -rpath -Xlinker ./ -o fib main.o libfib.so
#	$(CC) -Xlinker -rpath -Xlinker /home/andre/work/liba/fib-1.0.0 -o fib main.o libfib.so

main.o:main.c
	$(CC) $(CFLAGS) -c main.c

fibso:fib.c
	$(CC) $(CFLAGS) -fPIC -shared -o libfib.so fib.c

clean:
	rm -f fib.o fib main.o