Linux(x86)でバイナリを通常どおり実行できるように、GNU ldを使用して(一部の)シンボルを特定の固定アドレスにリンクするにはどうすればよいですか?これらのシンボルへのアクセスはありませんが、アドレスは重要です。
たとえば、次の構造があります。
struct FooBar {
Register32 field_1;
Register32 field_2;
//...
};
struct FooBar foobar;
foobar
アドレス 0x76543210にリンクしたいのですが、標準ライブラリと残りのアプリケーションは通常どおりリンクします。アプリケーションは foobar のアドレスを使用しますが、その背後にある (存在しない可能性がある) メモリを参照しません。
この要求の論理的根拠は、この同じソースを 2 つのプラットフォームで使用できるということです。ネイティブ プラットフォームでRegister32
は、単に avolatile uint32_t
にすることができますが、Linux では、 eg を定義Register32
する a と同じサイズの C++ オブジェクトであり、アドレスを使用します。オブジェクトのアドレス (およびデータ) を使用して通信フレームワークに要求を送信し、リモート ハードウェアで実際のアクセスを実行します。したがって、リンカーは、構造体のフィールドが正しい「アドレス」を参照するようにします。uint32_t
operator=
Register32