GNU/Linux >> Linux の 問題 >  >> Linux

GCC/LD で RPATH と RUNPATH を設定するには?

プロジェクト 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 システムでのみ利用可能であることに注意してください。


Linux
  1. RsyslogとMySQLを使用してLogAnalyzerをセットアップする方法

  2. エポックフォーマットで日付を設定する方法は?

  3. Ubuntu20.04でMPMイベントとPHP-FPMを使用してApacheを設定する方法

  1. Linuxで動的ライブラリと静的ライブラリを処理する方法

  2. Linuxでタイムゾーンを設定してサーバー時間をNTPと同期する方法

  3. zram と swap を正しくセットアップする方法

  1. curlを使用してユーザーエージェントを設定または変更する方法

  2. Rsyncでファイルとディレクトリを除外する方法

  3. Cでアトミックインクリメントとフェッチを行う方法は?