2

トークンデストラクタ関数を登録します

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
4

1 に答える 1

0

DTOR_LISTは、デストラクターのテーブルの開始です。それがどのセクションにあるかを見てください(おそらく.dtors):

~> objdump -t test | grep DTOR_LIST
0000000000600728 l     O .dtors 0000000000000000              __DTOR_LIST__

次に、そのセクションを readelf (または何でも) でダンプします。

~> readelf --hex-dump=.dtors test

Hex dump of section '.dtors':
  0x00600728 ffffffff ffffffff 1c054000 00000000 ..........@.....
  0x00600738 00000000 00000000                   ........

私のテストケースには、おそらく-1、実際のポインター、そしてゼロ終端がいくつか含まれています。

于 2014-09-10T13:01:31.110 に答える