実行可能形式そのものに共有ライブラリパスを指定させる
はじめに
共有ライブラリの場所は、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