GCC:调用静态对象的重写函数时的异常

时间:2015-08-10 11:33:00

标签: c++ gcc heap virtual

我正在使用GCC 3.4.3。该设备是基于ARM9 / ARM11的POS终端PAX S80。下一个测试代码编译正常,但在运行时调用重写函数时,我得到一个异常。

<system.webServer>
<security>
<requestFiltering>
<fileExtensions>
<add fileExtension=".cshtml" allowed="true" />
</fileExtensions>
</requestFiltering>
</security>
</system.webServer>

这意味着我不能使用静态对象(Derived2)。是的,我可以在代码中创建对象(派生),但它使代码变得复杂,因为我需要使用&#34; new&#34;来实例化对象。操作

有什么技巧可以避免这个问题吗?

顺便说一句,我在ARM926的Keil编译器上没有这个问题。不幸的是,我不能为这个设备选择编译器,只能选择GCC 3.4.3。

感谢您的任何想法!

1 个答案:

答案 0 :(得分:2)

原因是没有发生静态对象的初始化。所以,我决定手动完成。

首先,我将下一行添加到链接描述文件(source):

__ctors_start__ = .;
KEEP(SORT(*)(.ctors))
__ctors_end__ = .;

其次,我调用一个函数来调用静态对象的所有构造函数(source):

void do_ctor_calls() {

    typedef void (*call_ctor_t)(void);
    extern call_ctor_t __ctors_start__[];
    extern call_ctor_t __ctors_end__[];

    call_ctor_t * ctor_call = __ctors_start__;
    while ((ctor_call < __ctors_end__)&&((unsigned int)*ctor_call!=0xFFFFFFFF)&&((unsigned int)*ctor_call!=0x00000000)) {
        (*ctor_call)();
        ctor_call++;
    }
}

int main() {
    do_ctor_calls();

    /* My code here */

    return 0;
}

最终,被覆盖的函数起作用,静态对象像往常一样运行。 谢谢大家!