2011-11-16 32 views
2

我正嘗試使用gcc工具(使用RTOS)將C++應用程序移植到arm板上。 但我的靜態const構造函數沒有被調用。arm-none-eabi-g ++調用全局構造函數

簡單代碼:

class TestClass { 
public: 
    TestClass(); 
    TestClass(int m); 
    TestClass(const TestClass& other); 
    ~TestClass(); 
    int getM() const; 
    const TestClass& operator = (const TestClass& other); 
private: 
    int m;  
}; 

class TestInitClass { 
    static const TestClass TestClassObj; 
}; 

const TestClass TestInitClass::TestClassObj = TestClass(5); 

我提供的類定義。但是,當我把這種與TestInitClass :: TestClassObj.getM()返回0我

有多種問題:

  1. 我的靜態常量在.bss段中得到分配。它不是 在.ctors部分獲得(這可能是鏈接腳本問題?)
  2. 即使它得到.ctors節,我該怎麼稱呼這些構造
  3. 當我使用靜態C++庫我應該如何給他們打電話?

感謝

+2

爲什麼不直接寫'const TestClass TestInitClass :: TestClassObj(5);'? – Shahbaz

+0

你的'TestClass'構造函數和'getM'正確嗎? –

+0

@Shahbaz是的,即使我像你所說的那樣打電話,它也一樣。 – itdl

回答

0

要使用gcc和RTOS,你應該有「LD」的劇本, 描述那裏放什麼東西在內存中,例如它可以描述如何 處理全局構造函數的代碼。

關於調用構造函數。您可以查看eCos的源代碼:
http://ecos.sourceware.org/
對於arm架構,您可以查看packages/hal/arm/arch/current/src目錄下的vectors.S和hal_misc.c。 vector.S包含類似於:

bl  cyg_hal_invoke_constructors 

並在hal_mics.c中執行此函數。

+0

感謝eCos。我正在使用Toppers/Asp。目前內核是C庫。鏈接它不能爲全局構造函數生成.init_array。 (它工作得很好,只有問題是C++的靜態/全局構造函數)。另外奇怪的是.init_array中的條目不是4字節對齊的。 – itdl

+0

ecos也只是一個圖書館。這可以管理你的線程並實現C運行時和部分C++運行時。 – fghj