2010-04-15 33 views
1

有人能解釋我以下代碼的工作原理嗎?獲取內存部分信息

# if defined(__ELF__) 
# define __SECTION_FLAGS ", \"aw\" , @progbits" 
    /* writable flag needed for ld ".[cd]tors" sections bug workaround) */ 
# elif defined(__COFF__) 
# define __SECTION_FLAGS ", \"dr\"" 
    /* untested, may be writable flag needed */ 
# endif 

asm 
(
    ".section .ctors" __SECTION_FLAGS "\n" 
    ".globl __ctors_begin__\n" 
    "__ctors_begin__:\n" 
    ".previous\n" 
); 
asm /* ld ".[cd]tors" sections bug workaround */ 
(
    ".section .ctors0" __SECTION_FLAGS "\n" 
    ".globl __ctors0_begin__\n" 
    "__ctors0_begin__:\n" 
    ".previous\n" 
); 

同樣,我們也越來越__ctors_end____ctors0_end__和析構函數的位置也通過這種方式獲得。在一些ld錯誤解決方法之後,執行從__ctors_begin____ctors_end__指針指向的所有函數。我不知道彙編程序,這個代碼是不可能解釋的。

順便說一句:我知道從C調用C++構造函數/析構函數並不是一項安全或簡單的任務。

+0

對我來說,看起來這段代碼是創建節,沒有得到它們。它從何而來? – 2010-04-15 07:03:25

+0

如果這是部分創建,那麼這個新部分中的構造函數是如何放置的?我最初認爲這是從編譯器放置的傳統名稱的一部分中提取構造函數。 這是用C++編寫的Linux內核驅動程序的一部分。 – Basilevs 2010-04-15 07:13:45

回答

5

這實際上並不是由CPU執行的代碼,而是它被添加到目標文件的元數據中。它告訴鏈接器在存儲構造函數的最終可執行文件的同一節(=部分)中創建一些全局變量(上例中爲__ctors_begin__)(該節稱爲.ctors)。爲了使它工作,你只需要確保帶有「begin」變量的文件首先被鏈接,帶有「end」變量的文件最後被鏈接(但是也可以用__SECTION_FLAGS來控制它)。這給你你正在尋找的記憶範圍。至於「安全」:那麼,C++運行時並不神奇。不知何故,它必須知道如何在啓動時運行所有構造函數和析構函數,並且不會一直改變。所以對於編譯器的主要版本號來說,這應該是非常安全的。此外,你會很快知道它什麼時候破的:-)