プロジェクト GNU Binutils (GNU リンカ (ld) を含む) は、この動作の変化の起源ではなく、Debian (2016)1 と Gentoo (2013!)2 です。
2013 年 1 月の Mike Frysinger による gentoo のコミットによると:
<ブロック引用>「「新しい」dtags オプションは 14 年以上前から存在しているため、Linux および GNU ターゲットではデフォルトで有効にします。」
RUNPATH と RPATH には「文書化されていない動作の違い」があるため、この変更はあまり受け入れられていません 3、4、5...驚くべきことに、この変更は現在 Debian 安定版に適用されています。
問題は、RUNPATH を使用すると、予測できない問題が発生することです...しかし、主に機能します。ウィキペディアから :
<ブロック引用>ld 動的リンカーは、DT_RUNPATH の場所で推移的な依存関係を検索しません。 、DT_RPATH とは異なります。
<ブロック引用>
古い動作を強制する方法はありますか?
はい。このオプション -Wl,--disable-new-dtags
を使用できます 新しいに伝える old を使用するリンカー 動作、つまり RPATH。
古いバージョンのリンカーに新しい出力 (RPATH ではなく RUNPATH など) を生成するように指示することはできますか?
はい。 -Wl,--enable-new-dtags
を使用 古いに伝える new を使用するリンカー 動作、つまり RUNPATH.
readelf
で実行可能ファイルを検証しました これらの 2 つのオプションは、ELF 動的セクションに何が書き込まれるかを制御するようです。この問題は、新しいバージョンのデフォルトの変更が原因だと思いますが、興味深いことに、ld
のマニュアル ページは それはまだ同じであるべきであることを示唆しています:
--enable-new-dtags
--disable-new-dtags
このリンカーは、ELF で新しい動的タグを作成できます。しかし、古い ELF システムはそれらを理解できないかもしれません。 --enable-new-dtags を指定すると、必要に応じて新しい動的タグが作成され、古い動的タグは省略されます。 --disable-new-dtags を指定すると、新しい動的タグは作成されません。 デフォルトでは、新しいダイナミック タグは作成されません。 これらのオプションは ELF システムでのみ利用可能であることに注意してください。