トークンデストラクタ関数を登録します
static void cleanup __attribute__ ((destructor));
この関数はデバッグ メッセージを出力するだけです。トークン プログラムは問題なく実行されます (main() は別のメッセージを出力するだけです。トークン関数は終了時に出力します)。
でファイルを見ると
nm ./a.out,
そうですか:
08049f10 d __DTOR_END__
08049f0c d __DTOR_LIST__
ただし、トークン デストラクタ関数のアドレスは0x08049f10
、0 を含むアドレスである必要があります。これは、デストラクタ リストの末尾を示します。次を使用して確認できます。
objdump -s ./a.out
では、この場所に期待されるとおり、 が0x08049f0c
見えます。0xffffffff
私の理解では、elf ファイルに表示される内容は、デストラクタが登録されていないことを意味します。しかし、それは1つで実行されます。
誰かが説明できれば、私は感謝します。これは、悪意のあるデストラクタの挿入を防ぐためのセキュリティ スイートの一部ですか? コンパイラはデストラクタのアドレスをどのように追跡しますか?
私のシステム:
- Ubuntu 12.04。
- elf32-i386
- カーネル: 3.2.0-30-generic-pae
- gcc バージョン: 4.6.3