2016-04-06 9 views
2

ライブラリ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 
+0

@SouravGhoshこのようにして、指定されたrpathはバイナリでエンコードされ、後で本番ではバイナリは同じ場所でライブラリを探します。 – martinkunev

+0

私は質問を誤解したと思う。コメントは削除されました。 –

+0

「リンクパス」と「実行パス」は異なります。前の方は '-L/somewhere'と後ろの' -Wl、rpath// somwhere'と指定されています。 –

答えて

3

2つのオプションが必要です。

最初に-Lオプションを使用して、ライブラリが現時点の実際の場所にあるかどうかをリンカに伝える必要があります。

次に、-rpathリンカーオプションを使用して、最終的な場所を指定する必要があります。残念ながら、これはlinker-specific optionです。つまり、GCCフロントエンドプログラムに-Wlオプションを使用する必要があります。

ので、コマンドは2つのパスが、もちろん同じことができることを

$ gcc object.o files.o -o target \ 
    -L/current/path/to/library -Wl,-rpath,/final/path/to/library -llibrary 

ノートのようなものになるはずです。

+1

これは近いですが、IMHOではなく、libで始まるライブラリの名前に依存しています。むしろ、* .soファイルへの任意のパスをハードコードしたいと思います。 – PSkocik

関連する問題