3

私のプラットフォームは、GNU ビルド ツールチェーン (GCC など) を使用するバニラ (非組み込み) x86-64 Linux であると仮定します。

で指定する$ORIGINにはRPATH、リンカー オプションについて知っています-Wl,-rpath,'\$\$ORIGIN'

今日、別のオプションを発見しました: -Wl,-z,origin.

を使用するときは常に含める必要がありますか?-Wl,-z,origin-Wl,-rpath,'\$\$ORIGIN'

公式の GNU ld docs、言う:

オブジェクトに $ORIGIN が含まれている可能性があることを示します。

関連するが異なる: https://stackoverflow.com/questions/33853271/what-are-the-recommended-gnu-linker-options-to-specify-rpath

4

1 に答える 1

9

リンカーオプションについて知っています:-Wl,-rpath,'\$\$ORIGIN'

あなたは間違っていることを知っています:上記のオプションはあなたが望むことをしません。欲しいオプションは-Wl,-rpath='$ORIGIN'. 違い:

echo "int main() { }" | gcc -xc - -Wl,-rpath,'\$\$ORIGIN' &&
readelf -d a.out | grep ORIGIN

 0x000000000000000f (RPATH)              Library rpath: [\$\$ORIGIN]

echo "int main() { }" | gcc -xc - -Wl,-rpath='$ORIGIN' &&
readelf -d a.out | grep ORIGIN

 0x000000000000000f (RPATH)              Library rpath: [$ORIGIN]

常に含める必要がありますか-Wl,-z,origin

動的エントリの-Wl,-z,originセットDF_ORIGINFLAGS_1

現在の GLIBC トランクの時点では、そのフラグの値を確認するものは何もないため、ターゲットにする場合(GLIBCほとんどの Linux プログラムはそうします)、答えは次のとおりです。使用するかどうかはまったく問題ではありませ-z originん。

答えは、他の libc 実装では異なる場合があります。ただし、Solaris libc (全体のソース$ORIGIN) も を設定する必要がないようにDF_ORIGIN思われるため、おそらくこれを完全に無視するのが安全な方法です。

于 2015-11-23T00:47:29.203 に答える