都知道,C++ operator new是语言特性而并非库函数,既然是语言特性,必须为编译器所支持,那么在嵌入式实时系统中,不存在C++ Runtime, operator new是如何和RTOS的堆内存分配挂接的呢?
因下面这段函数为例:
对应的cpp代码如下:
猜测符号_Znwj为operator new调用,用c++filt进行名字翻译后看是不是:
再进_Znwj内部看细节:
对应的源码实现:
delete/delete[], new/new[]的namemangling结果如下:
所以可以看到,虽然是语言特性支持operator new,但是由于嵌入式实时系统和Linux系统的本质差异,不存在同一的CPP runtime库,所以,和RTOS系统的对接必须由开发者自己去实现。
关于全局对象构造:
通过遍历__ctors_start__和__ctors_end__之间的指针,实现全局构造函数的调用。
对应链接脚本的符号定义:
__cxa_pure_virtual函数是在调用纯虚函数时调用的错误处理程序, 如果正在编写具有纯虚函数的C ++应用程序,则必须提供自己的__cxa_pure_virtual,它被安插在纯虚类的virtual function table表中,由于纯虚类不能实例化,纯虚函数不能被调用,所以实现为调试循环,或者打印出错信息。
结束!
转载:https://blog.csdn.net/tugouxp/article/details/115915490
查看评论