私はどこで呼び出すかに関係なく、相対ディレクトリから共有オブジェクトをロードするためのCアプリケーションを取得しようとしています。これまでは、呼び出し時に実行可能ファイルと同じディレクトリにある場合にのみ機能します。
~/prog$ ./my_program
Success
~/prog$ cd ..
~$ ./prog/my_program
./prog/my_program: error while loading shared libraries: libs/libmysharedobject.so: cannot open shared object file: No such file or directory
上記の出力からわかるように、共有オブジェクトはこの~/prog/libs/
ディレクトリに保存されます。関連するgcc呼び出しは次のとおりです。
gcc -std=c99 -ggdb -Wall -pedantic -Isrc
-fPIC -shared -Wl,-soname,libs/libmysharedogbject.so
-o libs/libmysharedobject.so libs/mysharedobject.c
[...]
gcc [CFLAGS omitted] -o my_program main.c
build/src/my_program.o build/src/common.o
-lm -Llibs -lmysharedobject
これは出力の上部ですreadelf -d my_program
。
Dynamic section at offset 0x6660 contains 26 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libs/libmysharedobject.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
追加しようとしましたが、結果に-Wl,-z,origin,-rpath='$ORIGIN'
次の行が表示されました。readelf
0x000000000000000f (RPATH) Library rpath: [$ORIGIN]
[...]
0x000000006ffffffb (FLAGS_1) Flags: ORIGIN
しかし、これは私の問題を解決していないようです。また、rpath
と で設定しようとしましたが、無駄はありません。 (更新:何も動作しません。絶対パスに拡張されるので驚きました。)$ORIGIN/libs
.
./libs
$(CURDIR)
LD_LIBRARY_PATH
実行可能ファイルが呼び出されたディレクトリに関係なく、好ましくはエンドユーザーが毎回設定する必要なく共有オブジェクトを見つける方法はありますか?それともLinuxがサポートしていないことをしたいですか?
答え1
rpathを$ ORIGIN / libsに設定し、sonameをlibs / libsharedobjectの代わりにlibsharedobjectに設定します。私のメイクファイルは次のとおりです。
all: my_program
libs/libmysharedobject.so: Makefile success.c
gcc -fPIC -shared -Wl,-soname,libmysharedobject.so \
-o libs/libmysharedobject.so success.c
my_program: Makefile libs/libmysharedobject.so
gcc -o my_program main.c -Llibs -lmysharedobject -Wl,-R,'$$ORIGIN/libs'