2013-11-04 54 views
2

我註冊elf文件中的析構函數的位置:不應該在哪裏?

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文件中看到的意思是沒有註冊析構函數。但它是用一個執行的。

如果有人能解釋,我會很感激。安全套件的這部分是爲了防止插入惡意析構函數嗎?編譯器如何跟蹤析構函數的地址?

我的系統:

  • 的Ubuntu 12.04。
  • ELF32-I386
  • 內核:3.2.0-30-仿製PAE
  • gcc版本:4.6.3
+0

我不知道如何解決佈局問題:粗體面的屬性(類似於nm p/o中的後面)實際上是2個前導和尾部_的屬性。 – gnometorule

+0

是的,那裏的格式看起來很奇怪。它可能是一些不可打印的字符? (在此期間,我試圖修復它,看起來是否正確?) –

+0

完美!非常感謝。我注意到之前從我的iPhone上提交的SO生成不正確的佈局。也許就是這樣。 – gnometorule

回答

0

DTOR_LIST是desctructors的表開始。看看它是(可能.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 [email protected] 
    0x00600738 00000000 00000000     ........ 

這在我的測試案例中包含了幾個可能 - 1,一個真正的指針,然後零終止。

相關問題