2

codesourcery g++ lite(gcc4.7.2バージョンに基づく)を使用してstm32(Cortex-m3)用にプログラミングしています。そして、実行可能ファイルを動的にロードする必要があります。
1. elf パーサーが必要な再配置可能な elf 。
2. グローバル オフセット レジスタを備えた位置独立コード (PIC)

私はグローバル オフセット レジスタを使用した PIC を好みます。これは、実装が簡単で、エルフやエルフ ライブラリに慣れていないためです。また、いくつかのツールを使用して、elf ファイルから .bin ファイルを簡単に生成できます。

「-msingle-pic-base -fpic」コンパイル オプションと「-pie」リンク オプションを使用してプログラムをビルドしようとしましたが、リンク エラーが発生しました。

...path...ld.exe: ...path...thumb2\libstdc++.a(pure.o): 再配置 R_ARM_THM_MOVW_ABS_NC に対する「ローカル シンボル」は、共有オブジェクトを作成するときに使用できません。-fPIC で再コンパイル

エラーメッセージがよくわかりません。デフォルトの標準の c/c++ ライブラリは私のオプションに対応していないようで、ライブラリのソースを入手して自分の目的のために再構築する必要があります。 1.位置に依存しない実行可能ファイルの操作方法に関する有用な情報/リンクを誰かが提供してくれますか
? 2. -msingle-pic-base オプションを使用すると、GOT および ld スクリプトをあまり気にする必要がなくなりますよね? 注: 「-pie」リンク オプションがなくても、プログラムをビルドできます。しかし、C++ 仮想関数を呼び出すと、プログラムが失敗します (IDE(keil) のシミュレーターを使用してプログラムをデバッグしている場合)。何が起こっているのか、何が欠けているのかわかりません。





-------------------------------------------------- --------------------
-- 20130314 追加

  1. -msingle-pic-baseオプションを使用すると、GOT と ld スクリプトをあまり気にする必要がなくなりますね。

私の実験から、レジスタ (私のプログラムでは r9 が使用されています) は got.plt セクションの先頭を指す必要があります。「-pie」オプションを削除すると、リンクが成功し (r9 が適切に設定されている場合)、c++ 仮想関数が正常に呼び出されます。ただし、現在の標準ライブラリが位置に依存しないようにする「-pie」オプションは依然として重要だと思います。誰かが私のためにこれを説明できますか?



-------------------------------------------------- --------------------
-- 20130315
を追加 ARM の Web サイトから ABI に関するドキュメントを参照しました。しかし、彼らは特定のプラットフォームをターゲットにしていないため、ほとんど役に立ちませんでした。EABI の概念があるようですが (sourcery の arm-none-eabi エディションを使用しています)、arm の Web サイトから「EABI」に関するドキュメントを見つけることができませんでした。sourcery と gcc からこのトピックに関するドキュメントを見つけることもできません。PICの実装は複数ありますが、none-eabiの場合に使用するソースリーg ++はどれですか? 「-msingle-pic-base」、「-fpie」、「-pie」オプションの動作は、あまり文書化されていないと思います

逆アセンブリ コードから、「-msingle-pic-base」を指定すると、r9 は「.got」セクションのベース アドレスを指す必要があり、.got セクションのポインターは絶対ポインターであることがわかりました。変数のアドレス指定は、記事の説明に似ています:共有ライブラリの位置独立コード (PIC)。そのため、ロード時に「.got」セクションを変更する必要があります。私のプログラムで使用されている「.got.plt」セクションが何であるかわかりません。関数呼び出しは PC 相対アドレッシングを使用しているようです。
「-pie」でビルドする方法や「-fpic」でコンパイルされた標準ライブラリをリンクする方法は、私にとってまだ問題です


4

2 に答える 2