10

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_toperator=Register32

4

3 に答える 3

20

使用する litb による提案は機能し--defsym symbol=addressますが、マッピングするインスタンスが数十ある場合は少し面倒です。ただし、--just-symbols=symbolfileトリックは行います。symbolfileの構文を見つけるのにしばらく時間がかかりました。

symbolname1 = address;
symbolname2 = address;
...

そうでない場合は、スペースが必要なようldですfile format not recognized; treating as linker script

于 2009-01-30T14:19:08.257 に答える