5

.cfi_remember_state私はどのように正確に実装されているのだろうかと思っていました。私はそれが疑似演算であることを知っているので、アセンブル時にいくつかの命令に変換されると思います。それを実装するためにどのような正確な指示が使用されているかに興味があります。私はそれを理解するために多くの方法を試しました。すなわち:

  • GAS のソース コードを読みます。しかし、十分に役立つものを見つけることができませんでした。
  • GAS のドキュメントを読んでください。しかし、.cfi_remember_stateエントリは単なる冗談です (文字通り)。
  • gcc が C コードから asm を生成し、疑似演算を「拡張」する gcc スイッチを見つけようとしました。x86 / x86-64 用のそのようなスイッチが見つかりませんでした。(ところで、誰かがそのようなスイッチが存在すると仮定して、私にそのようなスイッチを教えてくれたらうれしいです。)
  • SOでGoogle-fu &&を検索しても、何も役に立ちませんでした。

私が考えている他の唯一の解決策は、アセンブルされた実行可能ファイルのバイナリを読み取り、指示を推測することです。とはいえ、そんな面倒な作業は避けたいものです。x86および/またはx86-64で正確にどのように実装されているか、知っている方は教えていただけますか? たぶん、その情報がどこでどのように取得されたかを共有することに加えて、必要に応じて他の疑似操作を確認できますか?

4

1 に答える 1

3

このディレクティブは DWARF 情報の一部です (実際には DW_CFA_remember_state ディレクティブを発行するだけです)。DWARF3 標準からの抜粋:

DW_CFA_remember_state 命令はオペランドを取りません。必要なアクションは、すべてのレジスターの一連のルールを暗黙的なスタックにプッシュすることです。

objdump を使用して DWARF 情報を操作できます。単純な void アセンブラー ファイルから始めましょう。

  .text
.globl main
  .type main, @function
main:
.LFB0:
.cfi_startproc
#.cfi_remember_state
.cfi_endproc
.LFE0:
  .size main, .-main

でコンパイルしますgcc cfirem.s -c -o cfirem.o

生成された DWARF セクションを逆アセンブルすると、次のobjdump --dwarf cfirem.o ようになります。

00000018 00000014 0000001c FDE cie=00000000 pc=00000000..00000000
  DW_CFA_nop
  DW_CFA_nop
  ...

.cfi_remember_state のコメントを外すと、代わりに次のように表示されます。

00000018 00000014 0000001c FDE cie=00000000 pc=00000000..00000000
  DW_CFA_remember_state
  DW_CFA_nop
  DW_CFA_nop
  ...

したがって、実際にはアセンブラー命令で変換されているわけではありません(サンプルobjdump -dにアセンブラー命令がまったくないことを確認してください)。これは、GDB のようなデバッガーが変数の場所、スタック情報などを処理するときに使用される DWARF 疑似命令に変換されます。

于 2013-01-29T12:20:25.907 に答える