実行可能パスを基準に共有オブジェクトをロードする

実行可能パスを基準に共有オブジェクトをロードする

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 に設定します。私の makefile は次のとおりです。

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'

関連情報