ライブラリfoo.so
にリンクしたいmain.lo
があるとします。リンカーはfoo.so
を常に/foo/bar/lib.so
(固定パス、検索なし)にする必要がありますが、自分自身に書き込めない保護されたディレクトリである/foo/bar/
にはなく、lib.so
しかありません。共有ライブラリを意図した最終的な場所とは別の場所からリンクする
libをこのようにリンクすることはできますか?
編集:以下 は/tmp
代わりの/foo/bar
を使った簡単な例です。ビルドスクリプトを変更して動作させることはできますか?
main.cの
void foo();
int main(){
foo();
return 0;
}
foo.cの(複数ファイルのライブラリが過大評価されている)
#include <stdio.h>
void foo(){
puts("foo");
}
build.sh
#!/bin/sh
set -x
gcc -c -fPIC main.c -o main.lo
gcc -c -fPIC foo.c -o foo.lo
gcc -shared -o foo.so foo.lo
gcc -o pwd main.lo "$PWD/foo.so"
rm -f /tmp/foo.so
#? Link into dest, against /tmp/foo.so but use "$PWD/foo.so"
cp -a foo.so /tmp/foo.so
echo pwd:
./pwd #this works
echo dest:
./dest
@SouravGhoshこのようにして、指定されたrpathはバイナリでエンコードされ、後で本番ではバイナリは同じ場所でライブラリを探します。 – martinkunev
私は質問を誤解したと思う。コメントは削除されました。 –
「リンクパス」と「実行パス」は異なります。前の方は '-L/somewhere'と後ろの' -Wl、rpath// somwhere'と指定されています。 –