1

Solarisでは、次のようにいくつかのものをリンクします(Sun Studioを使用します。内部では、GNUではなくSolarisリンカーを使用します)。

CC -shared (other flags) -R'$ORIGIN/../lib/' -o /buildpath/lib/libmylib1.so
CC -shared (other flags) -R'$ORIGIN/../lib/' -lmylib1 -o /buildpath/lib/libmylib2.so
CC (various flags) -R'$ORIGIN/../lib/' -lmylib2 -o /buildpath/bin/somebinary

...そしてそれは最終的なバイナリをうまくリンクします。

LinuxでGNUを使用してこれを実行しようとするとld(ここでもコンパイラドライバーとしてSun Studioを使用)、共有オブジェクトは正常somebinaryにリンクされますが、libmylib1.soが見つからないためリンクに失敗します。

straceを介して3行目を実行すると、パスにリテラル(展開されていない)文字列が含まれているファイルを開こうとします$ORIGIN

私はこのトピックに触れている他の多くの質問に出くわしました。私が見た唯一の回避策は相対パスを使用することですが、これには固定の場所からバイナリを実行する必要があります`pwd`。つまり、バイナリの場所ではなく相対パスをチェックします。

$ORIGIN誰かが安全でない/安全でないことについての通常のコメントでチャイムを鳴らす前に-それは私たちの環境では問題ではありません、そして私はそれについてのコメントを聞くことを気にしません。

4

1 に答える 1

2

私はこの方法でそれをしなければならないようですが、私は-rpath-link旗に慣れていないので、これがどのような副作用をもたらす可能性があるかはまだわかりません:

CC -shared (other flags) -R'$ORIGIN/../lib/' -o /buildpath/lib/libmylib1.so
CC -shared (other flags) -R'$ORIGIN/../lib/' -lmylib1 -o /buildpath/lib/libmylib2.so
CC (various flags) -R'$ORIGIN/../lib/' -Wl,-rpath-link,/buildpath/lib/ -lmylib2 -o /buildpath/bin/somebinary

私が行ったいくつかのテストで、私は次のことを学びました。

  • $ORIGINフラグ内であろうとフラグ ldであろうと、GNUによってまったく拡張されません-rpath-rpath-link
    • ld.soそれをうまく拡張します
  • -rpath-link、、、などの前-rpathに検索される最初のパスのセットです。DT_*PATHLD_*_PATH
于 2012-07-03T19:17:35.523 に答える