質問
クライアントアーキテクチャ用のGNUアセンブラーのポートを開発しています。 今直面している問題は:
命令のイミディエートオペランドが複数の再配置可能シンボルを含む式である場合、elf形式の出力ファイルでどのように処理されますか。そのような場合に生成される再配置情報はどうなりますか?
例:
j label1 + label2
label1とlabel2は再配置可能セクションで定義されていますが、同じセクションでも異なる再配置可能セクションでもかまいません。
解決
ELFはそれ自体、命令については知りません。命令内のシンボルオフセットの特定のエンコーディングについて認識しています。アセンブラーでは、2つの再配置レコードを出力し、それぞれに対応する[address、type、symbol]トリプレットを出力して、命令のその部分に適切にパッチを適用する必要があります。リンカは、これらの2つのレコードが同じ命令を指していることを必ずしも認識していません。
ELF再配置タイプは完全にCPU依存(または、より正確にはISA依存)であるため、新しいアーキテクチャに必要な再配置を自由に定義できます。
命令エンコーディングの詳細がなければ、より具体的にするのは困難です。
他のヒント
ELFについてはジャックを、リンクについてはもう少しだけ知っていますが...
各オペランドは、1つしかない場合と同じように処理されると予想されます。
OTOHの問題は、j
の形式がラベルの場所に応じて変わることです。もしそうなら、リンカーはその種のことをするのに十分スマートではないので、あなたは沈んでいると思います(ADAビルドシステムIIRCはほとんどよりも賢いかもしれませんので、あなたはそれを見るかもしれません)
再配置が必要なすべての命令について、アドレスごとに1つのエントリが必要です。
Objdumpは実行可能ファイルまたはオブジェクトファイルの再配置テーブルを表示できる可能性がありますが、フラグがわからないのです。
私の提案は、クライアントアーチと同じようなことを行うx86(または他のCISC)命令を掘り下げ、それをアセンブル/リンクするときに生成される再配置を確認することです。