Linux上の固定アドレスにシンボルのリンク
質問
どのようにして、バイナリはまだ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を必要とする場合にも、ソフトウェアの複雑な部分のためのリンカスクリプトを構築することは容易ではありません。