我正在使用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。
感谢您的任何想法!
答案 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;
}
最终,被覆盖的函数起作用,静态对象像往常一样运行。 谢谢大家!