から.relocを使用すると、これは私がAArch64に直面してる問題のカットダウン版です:私はセクションに、いくつかのデータをダンプし続けるこのマクロをしましたアセンブリ
。
#define GEN_DATA(_type) \ .pushsection .mydata_##_type, "aw"; \ .ifndef start; \ start:; \ .endif; \ .word 1; \ .reloc end_loc, R_AARCH64_ABS64, .; \ .popsection
私は最終的に、このような構造では似たタイプの開始と終了をキャプチャしたかった:
.pushsection .head, "aw" .quad start end_loc: .quad 0 .popsection
セクションでは、start
記号で始まる、私は追跡することができます。私はGEN_DATA()
の呼び出しがビルドにどれくらいあるかを事前に知らないので、end
を定義することはできません。私はどのくらい多くの部分が使用されるかわからないので、ガードシンボルスクリプトを置くことはできません。したがって、私はend_loc
の再配置エントリを残すことにしました。その結果、リンカは最終的にセクション全体が終了する場所に修正されます。はい、同じend_loc
の複数の再配置エントリがありますが、それらは絶対的な再配置であるため、競合しないと考えます。
私は勘違いしましたが、最後のバイナリでは、end_loc
が間違ったアドレスで修正されています。私はそれを複数の再配置エントリに責めますが、奇妙なことは、ダミーの余分な再配置エントリも追加すればすべてがOKです。
#define GEN_DATA(_type) \ .pushsection .mydata_##_type, "aw"; \ .ifndef start; \ start:; \ .endif; \ .word 1; \ .reloc end_loc, R_AARCH64_ABS64, .; \ .reloc dummy_loc, R_AARCH64_ABS64, .; \ .popsection
と::
.pushsection .head, "aw" .quad start end_loc: .quad 0 dummy_loc: .quad 0 .popsection
だから私は思ったんだけど:私はするために、上記の構造を変更
なぜ
end_loc
が誤ってアップ固定なっていますか?複数の絶対再配置エントリがあれば何が問題になりますか?リンカーが順番にそれらを通過すると期待されていない、最後のものが有効になりますか?ダミーの再配置を追加するだけの理由は何ですか?
基本的には何が起こっているのですか?
最後に、試してみることのできる方法がありますか?
EDIT:サンプルコードをGit repositoryにプッシュしました。逆アセンブリを表示するにはmake
とmake broken=1
を使用してください。 Linaro AArch64 tool chainが$PATH
に必要です。