2010-06-02 94 views
1

我正在編寫C++代碼以在獨立環境(基本上是ARM板)中運行。除了我遇到了一個絆腳石 - 全局靜態構造函數之外,它一直進展順利。獨立式ARM C++代碼 - 空.ctor部分

我的理解.ctors部分包含每個靜態構造函數的地址列表,我的代碼只需迭代此列表並在每個函數調用時調用它。但是,我發現我的二進制文件中的這部分實際上完全是空的!谷歌指出使用「.init_array」而不是「.ctors」(一個EABI的東西),但這並沒有改變任何東西。

任何想法,爲什麼我的靜態構造函數不存在?相關鏈接腳本和objdump的輸出如下:

.ctors : 
{ 
    . = ALIGN(4096); 
    start_ctors = .; 
    *(.init_array); 
    *(.ctors); 
    end_ctors = .; 
} 

.dtors : 
{ 
    . = ALIGN(4096); 
    start_dtors = .; 
    *(.fini_array); 
    *(.dtors); 
    end_dtors = .; 
} 

-

2 .ctors  00001000 8014c000 8014c000 00054000 2**2 
       CONTENTS, ALLOC, LOAD, DATA 
<snip> 
8014d000 g  O .ctors 00000004 start_ctors 
<snip> 
8014d000 g  O .ctors 00000004 end_ctors 

我使用的是ARM的小精靈有針對性的GCC編譯器(4.4.1)。

更新:輸出二進制也充滿__static_initialization_and_destruction_0符號,這是我從未見過。

更新2:這是從一個編譯的對象文件的objdump的(其被鏈接到主二進制)的摘錄與.ctors部完好:

21 .ctors  00000004 00000000 00000000 00000864 2**2 
       CONTENTS, ALLOC, LOAD, RELOC, DATA 

RELOCATION RECORDS FOR [.ctors]: 
OFFSET TYPE    VALUE 
00000000 R_ARM_ABS32  _GLOBAL__I__ZN9SomeStaticClass10m_InstanceE 
+3

好吧。只是想說明一個明顯的問題。你實際上是否有任何靜態類實例? – 2010-06-02 12:20:06

+0

我當然可以 - 至少有兩個應該在ARM的最終二進制文件中。 – 2010-06-02 21:31:59

+0

問題更新了一點信息。 – 2010-06-02 21:59:46

回答

1

這結束了被構建系統問題 - 鏈接器腳本在鏈接器命令行中被多次指定,從而以某種方式導致g ++窒息。