飞道的博客

嵌入式实时系统使用C++的准备工作.

254人阅读  评论(0)

都知道,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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场