質問

どのようにして、バイナリはまだLinuxの(x86の)で通常通りに実行することができるように、GNU LDを使用して、特定の固定アドレスに(一部)の記号をリンクに行きますか?そここれらのシンボルへのアクセスもよいが、それらのアドレスが重要であることはありません。

たとえば、私は次のような構造を持っていると思います:

struct FooBar {
    Register32 field_1;
    Register32 field_2;
    //...
};

struct FooBar foobar;

私は0x76543210に対処するためにfoobarをリンクするが、標準ライブラリや通常のアプリケーションの残りの部分をリンクしたいと思います。その後、アプリケーションがfoobarにのアドレスを利用しますが、その背後に(おそらく存在しない)メモリを参照しません。

この要求の根拠は、この同じソースが2つのプラットフォーム上で使用することができることであるネイティブプラットフォームでは、Register32単にvolatile uint32_tことができるが、LinuxのRegister32に例えば定義uint32_tと同じサイズを持つC ++オブジェクトでありますリモートハードウェアの実際のアクセスを実行するオブジェクトのアドレスを使用してそのアドレス(およびデータ)との通信フレームワークへの要求を送信しますoperator=、。リンカは、このように構造体のRegister32フィールドが正しい「アドレス」を参照してください確実にするでしょう。

役に立ちましたか?

解決

--defsym symbol=addressを使用するlitbの提案は、仕事をしていますが、マップするために数十そのような事例を持っているとき少し面倒です。しかし、--just-symbols=symbolfileはただのトリックを行います。それはあるsymbolfileの構文を、見つけるために私にしばらく時間がかかった。

symbolname1 = address;
symbolname2 = address;
...

スペースはそうldレポートfile format not recognized; treating as linker scriptとして、必要としているように見える。

他のヒント

タグでそれを試してみてください
--defsym symbol=expression

この場合と同様ます:

gcc -Wl,--defsym,foobar=0x76543210 file.c

そして、あなたのコード内でextern宣言をfoobarにします。

extern struct FooBar foobar;

これは有望に見えます。しかし、それは(実際にはは、あなたが何をすべきか知っているあなたがをしない限り)、このようなことを行うのは悪い考えです。なぜあなたはそれが必要なのでしょうか?

私はあなたにホットチップをあげる... GNU LDは(システムLIBSが希望のアドレスを必要としないと仮定して)これを行うことができます。あなただけのコンパイラの自動生成1を使用する代わりに、独自のリンカスクリプトを構築する必要があります。 ldのmanページをお読みください。あなたもGLIBCを必要とする場合にも、ソフトウェアの複雑な部分のためのリンカスクリプトを構築することは容易ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top